å ã æãããã«é¦è¨³ãåºãããã¼ã¿æåããã°ã©ãã³ã°ããèªãã ããã¡ããã¡ããã£ããè¨ãã¨ãªãã¸ã§ã¯ãæåã«ãããããã¼ã¿ã¨æ¯èãã®ä¸ä½åãã¨ãããã°ããææ¾ããããã®ã§ããã¡ããã¡ããã£ããè¦ãã¨Cè¨èªçãªæ§é åããã°ã©ãã³ã°ã®ä¸çã«å帰ããããã«ãè¦ãããã¨ãããä¸éçã«ã¯è²ã ãªè©ä¾¡ããããããã
ã¤ãã¥ã¼ã¿ããªãã£ãè¯ããã¿ãããªè©±ã¯éã æ¿ç¥ãªã®ã§é©å®é£ã°ããªããèªãã ãã¾ããlodashã¾ããã®è©±ã¯åãªãã©ã¤ãã©ãªç´¹ä»ã§ãããç¹çãããã¨ããªãã®ã§é£ã°ããã
ããããæãã§è¨åããã¦ãã
èªåãªãã«èªãã§æã£ããã¨ãã¾ã¨ãããé¢ç½ãæ¬ã ã£ãããèªåã®ææ³ã«ãè¿ãããã®ããããåã¯æ®æ®µScalaãTSãæ¸ãã¦ããã®ã§ããã®è¦³ç¹ããã®ææ³ãå¤ãã§ããOOPã®æ´å²ã«è©³ããããã§ã¯ãªãã®ã§ãä¸è¶³ããã£ãããã¿ã¾ããã
OOP以åã®ä¸çã¨ã®å·®ç°
DOPã¯ãªãã¸ã§ã¯ããåå²ãã¦ãã¼ã¿ã¨æ¯ãèãã®èæé¢ä¿ãç ´å£ããã¨ãããããã¨ä¸è¦ãOOP以åã®æç¶ãåçãæ§é åããã°ã©ãã³ã°ã®ä¸çã«éæ»ãããã ãã§ã¯ãã¨ããæè¦ã«ãªãã¨æãã
ããããDOPã§ã¯ï¼æã«è§¦ãããã¦ããªããï¼æ§é åããã°ã©ãã³ã°çä¸ç観ã¨ã¯ããã¤ãéãç¹ãããããããéè¦ãªç¹ã¨ãªã£ã¦ããã
- ã¤ãã¥ã¼ã¿ãã«ãªãã¼ã¿æ§é ã®æ¡ç¨
- ããªãã¼ã·ã§ã³ã¨ãªãã¸ã§ã¯ãè¨æ³ã®çºå±
- 楽観çãªç¶æ 管ç
ã¤ãã¥ã¼ã¿ãã«ãªãã¼ã¿æ§é ã®æ¡ç¨
ï¼èªåã¯ãã¾ãééãã¦ããªãã®ã§ååæ³åã«ãªã£ã¦ãã¾ããï¼æ§é åããã°ã©ãã³ã°ã®æ代ã«ããã¦ã¯ãã¥ã¼ã¿ãã«ãªãã¼ã¿æ§é ãåºæ¬ã§ãã£ã¦ãã¤ãã¥ã¼ã¿ãã«ãªãã¼ã¿æ§é ã使ããããã¨ã¯ãã¾ããªãã£ãã
ä»æ¹ãDOPã§ã¯ã¤ãã¥ã¼ã¿ãã«ãªãã¼ã¿æ§é ãç¹ã«æ°¸ç¶ãã¼ã¿æ§é ï¼ã¤ãã¥ã¼ã¿ãã«ã§ãããªãããé«å¹çã«ãã¼ã¿ã使ãåãæ§é ï¼ãç©æ¥µçã«æ¡ç¨ãããJavaScriptã¯ããèªä½ã¤ãã¥ã¼ã¿ãã«ãªãã¼ã¿æ§é ããã¤ãã£ãã«æãã¦ããããã§ã¯ãªãããå種ã®ã©ã¤ãã©ãªãå©ç¨ãã¦ãã¼ã¿æ§é ãã¡ã½ãããã©ãããããã¨ã§ã¤ãã¥ã¼ã¿ãã«æ§ã確ä¿ããã¨ããææ³ããã®æ¬ã§ã¯ç´¹ä»ãã¦ããã
ã¤ãã¥ã¼ã¿ãã«æ§ãæä¾ããå®å ¨æ§ãããã¼ã¿ã¨æ¯ãèããç¡çãªãåé¢ããããã¨ãã§ãã¦ããå°è±¡ã ãããããã¥ã¼ã¿ãã«ã«è¡ããã¦ããã¨ããããåãåç §ã示ããã®ãåãã§ããä¿è¨¼ã¯ã©ãã«ãç¡ããªãããã£ã¨ããéã«ãã¼ã¿ã¯æ» è¶è¦è¶ã«ãªãã ãããããã¯å¾æ¥ã®æ§é åããã°ã©ãã³ã°ã¨ã¯æ±ºå®çã«ç°ãªãç¹ã ã
ã¡ãªã¿ã«åããã使ã£ã¦ããScalaã¯Vector
ã¨ãã¦æ°¸ç¶ãã¼ã¿æ§é ãè¨èªæ©è½ã®ä¸ã«æ¨æºçã«çµã¿è¾¼ã¾ãã¦ãããä½ãããã«ä½¿ããã¨ãã§ãã:
val xs: Vector[Int] = Vector.fill(100000000)(42) // 1åè¦ç´ ã®Vectorãä½æãã xs.updated(50000000, 666) // æ°¸ç¶ãã¼ã¿æ§é ã§æ§ç¯ããã¦ãããããè¦ç´ ã®ç½®æã¯ä¸ç¬ã§å®è¡ããã xs // xsèªä½ã¯å¤åããªã
ããªãã¼ã·ã§ã³ã¨ãªãã¸ã§ã¯ãè¨æ³ã®çºå±
DOPã¯ãã¼ã¿æ§é ãç¶æ¿é¢ä¿ãã解æ¾ãããã®è¡çããèªç±ã«ãããããæ¸ãã¨é©å½çãªæãã§ãããDOPã¯æ§é çé¨ååãç´æ¥ä½¿ãããã§ã¯ãªãã®ã§ããå ¬ç§°ånominal typingããã®è±å´ãã¨è¨ã£ãã»ããé©åãããããªããä¸è¬çãªOOPã§ã¯ç¶æ¿é¢ä¿ãç¨ããå®è£ ã¨ãã¼ã¿ã®å ±æãå¤ç¨ãããã¡ã ããDOPã§ã¯ãããã®ç¶æ¿ã«ããåé¢ä¿ã¯ä¸ç¨®ã®ãããã¿ã¨è¦ã¦æé¤ããããã®ä»£ããã«è¾æ¸æ§é ã«å帰ãããã¼ã¿ã®ç¹å®ã®ããããã£ã«ï¼å®å ¨æ§ãç ç²ã«ãã¦ï¼ç´æ¥ã¢ã¯ã»ã¹ãããã¨ãããè¦ããã«ãæ®æ®µãããããJSONã«ã¢ã¯ã»ã¹ãããããªæè¦ã§ãã¼ã¿ãåãæ±ãã
å½ç¶ãªããè¾æ¸æ§é ã«å帰ãã以ä¸å®å ¨æ§ãããªãæããããå®è¡æã«ãã£ã¼ã«ããåå¨ããªãã£ãããæå³ããªãå¤ãå ¥ã£ã¦ãããããããããããããã ããã®æ¬ã«ããã°ãJSON Schemaãå©ç¨ãã¦ãã¡ã¤ã³ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã®å¢çé¢ã§ããªãã¼ã·ã§ã³ãè¡ããã¨ã§ãã®ãããªåé¡ã¯çºçããªããªããã¨ããç«ã¦ä»ãã ã£ãããå人çã«ã¯æ¥½è¦³çãããã®ã§ã¯ãªããã¨æããã
å人çã«ã¯ãTypeScriptãªã©ã®è«¸è¨èªãæ¡ç¨ãã¦ããæ§é çé¨ååãæ¡ç¨ããã®ããã©ã³ã¹ãåãã¦ããã¨æããScalaã¯Java風ã®ãªãã¸ã§ã¯ãã·ã¹ãã ãæã£ã¦ããããé常ã¯å ¬ç§°åã使ãããrecord4sãªã©ã®æ§é çé¨ååãå°å ¥ããã©ã¤ãã©ãªããããããScalaã®å¼·åãªåå®å ¨æ§ãæ ä¿ã«ãã¤ã¤ãããªãæè»ã«ãã¼ã¿ãæ±ããã
//> using dep "com.github.tarao::record4s:0.9.1" import com.github.tarao.record4s.% val me = %(name = "windymelt", born = 1993) // è£å®ãå¹ã me.name // => "windymelt" val me2 = me ++ %( favorite = %( lang = "scala", fruit = "peach", os = "FreeBSD", ) ) me2.favorite.fruit // => "peach"
ã¾ããæ§é çé¨ååã«ãéãã話ã ããJS/TSã§ã¯ãããªãã¸ã§ã¯ãã表ç¾ããããã®è¨æ³ãé常ã«æ´ç·´ããã¦ãã¦ãããããã©ã®è¨èªããã(å¯ä¸ã®ä¾å¤ã§ããLISPãé¤ãã¦)èªç±ã«ãªãã¸ã§ã¯ããæ¸ããã¨ãã§ããããã®æ軽ãããªããã°ãDOPãå®è·µããã®ã¯ããªãè¾ãã
楽観çãªç¶æ 管ç
ãã®æ¬ã«ã¯RDBMSã®è©±ããã¾ãåºã¦ããªããã¨ããã®ããDOPã«å¿ å®ãªã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãã¼ã¿æä½ã¨ç¶æ 管çã¯å¥ã ã®ã¢ã¸ã¥ã¼ã«ã«åé¢ããã¦ãã¦ããã¼ã¿ã®ãã¥ã¼ãã¼ã·ã§ã³ãè¡ãéã¯ãã¾ããã¼ã¿ãæä½ããå¾ã§ãæçµçãªç¶æ ãã³ãããããå¦çãã¢ããªã±ã¼ã·ã§ã³å ã®ä¸ç®æå¼ãåãã¦ã楽観çãªããã¯å¶å¾¡ã§ä¸ä»£ç®¡çããããã¨ãã¾ãæ¨å¥¨ãã¦ããããã ããã®æ¬¡ã«é«åº¦ãªè©±é¡ã¨ãã¦RDBMSãç»å ´ãããæ®æ®µãããã(誰ï¼)ã¯DBã«ç¹ãã§ããããããã®ã«æ £ããã£ã¦ãããããããã¯ããªãç°æ§ã«æããã
å ãã¦ãRDBMSã使ãã¨ãã«ãããããã¯ãªã©ãããã©ãããã®ããã¨ãã話ãç¡ãã£ãã®ãæ°ã«ãªã£ããèªåã®ç解ãåãã§ããªãã®ãããã¾ãç´å¾ãã£ã¦ããªããæ®æ®µã¯ã¦ã§ããµã¼ãã¹ã°ããæ¸ãã¦ããããããã¾ãæ³åãã¤ããªãã®ããªãã
å ¨ä½çãªææ³
èªåã¯æ®æ®µScalaã¨ãTSã§éçºãã¦ãããJS/TSã§ã¯DOPçãªææ³ã貫徹ããã®ã¯ããªã大å¤ãªéç¨ã«ãªãã ããã¨æãããScalaã ã¨ãã®æ¬ã§è§£èª¬ãããææ³ã¯ã ãããè¨èªæ©è½ãã©ã¤ãã©ãªã¨ãã¦åãè¾¼ã¾ãã¦ãã¦ãæ®éã«Scalaãæ¸ãã¦ããã(ç¶æ å¶å¾¡ã¾ããã®è©±ä»¥å¤ã¯)ã ãããå®è·µãã¦ãã人ãå¤ãã®ã§ã¯ãªããã
- ã¤ãã¥ã¼ã¿ãã«ãªãã¼ã¿
- åæã«è¨èªæ©è½ã§ãããªã£ã¦ãããä½ãããªãã¦ãæ°¸ç¶ãã¼ã¿æ§é ã使ããã
- é¢æ°åçãªæ¸ãæ¹ãããã¨ãèªç¶ã¨ç¶æ ã¯æé¤ããã¦ããããã¹ãããããããªã£ã¦ããã
- ã³ã¼ãã¨ãã¼ã¿ã®åé¢
- Scalaã§ã¯Javaçãªæ¸ãæ¹ãå¯è½ã ããæµåã¨ãã¦ã¯
case class
ã«ãã¼ã¿ã ããæããã¦ããã¨ã¯åã¯ã©ã¹ããµã¼ãã¹ã¡ã½ããçãªå½¹åãã®æ©æ§ã«å¦çããããã¨ãå¤ãã¨æãã Either
ãTuple
ãªã©ãå å®ãã¦ããããããã¼ã¿ã¯ãã¼ã¿ã¨ãã¦ãã®ã¾ã¾èª¿çãã風ç¿ãå¼·ãã
- Scalaã§ã¯Javaçãªæ¸ãæ¹ãå¯è½ã ããæµåã¨ãã¦ã¯
- ããªãã¼ã·ã§ã³
- ããããåãå¼·ãã®ã§ããã¾ãããªãã¼ã·ã§ã³ã«é ¼ããã«æ¸ãã§ããã
- record4sãªã©ã®æ§é çé¨ååã使ãã©ã¤ãã©ãªãå©ç¨ãã¦ãåã¬ãã«ã§ãã£ã¼ã«ãã®åå¨ãä¿è¨¼ã§ããã
- refinedãªã©ã®ããªãã¼ã·ã§ã³ã©ã¤ãã©ãªãå©ç¨ãã¦ãåã¬ãã«ã§å¤ã®ç¹æ§ãä¿è¨¼ã§ããã
- ã¸ã§ããªãã¯ãªé¢æ°
- åã¯ã©ã¹ã®ææ³ãã®ãã®ã
- ç¶æ
管ç
- RDBMSã«ãããããã¨ãå¤ãããã«æãã
- ããæåå´ã®ãã¢ããªã±ã¼ã·ã§ã³å ã§ä¸¦è¡å¦çããããã¨ãã£ãã¬ãã«ã®ç¶æ 管çã§ã¯ãCats Effectãªã©ã®éåæã©ã¤ãã©ãªãæ´»ç¨ãã¦ç²åº¦ã®é«ãåå®å ¨ã§ä½¿ããããã¤ã³ã¿ã¼ãã§ã¤ã¹ãå©ç¨ããã
- æ
å ±ãã¹
- ãã¼ã¿ä¸ã®ç¹å®ã®ãã£ã¼ã«ããæã示ãããã®ãã£ã¼ã«ãåã®é åã®ãã¨ãæ å ±ãã¹ã¨å¼ãã§ããã
- ãªãã¸ã§ã¯ãä¸ã®å ¥ãçµãã å ´æãåãåºãããå¤æ´ã§ããã
- Opticsãããããã£ããã¨ã ãªããã¨ããææ³ã«ãªã£ããScalaã§ã¯Monocleã¨ããã©ã¤ãã©ãªãOpticsãå®è£ ããã
- OOPã®Getter/Setterãå解éããåæå¯è½ãªGetter/Setterãªã©ãå®è£ ãã¦ããã®ãOpticsã¨ããæ çµã¿ã§ãã
å ¨ä½ãéãã¦ããã¼ã¿ã«å帰ããã¨ããã¡ãã»ã¼ã¸ãå¼·ãæããããã®ç¹ã«ã¤ãã¦ã¯å¼·ãå ±é³´ããã¨ããããã£ãã
åèæç®
www.slideshare.net