æè¿ããã³ãã¨ã³ãã«éãã TypeScript ãæ¸ããã¨ãå¤ããªã£ã¦ãããã§ãããªãã®è¦æ¨¡ã®ãµã¼ããµã¤ãã¢ããªã±ã¼ã·ã§ã³ãæ¸ãã¨ãã©ããªããã ãããã¨æ°ã«ãªã£ã¦èªãã§ã¿ããããããæ®éã®ãªãã¸ã§ã¯ãæåã§ã¯ãªã颿°æåãªæ¸ãæ¹ã§ããããã¨ããã©ãããã®ã好ã¾ããã®ããã¨ãããããªè¦³ç¹ã
ååçã«ãã®ãã®ãã°ããã¨ããæ¬ããã£ãã®ã§è³¼å ¥ãããæ¥æ¬ã®ã¦ã§ããæ¤ç´¢ãã¦ã¿ã¦ãããããè¨åãããã®ã§ä¾¡å¤ã¯ããããã ã¨ãã夿ã§ã大人ãªã®ã§åå®ã§ãå¼·è¡ããã
èªå㯠PDF ã§èªã¿ããã£ãã®ã§ Domain Modeling Made Functional: Tackle Software Complexity with Domain-Driven Design and F# by Scott Wlaschin ã§è²·ã£ããKindle çã¨ã©ã£ã¡ãå®ããã¯ã¿ã¤ãã³ã°ã«ããããã
ãã®æ¬ã§ã¯ãã¡ã¤ã³é§åè¨è¨ï¼DDDï¼ã F# ã§å®è·µããã¨ã©ããªãã®ããã¨ãããã¨ãèªã£ã¦ãããF# ã¯èªã¿æ¸ããããã¨ããªããã©ãææ³ã¯è¦è¦ãã®ããæãã ããç¹å¥ãªè¨èªæ©è½ã¯åºã¦ããªãã®ã§ãF# ã§è©°ã¾ããã¨ã¯ãªãã£ããæ¬ã®æ§æãããã¡ã¤ã³ã®åæãâãã¢ããªã³ã°ãâãå®è£ ãã¨ãªã£ã¦ãã¦ãF# ã使ã£ã詳細ã«å ¥ã£ã¦ããã®ãã ãã¶å¾åã ãã«ãªã£ã¦ããã®ãããããã
ãã¡ã¤ã³ã®åæã¯ã¤ãã³ãã¹ãã¼ãã³ã°ã§è¡ãã¹ããã¨ããã¨ããããå§ã¾ã£ã¦ãã¦ãDDD ã®å®è·µæ¸ã¨ãã¦ã³ã³ãã¯ããªããããã¾ã¨ã¾ã£ã¦ãããDDD ã®å ¥éã¨ãã観ç¹ã§ãããããã
çµå±ãã®æ¬ã§è¨ã£ã¦ãã Functional ã¨ã¯
- éçãªä»£æ°çãã¼ã¿åãé§ä½¿ãã¦ã¢ããªã³ã°ãããã¨ã¨ã
- ä¸å¤ãªãã¼ã¿ã¨å¯ä½ç¨ã®ãªã颿°ã«åºã¥ãã¦ã¯ã¼ã¯ããã¼ãå®è£ ãããã¨
ã¨ãããã¨ã®ããã§ããã
代æ°çãã¼ã¿åã«ããã¢ããªã³ã°
åæãçµã¦å¾ããããã¡ã¤ã³ã¢ãã«ããåãéãã¦ã¢ããªã³ã°ãã¦ãããããã§ã¯ã¨ãã«ç´ååãéè¦ãªåããæã£ã¦ãã¦ãããã使ããã¨ã§éããã®ãéããã®ã¨ãã¦è¡¨ç¾ã§ããããããããªãç¶æ ã¯ãããã表ç¾ã§ããªãããã«ããï¼Making Illigal States Unrepresentable In Our Domainï¼ãã¨ããã®ã大æ¹éã ã
Capturing Business Rules in the Type System: å®ãã¹ããã¸ãã¹ã«ã¼ã«ããããªããå®è¡æã®ãã§ãã¯ã§ã¯ãªãåã§è¡¨ç¾ããããã¨ãã°
type CustomerEmail = { EmailAddress : EmailAddress IsVerified : bool }
ã¨ãã表ç¾ã§ã¯ EmailAddress ã夿´ãããã¨ãã« IsVerified ãã©ãå¤åãã¹ãããï¼ãã¸ãã¯ãèªã¾ãªãã¨ï¼åãããªãããå°æ¥ã®å¤æ´ã§ãã°ãçãä½å°ããããã
type CustomerEmail = | Unverified of EmailAddress | Verified of VerifiedEmailAddress
ã¨ãã¦ãã㤠VerifiedEmailAddress ã®åããã¤å¤ãèªç±ã«çæã§ããªããªã£ã¦ããã°ï¼ãã¨ãã°æ¤è¨¼ãã¸ãã¯ãééããªãã¨çæã§ããªããªã©ï¼ãããã¾ããã¡ã¤ã³ã®äºæ ãåæ ãã¦ãééãã«ãããªãã
ã¤ã¾ãã¨ãããæ§è³ªãååã«å¯ãã¦ãããã¨ã ã¨æããããããã°ã³ã¼ãã«ãããã§ãã¯ããåã«ãããã§ãã¯ã¸ã¨å ´ãç§»ããã¨ãã§ããã
æ¬ã§ã¯ããããªã F# ãæ¸ãã®ã§ã¯ãªãã¦ãã¡ã¤ã³ã«ãããç¶æ ãæ¬ä¼¼ã³ã¼ãçã«è¡¨ãã¦ã¿ãã¨ã¢ã©ä¸æè°ãF# ã®ã³ã¼ãã«ãã®ã¾ã¾å¤æã§ãããã¨ããã¹ãã¼ãªã¼ã«ãªã£ã¦ããããã©ããã¾ã§ãã¾ãããã®ãã¯çåãã¾ããPersistence Ignorance ã強調ãã¦ãçµç¤ã«ãªãã¾ã§æ°¸ç¶åã®ãã¨ãæ°ã«ããã«ã¢ããªã³ã°ãã¦ãã®ã¯ããã¨æããå®å ¨ã«ãã¼ã¿ã¹ãã¬ã¼ã¸ããåãé¢ãããå®è£ ããããã¨ã¯ãå°ãªãã¨ãèªåãè¦èãããè¦æ¨¡ã®ã¢ããªã±ã¼ã·ã§ã³ã§ã¯éç¾å®çã ã¨ãæããã©ã
ã¯ã¼ã¯ããã¼ããã¤ãã©ã¤ã³ã¨ãã¦å®è£ ãã
ã¯ã¼ã¯ããã¼ãè¤æ°ã®ã¹ãããã«ããå¤ã®åãæ¸¡ãã«åè§£ãã¦ãããããã®ã¹ãããã¯å¯ä½ç¨ãæããªãç¶æ é·ç§»ã¨ãã¦ã¢ããªã³ã°ãããããã§ããç¶æ é·ç§»ã¨ã¯ãã¢ããªã³ã°ãéãã¦å®ç¾©ãããã¼ã¿åãå ¥åºåã¨ãã¦æã¤ãããªé¢æ°ã ãç¶æ ãå¤ããã¨ããã®ã¯ãã¼ã¿ã®æã¤å¤ãå¤ãããã¨ã§ã¯ãªãã¦ããããããåã«ãªããã¨ããã®ãååã¨ãã¦èãã¦ããã¨ãããããä½ããã®ãã¸ãã¹ãã¸ãã¯ãçµã¦ããã¼ã¿ã¯å¥ã®ãã®ã«ãªããåã®ä¾ã ã¨ããã¡ã¼ã«ã¢ãã¬ã¹ãæ¤è¨¼ãããã§ã¯ãªãã¦ãæ¤è¨¼ããã¦ããªãã¡ã¼ã«ã¢ãã¬ã¹ãæ¤è¨¼ãããã¡ã¼ã«ã¢ãã¬ã¹ã«å¤æãããã¨ãããããªå½¢ã ã
Pushing Persistence to the Edges: ããã¦ãªããªã³ã¢ã¼ããã¯ãã£çãªæµåã§ãã¯ã¼ã¯ããã¼å ã®ã¹ãããï¼ç¾¤ï¼ã I/O ã§æã¿è¾¼ãå½¢ã«å®è£ ãããå ´åã«ãã£ã¦ã¯ I/O ãã¯ã¼ã¯ããã¼ã®ä¸¡ç«¯ã ãã§ãªãä¸ã«ç»å ´ãããã¨ããããã¨ãããç´ç²ãªãã¸ãã¹ãã¸ãã¯ã¨ I/O ãå¥åã®å¦çã¨ãã¦é£ãªã£ã¦ãããã¨ãéè¦ã
ãã¡ã¤ã³ãã¸ãã¯ãå¯ä½ç¨ã®ãªã颿°ã¨ãã¦ãå®è£ ãããã¨ã§ãè¨ãã¾ã§ããªããã¹ãããããããªãã®ã¯ãã¡ããã ãã©ããã¡ã¤ã³ã®äºæ ããããã¾ã表ç¾ã§ãããã«ãæãããã¹ãããã®éä¸ã§ I/O ã«éãããã¨ãã§ããªãï¼ï¼ Unit ãè¿ããªãï¼ã®ã§ãã¢ããªã³ã°ã§å®ç¾©ããåã®ããã ã®å¤æãè¡ããããå¾ãªããã¨ããã¤ã¡ã¼ã¸ããã¨ãªãã¸ããªã¯ç»å ´ããªãã¨ãè¨ã£ã¦ãã I/O é¨åãããã§ããã¨æã£ãï¼ã¾ããããã Java ã® DDD ã§è¨ããªãã¸ããªã¨ã¯ã¡ãã£ã¨æ§æ ãéããã ã¨æããã©ï¼ã
ã¾ã¨ã
ã»ãã«ãã¢ãããã©ãããã¨ã Result åãã©ãããã¿ãããªç´°ãã話ããããã©ãã¾ããã®ã¸ãã¯è¿å¹´ã®éçåããã¤è¨èªã«è§¦ãããã¨ãããã°é£ã°ãã¦èªããããã㨠DI å¨è¾ºã¯è¨èªã«ãã£ã¦æ±ããéããããªã®ã§çé¢ç®ã«èªãã§ãªãï¼ãããããããæ·±å ãããªãããã§ãã£ãï¼ã
èªãã ãããã¨æ®éã ããã¨ãªã£ããã©ãããã«ç´ç²ãªä¸çã颿°åã»éçåã®ä¸çã§å®ç¾ããããã¨ãããã¨ã«æ°ãæã£ã¦ããªãã¨å®¹æã«å¢çãå´©ãã¦ãã¾ããã¨ãæ³åã§ãããä¸ç¨®ã®çæ³çãªä¾ã¨ãã¦èªãã§ããã¨ãç¾å®ã®åé¡ã«åãçµãã¨ãã®è¶³ãããã«ã§ãããã§ããã
ã㨠TypeScript ã§ãããç´æ¥å®è·µã§ãããã¯åãã£ã¦ããªããã¨ã¯ããããã®ååã¯ã©ã®è¨èªã§ãå½¹ã«ç«ã¡ããã ã£ãã