ãLean Architecture / DCI Eveningãåå ã¬ããŒã
2017幎10æ18æ¥ãJames Coplienãããšãã®å¥¥æ§ã§ããGertrud BjÞrnvigããããæãããŠããLean Architecture / DCI Evening ããšããã€ãã³ããéå¬ããŸãããæ¥æ¬ã§ã¯ãœãããŠã§ã¢ãã¿ãŒã³ãã¢ãžã£ã€ã«ã®ãªãŒããŒãšããŠç¥ãããJames Coplienããã¯ãã ãã«ããã©ãã€ã ãã¶ã€ã³ ãïŒ1998幎ïŒã§ãã¡ã€ã³ãšãã¡ã€ã³éã®é¢ä¿ãäžå¿ã«æ®ããèšèšãã©ãã€ã ãæå±ããŠããŸãããCoplienããã¯2009幎ãMVCã¢ãŒããã¯ãã£ã®èæ¡è
ã§ãã Trygve Reenskaug ãããšå
±ã«ãDCIã¢ãŒããã¯ãã£ããçºè¡šããŸããã2010幎ãCoplienããã¯Gertrudãããšãšãã«æžç±ã Lean Architecture ããäžæ¢ãããšã¿çç£æ¹åŒããœãããŠã§ã¢ã¢ãŒããã¯ãã£ã«é©çšãããªãŒã³ã¢ãŒããã¯ãã£ã«ã€ããŠãDCIã¢ãŒããã¯ãã£ããã®ãã«ãã£ã³ã°ãããã¯ãšäœçœ®ã¥ããå
·äœçãªæ¹æ³ãèšè¿°ããŸãããä»åããã«ããã©ãã€ã ãã¶ã€ã³ã®èªæžäŒã倧éªã§éå¬ããŠããçžããã衚é¡ã®ã€ãã³ããéå¬ããããšãã§ããŸããããã®èšäºã§ã¯ã»ãã·ã§ã³ã®å
容ã«ã€ããŠããŒã¯ãåçŸãã圢ã§ãäŒãããããšæããŸãã
NOTE: ïŒâ»ïŒå
ã¯çè
ã«ããã³ã¡ã³ãã§ãããŸããåºæ¬çã«è±èªããä¿®æ£ããã«ç¿»èš³ããŠããã®ã§ãäºå®é¢ä¿ã«é¢ããŠã¯ç¢ºèªããšããŠããªããã®ããããŸãã
Coplienããã«ããDCIã¢ãŒããã¯ãã£ã®æŠèª¬
CoplienããïŒä»¥äžãCïŒ: æåã«ã¯ã€ãºãããŸããã¿ããªç«ã£ãŠãDCIã¯ãDCIãšåŒã¶åã¯ãªããšåŒãã§ãããç¥ã£ãŠããŸããïŒã»ã»ã»DCA (Data-Collabolation-Algorithm)(â»é¢é£ãªã³ã¯ãåç
§)ã§ããç¥ã£ãŠã人ã¯ãã®ãŸãŸç«ã£ãŠããããå·®ãäžããŸããïŒâ»åå è
ã®äžäººããµã€ã³ä»ãã®Lean Architectureããã¬ãŒã³ããããïŒ
C: (â»DCIã§éçºããããã®èšèªåºç€ãšIDEãæäŸãã)Trygveã®ããã°ã©ã ã®æ¡åŒµåã¯ã.kãã«ãªã£ãŠããã®ã¯ãªãã§ãããïŒããã¯å²åŠè
ã®ã«ã³ããããšã£ãŠããã
C: ãªããžã§ã¯ãæåããã°ã©ãã³ã°ãã§ããªããã¢ãã³ãªèšèªã¯ãªãã§ãããïŒRustïŒJavaãOKãããã ãJavaã¯ãªããžã§ã¯ãæåã§ã¯ãªããã¯ã©ã¹æåã®èšèªã ã
C: DCIã®Webãµã€ãfulloo.infoã«ããããªãªãœãŒã¹ããããŸãããµã³ãã«ã³ãŒããšããããªãšããå
¥ã£ãŠããã
C: 仿¥ã¯ã€ã³ãã©ãŒãã«ãªäŒã§ããå°ããDCIã®ãã¥ãŒããªã¢ã«ãããããšãã§ããããç§ãæè¿ã©ãããç ç©¶ããã£ãŠãããã話ãããšãã§ãããDCIãå®éã«ã©ããã£ãŠããã°ã©ããŒã®éäžåãé«ããŠãšã©ãŒãåãé€ãããšãã§ããããšããããšã話ããŠãããããTrygveèšèªã®å®éã®äŸããèŠãããããšãã§ãããèŠãç®ã¯Javaã¿ããã ãã©ããããã«ã¯ãã³ã³ããã¹ããšããŒã«ãç»å Žãããèšèšã®è©±ãããŠããããããã¡ã€ã³åæã®è©±ãããŠãããã
åå è
A: ãã¡ã€ã³åæãšTrygve IDEãèŠãããç§ãã¡ã¯å€§éªã§ããã«ããã©ãã€ã ãã¶ã€ã³ãã®èªæžäŒãããŠããŸãããMPDãšDCIãã©ã®ããã«ç¹ããã®è©±ãèãããã
C: 仿¥ã¯äœäººã倧éªããæ¥ãã®ïŒOh! DCIãæ®ã©ç¥ããªããšãã人ã¯ïŒæåã«å°ããã€ã³ã¿ã©ã¯ã·ã§ã³ãããŸããããã15åãããã
C: ãã«ããã©ãã€ã ãã¶ã€ã³ã¯ãã¯ã©ã¹ããŒã¹ã®èšèªã«åºç€ã眮ããŠè°è«ãå±éããŠãããDCIã¯ãªã¢ã«ãªãã«ãã£ã³ã°ãããã¯(æ§æèŠçŽ )ãšãªããžã§ã¯ã矀ã®ãããã¯ãŒã¯ã§ããããã倧ããªéãã§ãããã¡ã€ã³åæãšããŠãŒã¹ã±ãŒã¹ãããŒã«ã®ã¢ã¯ã¿ãŒã«é¢ããŠã¯åŸã»ã©åŠ»ã説æããŠãããã
C: ãŸãã¯DCIã®è§Šããç°¡åãªãã¢ããéè¡å£åº§éã®ééã®ã±ãŒã¹ãèããŠã¿ãããœãããŠã§ã¢äžã§ã¯ããã¯ã©ãããç¶æ
ã§ãããããã¯ã©ã¹ãæžããŠããªããžã§ã¯ãå士ãã€ã³ã¿ã©ã¯ã·ã§ã³ãããŸãããã¯ã©ã¹ãæžããšããšããã®ã¯ãã¯ã©ã¹ã®å
šãŠã®ã¡ãœãããèæ
®ããŠæžãå¿
èŠãããã
C: ATMã®äŸãèããŠã¿ãŸããããATMã皌åããŠããŠãããã確èªããããã«ãã³ã³ãœãŒã«ã«ãªããžã§ã¯ãIDãããªã³ãããããã°ã©ã ãèããŠã¿ãŸãããã
ïŒâ»ã¡ãœãããåŒã°ãããã³ã«ãªããžã§ã¯ãIDãããªã³ããããŠãããã¢ïŒ
C: ãããèŠãŠäœããã¿ãŒã³ã¯èŠã€ããã§ããããïŒ åã«åããªããžã§ã¯ããå»¶ã
ãšåŒã°ããŠããããšããããã ãã§ããïŒïŒâ»äŒå Žç¬ïŒåŒã°ãããªããžã§ã¯ãã®é çªãšãã¯å
šç¶éèŠã§ã¯ãªãã£ãããã§ãã
C: 次ã«ãªããžã§ã¯ãIDã§ã¯ãªããã¯ã©ã¹åã衚瀺ãããããã«ããŠã¿ãŸããããã¯ã©ã¹åã¯éèŠã§ããããã³ã³ãœãŒã«ãèŠãŠãã¿ãŒã³ã¯èŠã€ãããŸããïŒãªãã§ãããããããŸã å®ç§ã§ã¯ãªãããã§ããã¯ã©ã¹ã®ãã¡ã2ã€ã¯å£åº§ã«é¢ãããã®ãæåŸã®3ã€ç®ã¯é貚ã«é¢ãããã®ã ãšããããšã¯ããããŸããããããã¢ãŒããã¯ãã£ã®æ¯ãèãã¯ã¯ã©ã¹ã ãã§ã¯è¡šçŸãããŠããªãããã§ãã
C: ããŠãä»åºŠã¯ã¡ãœãããåŒã°ããæ¯ã«ã圹å²ïŒâ»ããŒã«ïŒãããªã³ããããããã«ããŠã¿ãŸãããã»ã»ã»Ah ha!(â»äŒå Žç¬) åãããŸãããããéãééãããšãã®æ§é ã¯ãããããµãã«ãªããŸããããæ§é ã¯åœ¹å²ïŒâ»ããŒã«ïŒã®äžã«å
¥ã£ãŠããŸãã
C: 1ã€ã®éè¡ã«2ã€ä»¥äžã®å£åº§ãæã£ãŠãã人ã¯ããŸããïŒïŒâ»äŒå ŽããæãïŒããã§ã¯ãç§ã«1ã€ã®èªåã®å£åº§ããä»ã®å£åº§ã«ééãããŠãŒã¶ãŒã¹ããŒãªãŒã«ã€ããŠèª¬æããŠäžããã
åå è
B: ããå£åº§ããããå£åº§ã«ééããŸãã劻ã«ãã€ã¢ã¢ã³ããè²·ãããã«ã貯èå£åº§ããæ®éå£åº§ãžã
C: ãã£ãšäžè¬çã«èšããšïŒ
åå è
B: æ¯èŸŒå
ããæ¯èŸŒå
ãžééããã
C: æ¯èŸŒå
å£åº§ãæã£ãŠãã人ã¯ããŸããïŒããã¯ããªããžã§ã¯ãã§ããããïŒã¯ã©ã¹ã§ããããïŒãªãã§ããããããæ¯èŸŒå
å£åº§ã¿ãããªåœ¹å²ãšã¯ïŒã»ã»ã»äººã¯ããã圹å²ïŒããŒã«ïŒãšããŠèããŠããããã§ããããã¯ã©ã¹ããªããžã§ã¯ããšããŠåœ¹å²ïŒããŒã«ïŒãèããŠã¯ããªãã§ãããã
C: ã¢ã©ã³ã»ã±ã€ã®æåã«èããŠãããªããžã§ã¯ãæåãšããã®ã¯ãã¥ãŒãã³ã¡ã³ã¿ã«ã¢ãã«ãã³ã³ãã¥ãŒã¿ã«é©çšããããã®ã§ããããã®ã¡ã³ã¿ã«ã¢ãã«ãä»çºèŠããã®ã§ãïŒ
åå è
B: ã©ããã£ãŠãå£åº§ã®æ¯èŸŒå
ãšãæ¯èŸŒå
ãšããå€å¥ãããã§ããããïŒ
C: ãã¢ãžã§ãšããçºéå¿çåŠè
ãããŸãããã¢ãžã§ã«ããªãã¬ãŒã·ã§ãã«ã¢ãã«çè«ããšããã®ããããŸãããã«ãã£ã³ã°ãããã¯ïŒâ»æ§æèŠçŽ ïŒã䜿ã£ãŠè«ççã«èããå¿
èŠããããŸãããªããžã§ã¯ããã¯ã©ã¹ã§ã¯ãªããã®ãããã®ã§ããããããç§ãã¡ã¯æåã«ãªããžã§ã¯ããåŠã³ããã®åŸã«ã¯ã©ã¹ã»ã¯ã©ã¹åãåŠã¶ããã§ããåã©ããäžçªæåã«ãªããžã§ã¯ããåŠã¶æã¯ãå
šãŠãèªåèªèº«ãšããŠèªèããããã§ããæ¯èŠªãããèªåã ãšæãã4-7ã¶æã®éã«åºå¥ãã€ããããšãã§ããããã«ãªã£ãŠãããå°ããªåã©ãã¯éЬãèŠãæã«ã銬ãæå·®ããŠãç¬ïŒããšå«ã¶ãïŒâ»ããïŒãšäŒå Žå
±æã®å£°ïŒãããã£ãèªèã¯ç©äºã«å
±éæ§ãèŠåºããŠããããšã«ãã£ãŠæãç«ã£ãŠããŸããç§ãã¡ã¯ããã°ã©ã ãåé¡è§£æ±ºã®ããã«æžããŠããŸããåã©ãã¯8ã¶æãããã®æã«åå ãšçµæãšããå æé¢ä¿ã«ã€ããŠåŠã¶ããã®é ããæºãæŒããããäžã«ãããã®ãå©ãããããŠäœããèœã¡ããããã®ã楜ãããããããŠæçµçã«ã¯ãåé¡è§£æ±ºããèœåãåŠç¿ããŠãããããããªãã¬ãŒã·ã§ãã«ã¢ãã«ãšåŒã°ãããã®ã§ãã
C: ããã°ã©ã ãéããŠåé¡è§£æ±ºããããã«ãã®èããå¿
èŠã§ãããããã°ã©ã ãæžããšãã«ã¯ã©ããã£ãŠããã®ã§ãããïŒããã«ãã®ããã«ãªããžã§ã¯ããæ£ãã°ã£ãŠããããããŠãªããžã§ã¯ããã€ãªãããŠãŒã¹ã±ãŒã¹ããããããã¯ãŸãå¥ã®ãŠãŒã¹ã±ãŒã¹ã§ãããããã¯ãŸãå¥ã®ãŠãŒã¹ã±ãŒã¹ããŸãå¥ã®ãŠãŒã¹ã±ãŒã¹ã»ã»ã»ïŒâ»äŒå Žç¬ïŒãŠãŒã¹ã±ãŒã¹ã¯ãªããžã§ã¯ãã®ã·ãŒã±ã³ã¹ã§ã¯ãªããã§ããããããèŠããšãé çªãããããã§ã¯ãªãã
C: ã§ã¯ããŠãŒã¹ã±ãŒã¹ã®ã³ãŒãããªããžã§ã¯ããããäžã®ã¬ã€ã€ãŒã«åãåºãããšããããšããã£ãŠã¿ãŸããããä»ããŠãŒã¹ã±ãŒã¹ã®ã³ãŒãã¯ããªããžã§ã¯ãã®ã¯ã©ã¹ã®äžã«ãããŸãããã®ãŠãŒã¹ã±ãŒã¹ã®éšåããã¯ã©ã¹ã®å€åŽã«åºãã®ã§ãããããããšããªããžã§ã¯ãã®æ¹ã¯åºæ¬çãªã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã®ãŸãŸãªã®ã§ããšãŠãåçŽã§ãããããããããã¯å®éã®ãšãããŠãŒã¹ã±ãŒã¹ã®äžéšã«ã¯ãªããŸãããã§ã¯ããŠãŒã¹ã±ãŒã¹ã®éšåã¯äœã§ããããïŒ ããŒã«ã§ããããŠãŒã¹ã±ãŒã¹ã®éšåã¯ãããŒã«ã®äžã«ãããŸããéçºè
ã¯ããã®ãããªããŒã«ã®äžããããã€ããéžãã§ãŸãšããŸãããã®ãŸãšãŸãããã³ã³ããã¹ããšåŒã³ãŸãã ã€ãŸããã³ã³ããã¹ãããŠãŒã¹ã±ãŒã¹ã«çžåœããŸãããããŠããŠãŒã¹ã±ãŒã¹ãå®è¡ããã«ã¯ããµããžã§ã¯ãïŒâ»ãŠãŒã¹ã±ãŒã¹ã®å
¥ãå£ãšãªããšã³ãã£ãã£ãåŸè¿°ã®ãµã³ãã«ã³ãŒãã®TransferMoneyContext.SOURCE_ACCOUNTã«ä»£å
¥ããããªããžã§ã¯ãã«ãããïŒã«ãããã®ã¡ãœããïŒâ»ããŒã«ã®ã¡ãœããïŒãã€ã³ãžã§ã¯ãããŸãããã®ãªããžã§ã¯ãïŒâ»ä»ã®ãšã³ãã£ãã£ãåŸè¿°ã®ãµã³ãã«ã³ãŒãã®TransferMoneyContext.DESTINATION_ACCOUNTã«ä»£å
¥ããããªããžã§ã¯ãã«ãããïŒã«ããããã®ã¡ãœãããã€ã³ãžã§ã¯ãããŸãã
C: ãªããžã§ã¯ãã¯æ¢ã«ãããããŠãŒã¹ã±ãŒã¹ãæžããããäŸãã°ããªã³ãã¿ãŒãé£ã°ãããšã«ã€ããŠèããŠã¿ãŸãããããªãã¬ãŒã·ã§ãã«ã¢ãã«ã§æèããŠãããŒã«ãèããŸããæ ç»ã®ããããªãã¯ã¹ããèŠãããšããããŸããïŒããªããã£ã¯ããªã³ãã¿ãŒãé£ã°ããªããã°ãããªãã£ãã§ããããããªã³ãã¿ãŒãæçžŠããããã°ã©ã ãããŠã³ããŒãããŠããŸãããããŒã«ã®ããã°ã©ã ãããŠã³ããŒãããããšã«ãã£ãŠããªã³ãã¿ãŒãé£ã°ãããšãã§ããããã§ããã©ã³ã¿ã€ã ã§ãªããžã§ã¯ãã«å¯ŸããŠã©ã®ããã«ãŠãŒã¹ã±ãŒã¹äžã§æ¯ãèãã®ããæããŠãããããŠãŒã¹ã±ãŒã¹ãçµãããšããªããžã§ã¯ãã¯äœãããããäœããã£ãããïŒâ»ã©ã®ããã«æ¯ãèãããïŒå¿ããŠããŸãããã§ãã
åå è
B: ããªããã£ã¯ãªããžã§ã¯ãïŒâ»ãšã³ãã£ãã£ïŒããã€ãããã¯ããŒã«ãšããããšã§ããã
C: ããªããã£ã¯ãããªã³ãã¿ãŒãæçžŠããããã®ã¡ãœãããæã£ãŠãããæãåãããããè¶³ãåãããããšãã£ãåºæ¬çãªããªããã£ãæã£ãŠããã¡ãœããã䜿ãããšãã§ãããã³ã³ããã¹ããããªã³ãã¿ãŒãé転ããããããªããã£ã¯åºæ¬çãªåäœã¯ã§ãããã³ã³ããã¹ããšããªããã£ã®éã®ã¡ãœããã®å¥çŽãšãããã®ãå¿
èŠã§ãããªããã£ã¯äººãªã®ã§äººãæã£ãŠããã¡ãœããã ãã䜿ãããšããå¥çŽããããæãåãããšããããªã³ãã¿ãŒãæçžŠãããšããã®ã¯ã¯ã³ã³ããã¹ãã§ããããŒã«ã¯ããŒã¿ãæããªããçŽç²ã«ã¡ãœãããæã£ãŠããã以äžãDCIã®åºæ¬çãªè©±ã§ããã
åå è
C: ããŒã«ãšã¯ã©ã¹ã®éãããŸã ããããªãã
C: ã¯ã©ã¹ã¯ããŒã¿ãæã¡ãŸããããªãéã¯ããã°äººéã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããïŒããããåæåãããŠãããïŒâ»äŒå Žç¬ïŒããªã³ãã¿ãŒãã€ãããã¯ããŒã«ãªã®ã§ãããªã³ãã¿ãŒãã€ãããã®ã€ã³ã¹ã¿ã³ã¹ãäœãããšã¯ã§ããªãã人éãå¿
èŠãªãã§ãããããã¯ããããïŒãããã¯ãŽãªã©ã
åå è
C: Javaã®ã€ã³ã¿ãã§ãŒã¹ã¯ããŒã«ã«è¿ãïŒ
C: 䌌ãŠããšã¯èšãããã©ãå®è£
ããªãããããŒã«ãå®å
šã«è¡šãããšãããšéããšæããŸããïŒâ»Java 8以éã¯ã€ã³ã¿ãã§ãŒã¹ã¯å®è£
ãæãŠãããã«ãªããŸãããïŒããšãJavaã¯ã€ã³ã¿ãã§ãŒã¹ã¯éçã«æ±ºãŸã£ãŠããŠãåçã«æ±ºããããšãã§ããªããšãããšãããç°ãªããŸããã¯ã©ã¹ãã€ã³ã¿ãã§ãŒã¹ãextendãããšããã®ãå
šãŠã³ã³ãã€ã«æã«æ±ºããªããã°ãªããŸããã
åå è
D: Swiftã®ãããã³ã«ãšã¯ã¹ãã³ã·ã§ã³ã䜿ããšè¿ãããšãã§ããŸããïŒ
C: Objective-Cã§ãè
¹ãã£ã±ããªã®ã§ãSwiftã®åŠç¿ã¯é¿ããŠãããã®ã§ãïŒâ»äŒå Žç¬ïŒãããã³ã«ãšã¯ã¹ãã³ã·ã§ã³ã䜿ããšè¿ãããšãã§ããããã§ãã
åå è
C: ã¯ã©ã¹ãšããŒã«ã®éãã«ã€ããŠãJava ã¯ã©ã¹ãšã€ã³ã¿ãã§ãŒã¹ãScala ã¯ã©ã¹ãšãã¬ã€ããC++ åçã¯ã©ã¹ãVirtualã¯ã©ã¹ ãããã¯DCIã®å®è£
ãšããŠäœ¿ãããšãã§ãããã
C: Scalaã®ãã¬ã€ãã¯ããªãè¿ãã§ããScalaã§ã¯ãã¬ã€ãã®ããã¯ã¹ã€ã³ã䜿ãããã¬ã€ãã䜿ã£ãŠã¯ã©ã¹ã«åæã§ããããã®çµæã¯ã©ã¹ã¯äž¡æ¹ã®æ©èœã®ã¡ãœãããæã€ããšãã§ãããC++ã§ã¯ã©ããããïŒC++ã®å Žåã¯ã¯ã©ã¹ã®åæã«ç¶æ¿ã䜿ã£ãŠããŸãã®ã§é£ãããã©ããããïŒããŒã«ããã³ãã¬ãŒãã䜿ã£ãŠæžãããšãã§ããããã³ãã¬ãŒãã䜿ãã°DCIãå®çŸããããšã¯å¯èœã§ãããã ããã¯ã³ã³ãã€ã«ã®ã¿ã€ãã³ã°ã«ãªã£ãŠããŸãããã€ãããã¯ã§ã¯ãªããfulloo.infoãèŠãŠãã ãããããªããšãªããDCIã®ã€ã¡ãŒãžãæŽããŸãããïŒ
C: DCIã®ããã®èšèªãšããŠæ°ã«å
¥ã£ãŠããã®ã®äžã€ã¯Rubyã§ãããªããžã§ã¯ãã®æ¡åŒµãç°¡åã«ã§ãããã¢ãžã¥ãŒã«ã䜿ã£ãŠããã¯ã¹ã€ã³ããããšãã§ããŸãããã ãã¡ãœããã¯èªç±ã«è¿œå ããããšã¯ã§ãããããããåãå€ãã®ãé£ãããååã®è¡çªã®åé¡ããããMatzã¯ãã®åé¡ã«ã€ããŠçè§£ããŠãããããäžåºŠã€ã³ãžã§ã¯ããããã®ãåŒãå¥ããæ©èœãå
¥ããããšãŸã§ã¯ã説åŸããã«ã¯è³ããªãã£ããRubyã®ä»®æ³ãã·ã³ã倿Žããã°ã§ããã®ã§ãããã
ïŒâ»å®ã¯çè
ã¯Rubyistãªã®ã§ãããrefinementã䜿ããšããçšåºŠã¯ç®çã«é©ãã®ã§ã¯ãªãã®ããªãŒãšæã£ãŠããŸããŸããïŒ
C: Trygveã䜿ã£ãŠã人ãïŒâ»äžäººã ãæãæããïŒãªãŒãã³ãœãŒã¹ã§ããïŒïŒâ»äŒå Žç¬ïŒ ãéã®ééã®ãµã³ãã«ãèŠããŠãããŸããããã«ã¯ã©ã¹ããããŸããããã¯ãã¡ã€ã³åæããæœåºããããã®ã§ãã amount()(éé¡) ãªã©ã®ã¡ãœãããæã£ãŠãããã¯ã©ã¹æåã®ããã°ã©ãã³ã°ãªããããªãã®ã§ããããïŒTrygveã®ç޹ä»ãããŠãããŸããã
ïŒâ»ä»¥äžã®ã³ãŒãã¯Trygve ã§æžãããééã®ãµã³ãã« https://github.com/jcoplien/trygve/blob/master/examples/july_money_transfer.k ããåŒçšïŒ
/* * july_money_transfer.k */ class Currency { public Currency(double amount) { amount_ = amount.clone } public Currency +(Currency amount) { assert(false) return this; } public Currency -(Currency amount) { assert(false) return this; } public Currency() { } public String name() const { assert(false); return "" } public String sign() const { assert(false); return "" } public double amountInEuro() const { assert(false); return 0.0 } public double amount() const { return amount_ } public String toString() const { return amountInEuro().toString() } public int compareTo(Currency other) { if (amount() > other.amount()) return 1 else if (amount() < other.amount()) return -1; return 0 } private double amount_ } class Euro extends Currency { public Euro(double amount) { Currency(amount) } public Euro -(Currency amount) { return new Euro(amount() - amount.amountInEuro()) } public Euro +(Currency amount) { return new Euro(amount() + amount.amountInEuro()) } public String name() const { return "Euro"; } public String sign() const { return "â¬"; } public double amountInEuro() const { return amount() } public String toString() const { return amount().toString() } } class Account { public Account(int acctno) { acct_ = acctno } public String accountID() const { return acct_.toString() } public Currency availableBalance() const { assert(false); return null } public void increaseBalance(Currency amount) { assert(false) } public void decreaseBalance(Currency amount) { assert(false) } public void updateLog(String message, Date dt, Currency amount) { assert(false) } private int acct_ } class CheckingAccount extends Account { public CheckingAccount() { Account(1234); availableBalance_ = new Euro(100.00) } public Currency availableBalance() const { return availableBalance_ } public void decreaseBalance(Currency c) { availableBalance_ = availableBalance_ - c } public void updateLog(String message, Date t, Currency c) const { System.out.print("account: ").print(accountID()) .print(" CheckingAccount::updateLog(\"").print(message) .print("\", ").print(t.toString()).print(", ") .print(c.toString()).print(")") .println() } public void increaseBalance(Currency c) { availableBalance_ = availableBalance_ + c } private Currency availableBalance_ } class SavingsAccount extends Account { public SavingsAccount() { Account(1234); availableBalance_ = new Euro(0.00) } public Currency availableBalance() const { return availableBalance_ } public void decreaseBalance(Currency c) { assert(c > availableBalance_); availableBalance_ = availableBalance_ - c } public void updateLog(String logMessage, Date timeOfTransaction, Currency amountForTransaction) const { assert(logMessage.length() > 0); assert(logMessage.length() < MAX_BUFFER_SIZE); // assert(new Date() < timeOfTransaction); System.out.print("account: ").print(accountID()) .print(" SavingsAccount::updateLog(\"").print(logMessage) .print("\", ").print(timeOfTransaction.toString()) .print(", ").print(amountForTransaction.toString()) .print(")").println() } public void increaseBalance(Currency c) { availableBalance_ = availableBalance_ + c } private Currency availableBalance_; private int MAX_BUFFER_SIZE = 256 } class InvestmentAccount extends Account { public InvestmentAccount() { Account(1234); availableBalance_ = new Euro(0.00) } public Currency availableBalance() const { return availableBalance_ } public void increaseBalance(Currency c) { availableBalance_ = availableBalance_ + c } public void decreaseBalance(Currency c) { availableBalance_ = availableBalance_ - c; } public void updateLog(String s, Date t, Currency c) const { System.out.print("account: ").print(accountID()) .print(" InvestmentAccount::updateLog(\"") .print(s).print("\", ").print(t.toString()) .print(", ").print(c.toString()).print(")") .println() } private Currency availableBalance_; } class Creditor { public Creditor(Account account) { account_ = account } public Account account() { return account_ } public Currency amountOwed() const { return new Currency(0.0) } private Account account_ } class ElectricCompany extends Creditor { public ElectricCompany() { Creditor(new CheckingAccount()) } public Currency amountOwed() const { return new Euro(15.0) } } class GasCompany extends Creditor { public GasCompany() { Creditor( new SavingsAccount()); account().increaseBalance(new Euro(500.00)) // start off with a balance of 500 } public Currency amountOwed() const { return new Euro(18.76) } } context TransferMoneyContext { // Roles role AMOUNT { public Currency(double amount); public Currency +(Currency amount); public Currency -(Currency amount); public String name() const; public String sign() const; public double amountInEuro() const; public double amount() const; public String toString() const; public int compareTo(Currency other) } requires { Currency(double amount); Currency +(Currency amount); Currency -(Currency amount); String name() const; String sign() const; double amountInEuro() const; double amount() const; String toString() const; int compareTo(Currency other) } role GUI { public void displayScreen(int displayCode) } requires { void displayScreen(int displayCode) } role SOURCE_ACCOUNT { public void transferTo() { // This code is reviewable and meaningfully testable with stubs! int SUCCESS_DEPOSIT_SCREEN = 10; // beginTransaction(); if (this.availableBalance() < AMOUNT) { // endTransaction(); assert(false, "Unavailable balance") } else { this.decreaseBalance(AMOUNT); DESTINATION_ACCOUNT.increaseBalance(AMOUNT); this.updateLog("Transfer Out", new Date(), AMOUNT); DESTINATION_ACCOUNT.updateLog("Transfer In", new Date(), AMOUNT); } // GUI.displayScreen(SUCCESS_DEPOSIT_SCREEN); // endTransaction() } } requires { void decreaseBalance(Currency amount); Currency availableBalance() const; void updateLog(String msg, Date time, Currency amount) } role DESTINATION_ACCOUNT { public void transferFrom() { this.increaseBalance(AMOUNT); this.updateLog("Transfer in", new Date(), AMOUNT); } public void increaseBalance(Currency amount); public void updateLog(String msg, Date time, Currency amount) } requires { void increaseBalance(Currency amount); void updateLog(String msg, Date time, Currency amount) } public TransferMoneyContext(Currency amount, Account source, Account destination) { SOURCE_ACCOUNT = source; DESTINATION_ACCOUNT = destination; AMOUNT = amount } public TransferMoneyContext() { lookupBindings() } public void doit() { SOURCE_ACCOUNT.transferTo() } private void lookupBindings() { // These are somewhat arbitrary and for illustrative // purposes. The simulate a database lookup InvestmentAccount investmentAccount = new InvestmentAccount(); investmentAccount.increaseBalance(new Euro(100.00)); // prime it with some money SOURCE_ACCOUNT = investmentAccount; DESTINATION_ACCOUNT = new SavingsAccount(); DESTINATION_ACCOUNT.increaseBalance(new Euro(500.00)); // start it off with money AMOUNT = new Euro(30.00) } } context PayBillsContext { public PayBillsContext() { lookupBindings } role [] CREDITORS { } requires { Currency amountOwed() } stageprop SOURCE_ACCOUNT { public String accountID() const; public Currency availableBalance() const; public void increaseBalance(Currency amount) unused; public void decreaseBalance(Currency amount) unused; public void updateLog(String message, Date dt, Currency amount) unused } requires { String accountID() const; Currency availableBalance() const; void increaseBalance(Currency amount); void decreaseBalance(Currency amount); void updateLog(String message, Date dt, Currency amount) } // Use case behaviours public void doit() { for (Creditor credit : CREDITORS) { // Note that here we invoke another Use Case TransferMoneyContext xfer = new TransferMoneyContext( credit.amountOwed(), SOURCE_ACCOUNT, credit.account()); xfer.doit() } } private void lookupBindings() { // These are somewhat arbitrary and for illustrative // purposes. The simulate a database lookup InvestmentAccount investmentAccount = new InvestmentAccount(); investmentAccount.increaseBalance(new Euro(100.00)); // prime it with some money SOURCE_ACCOUNT = investmentAccount; Creditor [] creditors = new Creditor [2]; creditors[0] = new ElectricCompany(); creditors[1] = new GasCompany(); CREDITORS = creditors } } { // Main TransferMoneyContext aNewUseCase = new TransferMoneyContext(); aNewUseCase.doit(); PayBillsContext anotherNewUseCase = new PayBillsContext(); anotherNewUseCase.doit() }
C: Account(å£åº§) ãšããå¥ã®ã¯ã©ã¹ããããŸãããã¡ã€ã³åæããæœåºããããã®ã§ããå£åº§çªå·ãšããããŒã¿ãæã£ãŠãããã¡ãœãã㯠increaseBalance()(æ®é«å¢) ãš decreaseBalance()(æ®é«æž) ãå£åº§çªå·ãäžããã°ããã®ã¡ãœããã䜿ã£ãŠããããªããšãã§ãããããã°ãã¡ãã£ãšé«çŽãª Integer ã¿ãããªãã®ã§ãã»ã»ã»ãå
šããã£ãŠè¯ããªãã§ããïŒè²¯éçšã®å£åº§ãšããæè³çšã®å£åº§ãšãã©ãã©ãå¢ããŠãã£ãŠããŸããŸããäŒç€Ÿã®å£åº§ããéã®åµæš©è
⊠ãããŸã§ãã§ãã®è¯ããªãã¯ã©ã¹æåã®ããã°ã©ãã³ã°ã®ããæ¹ã§ããã
C: ããŠãããã§ã¯ééã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠèŠãŠãããŸããããContext ãããŒã¯ãŒãã§ããå€ãã®ç¹ã§ã¯ã©ã¹ã®ããã«èŠããã®ã ããã©ãã¯ã©ã¹ãšã¯ç°ãªã£ãŠããŠãã»ãšãã©ã®å ŽåããŒã¿ãæããã«ããŒã«ã ããæã£ãŠããã Amount(éé¡) ãšåŒã°ããããŒã«ã¯ãšãŠãã·ã³ãã«ãªããŒã«ã§ããããã§è³éç§»åãããããšãã§ããã
C: ïŒâ»ãã¢ãèŠããŠïŒãããããŒã«ã®ã€ã³ã¿ãã§ãŒã¹ã®ã·ã°ããã£ã§ãããªããžã§ã¯ãããããã®ã¡ãœããå
šãŠããµããŒãããããã«å®çŸ©ããå¿
èŠããããŸããããããå¿
é ã®å¥çŽã(â»the requires contract)ãšèšããŸãããªããžã§ã¯ããããŒã«ã衚çŸããå Žåããããã®ã¡ãœãããå
šãŠãµããŒãããªããã°ãªããªãã
åå è
C: ããã§èšãå¥çŽãšã¯ããå¥çŽã«ããèšèšãã®å¥çŽã®ããšã§ããïŒ
C: ãã®éãã§ããããŒãã©ã³ãã»ã¡ã€ã€ãŒãšãã人ãæå±ããå¥çŽã«ããèšèšããã®äººã®èšã£ãŠãããšã¯ãã ãããåã£ãŠãããã©çªãè©°ããããŠããªãã
åå è
B: ã¡ã€ã€ãŒã®èãã®ã©ããæ©èœããªããã§ãããïŒ
C: ã¯ã©ã¹Aããããããã«ã¡ãœãã1ããããŸããããã«ã¯äºåæ¡ä»¶ãã¡ãœããå®è¡ãäºåŸæ¡ä»¶ããããŸããã¡ãœãã1ã¯äºåæ¡ä»¶ãçã§ããããšãèŠæ±ããäºåŸæ¡ä»¶ãä¿èšŒãããŠããããšãçŽæããŸããæ¬¡ã«ã¡ãœãã1ã®äžããã¡ãœãã2ãåŒã¶ã±ãŒã¹ãèããŠã¿ãŸããããã¡ãœãã2ã«ãšã£ãŠã®äºåæ¡ä»¶ãèŠãæãã¡ãœãã2ã«ãšã£ãŠã¯ã¡ãœãã1ãç¶æ
ãç¶æããŠãããŠãããšããæ³å®ãããŠããããã§ãããã¡ãœãã1ã®å®è¡äžã«èªå·±é èœãããŠããç¶æ
ã®äžã§æ¡ä»¶ããããããªã£ãç¶æ
ã§ã¡ãœãã2ãåŒã¶ãšã¡ãœãã2ãçµæä¿èšŒããŠããäºåŸæ¡ä»¶ãå£ããŠããŸãããšãããã
C: ã¯ã©ã¹åŽã§æ¬äœãšãªãå®è£
ãæããªãã®ã¯ãããŒã«ã®ãã¬ã€ã€ãŒã®æã£ãŠããå®è£
ã䜿ãã ãã ããã§ããããŒã«ãæŒãããªããžã§ã¯ãã®å®è£
ã䜿ããŸããå¥ã®ãªããžã§ã¯ãã«ç±æ¥ããã¡ãœããã䜿ãããã§ãããããã®ã¡ãœããã¯ãããªãã¯ã€ã³ã¿ãã§ãŒã¹ã§ãããŒã«ãäœãããããç¥ãããšãã§ããŸãã
C: ãããããæãäŸãšã㊠SourceAccount(æ¯èŸŒå
å£åº§) ãšåŒã°ããå¥ã®ããŒã«ãèŠãŠãããŸããããSourceAccount 㯠transferTo()(ãã«ééãã) ãšããŠåŒã°ããã¡ãœããã責åãæã£ãŠããŸããä»ãããã®ç®æã®ã³ã¡ã³ããå€ããŠåãããã«ããŸãããããã©ã³ã¶ã¯ã·ã§ã³ãéå§ããŸãããããæ¯èŸŒå
å£åº§ãå©çšå¯èœãªæ®é«ãæã£ãŠããã°ãã³ã¡ã³ããå€ããç®æã¯äœã«ãªãã§ããããïŒ
åå è
B: ããŒã«ã泚å
¥ããããªããžã§ã¯ã
C: ããã§ãïŒ SourceAccount ããŒã«ãé©åã«æŒãããªããžã§ã¯ãã§ããå©çšå¯èœãªæ®é«ã¯ã©ãã§ããããïŒæ°ãã€ããŠãã ãããããïŒâ»ããŒã«ïŒã«ã¯ãããŸããããæ®é«ã¯ãããŒã«ãæŒããå£åº§ãªããžã§ã¯ãã®åŽãããŒã«ãã¬ã€ã€ãŒã«ãããŸãã
C: ã¯ã©ã¹ã¿ããã ããã©ãã©ã³ã¿ã€ã ã§èããããããã«ããŠãããŸããSourceAccount ããŒã«ãæŒãããªããžã§ã¯ãã«ã€ããŠèããŠã»ããã§ããããŒã«ãã¬ã€ã€ãŒã¯ãããªãã¯ã¹ïŒâ»ã³ã³ããã¹ããæã€ããŒã«ãšãªããžã§ã¯ãã®ãããã³ã°è¡šïŒã«ãã£ãŠãããããããã®ã§ããããŒã«ããªããžã§ã¯ãã«æ³šå
¥ããããšããªããžã§ã¯ããæ©èœãæã€ããã«ãªã£ãŠãééãŠãŒã¹ã±ãŒã¹ãå®çŸã§ããããã«ãªããŸããééã¡ãœããã¯æ¯èŸŒå
ã® Account ãªããžã§ã¯ãã«æ³šå
¥ãããŸãã
C: ãã¡ãã¯å¥ã®ããŒã«ãDestinationAccount(æ¯èŸŒå
å£åº§) ã§ããDestinationAccountã¯ã¡ãœãã transferFrom()(ãããééããã) ãæã¡ãŸããtransferFrom() ã¡ãœãã㯠DestinationAccount ã®æ®é«ãæŽæ°ããŸãã
C: ã³ã³ããã¹ãã®ã³ã³ã¹ãã©ã¯ã¿ãèŠãŠã¿ãŸããããTransferMoneyContext(ééã³ã³ããã¹ã) ã§ããã³ã³ããã¹ãã®äžã§äœããªããžã§ã¯ãããäŒããå¿
èŠãããŸããééã®éé¡ãæ¯èŸŒå
ãæ¯èŸŒå
ãå£åº§ã®çš®é¡ã
C: ãããªãã¯ã¹ïŒâ»ã³ã³ããã¹ããæã€ããŒã«ãšãªããžã§ã¯ãã®ãããã³ã°è¡šïŒã衚ããªããžã§ã¯ããæã£ãŠããŠãããŒã«ã®ã¡ãœãããæ¯èŸŒå
ã® Account ãªããžã§ã¯ãã«æ³šå
¥ãããŸããèŠã¯ããïŒâ»ã³ã³ããã¹ãïŒã¯ãªããžã§ã¯ãã ãšèšãããšã§ããAccount ãªããžã§ã¯ãã«å¯ŸããŠæ¯èŸŒå
å£åº§ã«ããã¹ãã¡ãœãã矀ãäžããŠãããŸããééãŠãŒã¹ã±ãŒã¹ã®ããã«ããŒã«ãã¬ã€ã€ãŒãæŒããã¡ãœãã矀ã§ããããããã°ãã©ã³ã¿ã€ã ã§ãªããžã§ã¯ããçµã¿ç«ãŠãããšãã§ããŸãã
C: ä»ã®ãŠãŒã¹ã±ãŒã¹ããéãæ¯æãã«ã€ããŠèŠãŠãããŸããããç¹å¥ãªããŒã«ããããŸãããããŠãAmount ã SavingsAccount(貯èå£åº§) ã®ãããªãªããžã§ã¯ããæ°ãã«äžã€ããã«ãããŸãããããã¯ããã©ã°ã¢ã³ããã¬ã€ãããããã«çšæããã¢ã¯ã¿ãŒã§ããç§ãå°æ¬ãæžããããŒã«ããããã¢ã¯ã¿ãŒã¯èå±
ã«ãããŠããŒã«ãæŒããŸãã
C: ããã¯èå°ã®ãããªãã®ã§ã倧éå
·ïŒstage propsïŒã¯ã¢ã¯ã¿ãŒã®æã£ãŠããéå
·ã§ãã倧éå
·ã ãã§ã¯ãäžåäœãã§ããŸããããã ããŒã¿ãåŒãåºãããšã¯ã§ããŸãã
åå è
Bè£è¶³: äœããããããšã¯ã§ããªãã®ã ãã©ãããŒã¿ãåŒãåºãããšã¯ã§ããã
C: ãã®ããŒã«ã®å
šãŠã®ã¡ãœãã㯠const ã§ãã¢ã¯ã¿ãŒã®ç¶æ
ã倿Žããããšã¯ã§ããŸããã
åå è
B: const ãšããã®ã¯ããŒã«ã®åããªã«ãã§ããïŒ
C: ããã§ããããŒã«ã®æçžãå¶çŽã®çš®é¡ã§ãã
C: ããŠãstage props (倧éå
·ã«ç±æ¥ããæ©æ§å) ã®äœ¿ãã©ããã¯ããããŸããïŒãªããžã§ã¯ãã¯2ã€ã®ããŒã«ãäžåºŠã«æŒãããããããŸãããåããªããžã§ã¯ããåãã€ã³ã¹ã¿ã³ã¹ã§äºåœ¹ãäžåºŠã«ããªãããšããããŸãããšãŠãè€éãªäŸãšããŠååž°å®è¡ã«ãªãã±ãŒã¹ãããããŸãããããå
çšäžãã£ãŠããåé¡ã®äžã€ã§ãè€æ°ååŒã³åºãããäºåæ¡ä»¶ã厩ããããšããããšããäŸã§ãããã®stage propsã¯ããŒã¿ãæŽæ°ããªããããåé¡ãèµ·ãããªãããã«ããããšãã§ããŸãã
C: ã¡ãã£ãšé£ãç®ã®äŸãèŠãŠã¿ãŸããããJavaã®ã°ã©ãæç»ã®ããŒã¿æ§é ã§ãããããã¯åŽ©ããšèšããããã³ãã³ã²ãŒã ã§ãã倿°ã®äžããã§ãã¯ãããããã¬ãå
¥ã£ãŠããŸãã700è¡ãããã®ããã°ã©ã ã§ãããã§ããŸãã
C: MPDããDCIãžã©ãå€é·ããŠãããã«ã€ããŠãããç¥ãããŠããããã«ã察象ã®ãã¡ã€ã³ãçè§£ããããšããå§ããŸããæ®ã©ã®å Žåãã€ã³ã¿ã©ã¯ãã£ããªããã°ã©ã ã¯ã¯ã©ã¹æåã®ããã°ã©ã ã§ã§ããŠããŸãããªããžã§ã¯ãæåããã°ã©ãã³ã°ãšã¯ãã¢ã©ã³ã»ã±ã€ãå®çŸ©ããããã«ããªããžã§ã¯ãå士ã®å調ã«ãããããã¯ãŒã¯ã§ãããããã©ããã£ãŠæèãããã«ã€ããŠã
GertrudãããšCoplienããã«ãããŠãŒã¶ãŒã¹ããŒãªãŒãã¢ãžã£ã€ã«ãšãªãŒã³ã¢ãŒããã¯ãã£
Gertrud ããïŒä»¥äžãGïŒ: çããã¯ãŠãŒã¶ãŒã¹ããŒãªãŒã¯ç¥ã£ãŠããŸããïŒãŠãŒã¹ã±ãŒã¹ã¯ïŒã¢ãžã£ã€ã«ã«ãªãããã«ã¯ãŠãŒã¶ãŒã¹ããŒãªãŒãããããäœããŸãããããªãŒã³ã«ãªãããã«ã¯ããŠãŒã¹ã±ãŒã¹ãå¿
èŠã
G: ãŠãŒã¶ãŒã¹ããŒãªãŒã®åœ¢åŒïŒãã©ãŒã ïŒãšããŠã以äžã®ãããªãã©ãŒãããã§èãããšããã§ãã
As a <USER or ROLE> äŸ: å£åº§ãæã£ãŠãã人ãšã㊠I want <FEATURE> äŸ: ããå£åº§ããå¥ã®å£åº§ã«ç§»ããããšããè¡çº So I can <MOTIVATION> ããããã°ãªã«ãã§ããããäŸãã°ããã€ã¢ã¢ã³ããè²·ã£ãŠãããããšãã§ããã
ãŠãŒã¶ãŒã¹ããŒãªãŒã®æ§æèŠçŽ ã¯ãã®ããã«ãªã£ãŠããŸããããããã¬ã€ã³ã¹ããŒãã³ã°ãªã©ã§ããããäœã£ãŠããã äžãããWhoãWhatãWhy ã«å¯Ÿå¿ããŠããã
G: ãŠãŒã¶ãŒããŒã«ã«ã¯ãå£åº§ãæã£ãŠãã人ãéè¡ã®åŸæ¥å¡ã(â»äŸãã°é»æ°ä»£ãæ¯æãããšããïŒåžæ°ãªã©ãããŸãã
G: ãéã®ééã¯ãä»åã®å Žåãå
šãŠã®ããŒã«ã§è¡ãã±ãŒã¹ããããããããããããã®ããŒã«ã§ããããäºã¯éããããŒã«ãã¢ãããŒã·ã§ã³ã«ãã£ãŠã³ã³ããã¹ããå€ãã£ãŠãããå®è£
ããåã«ãã¢ãããŒã·ã§ã³ããããã®ã§ãå®è£
ããããšãã§ãããããã¯å®è£
ããåã«ç¥ãå¿
èŠããããã§ãã
G: ãŠãŒã¶ãŒã¹ããŒãªãŒã®æŽãåºãã¯ããã¬ã€ã³ã¹ããŒãã³ã°ã§ãããŠããããããšããªãæ°ãå¢ããŠãããããããäžè¬çãªïŒâ»æœè±¡åºŠã®é«ãïŒç¶æ
ã«è¿ã¥ããŠãããããããã°ããŠãŒã¶ãŒã¹ããŒãªãŒãããŠãŒã¹ã±ãŒã¹ã«èœãšã蟌ãããšãã§ããã
G: ãŠãŒã¶ãŒã¹ããŒãªãŒã¯å
·äœçã§ãæœè±¡çãªã®ããŠãŒã¹ã±ãŒã¹ãã©ããŸã§æœè±¡çã«ããã¹ããïŒã³ãŒãã§çè§£ã§ããã¬ãã«ãŸã§ã§ãããŠãŒã¹ã±ãŒã¹ããªãŒããã«ã³ãŒãã«èœãšã蟌ãããšãããŸã§æã£ãŠããã®ãç®æšã«ãªãã
G: ãŠãŒã¶ãŒã¹ããŒãªãŒã¯ã€ã³ããããªã®ã§ããªãã¹ãããããã®å®äŸãåºããã»ãããããéè¡ã®æ¥åã§ããã°ãæã«äœ¿ã£ãŠããå°åæã®è©±ããŠãŒã¶ãŒã¹ããŒãªãŒãšããŠæœåºãããããã
G: ãŠãŒã¹ã±ãŒã¹ã®æ®µéã§èŠç¹ãå³å¯ã«æœåºãããããããã®ãŸãŸããã°ã©ã ã«äœ¿ãããããã
(ããã§äŒæ©ã«å
¥ããŸãã)
G: ãŠãŒã¹ã±ãŒã¹ã§å€§äºãªããšã¯ã¿ãŒããããžãŒïŒâ»çšèªïŒãã·ã¹ãã åæãšã·ã¹ãã èšèšã§åãããã£ãã©ãªãŒãã¿ãŒããããžãŒã䜿ã£ãŠãäºãã®åæãåã£ãŠããããšã倧äºãé¢ä¿è
ã®éã§åæããšãã®ã倧äºã«ãªã£ãŠããã
G: åæãšèšèšã§ãåãããã£ãã©ãªãŒãåãã¿ãŒããããžãŒã䜿ã£ãŠè©±ãããã®ã§ãçžäºã«äžè²«æ§ãããããããšãã§ããããã¡ããéãããŒã ã«è¡ããšèšèãå€ãã£ãŠããã
G: éè¡ã ã£ããéè¡å¡ã«ã話ãèããªããšãããªãããã¡ã€ã³ãšãã¹ããŒãã ãã§ã¯ãªããéè¡å¡ãããŒã ã«å
¥ã£ãŠã圌ãã®äœ¿ã£ãŠããçšèªãã³ãŒãã«èœãšã蟌ãã§ããããŠãŒã¹ã±ãŒã¹ã¬ãã«ã«ãªããšãã³ãŒãã®ã¹ãããã¬ãã«ãŸã§èœãšã蟌ããããã«ãªãã
G: ã³ã¢ã·ããªãªãšãµãã©ã€ãã·ããªãªãšããã®ããããã³ã¢ã·ããªãªã¯ã·ããªãªã®äžã§ãæ¬éã§å€§äºãªç©ããµãã©ã€ãã·ããªãªã¯ãäŸå€çã ã£ããæ¡åŒµãããŠãããè€éã ã£ãããããã®ãããã§ããã·ã¹ãã ã¯ãããããã®ãã«ããŒããªããã°ãªããªãã
åå è
: ãªããããµãã©ã€ãããšããçšèªã«ãããïŒ
G: ãªãªãžãã«ã®çšèªã¯ãã€ã³ã¯ã«ãŒããšãšã¯ã¹ã¯ã«ãŒãã ã£ãããã®äœ¿ãåãã¯ãããã«ããã®ã§ãã³ã¢ã·ããªãªãšãµãã©ã€ãã·ããªãªã«ããããŸãããããšã€ã·ã§ã³ïŒâ»deviation: éžè±ãè±ç·ãååïŒãšäžææã¯åŒãã§ãããã³ã¢ã·ããªãªãããªããªã«ãããããªæãã
G: ãŠãŒã¹ã±ãŒã¹ãšããçšèªã¯æãªããã®çšèªã§å€èãæããããã®ã§äœ¿ããªãæ¹åã§ãšããã®ã¯ãã
G: æèŠçã«ã¯ã³ã¢ã·ããªãªãã¹ã³ãŒãå
šäœã®80%ãæ®ãã¯ãµãã©ã€ãã·ããªãªãšããå²åã«ãªãã
G: ãµãã©ã€ãã·ããªãªã®ã»ããã¢ãžã£ã€ã«ã£ãœãããæ¹ã§é²ããŠããããããããè€éã ã£ãããå€ãããããã£ããããã®ã§ã
G: å
·äœçãªãŠãŒã¶ãŒã¹ããŒãªãŒããŠãŒã¹ã±ãŒã¹ã«èœãšããŠããæã«ãã©ããŸã§äžè¬åããã®ããäŸãã°ãéè¡ã§è³éç§»åããæã«äœ¿ãäžè¬çãªçšèªã¯ééãããšããçšèªãšããããããããšãèããŠã¡ããã©ããèœãšãæãèŠã€ããŠããã
C: éè¡å£åº§ã®æ®é«ããã€ãã¹ã«ãªã£ãæã«ãèªåçã«ææè
ã®ä»ã®å£åº§ããæ¯ãæ¿ããŠãã€ãã¹ãè£å¡«ãããããªãã·ã¹ãã èµ·åã®ãŠãŒã¶ãŒãé¢äžããªã圢ã§ã®ã·ã¹ãã ãªãã¬ãŒã·ã§ã³ãèãããMVCã¯ãšã³ããŠãŒã¶ãŒããèŠããããã«åºã¥ããããã°ã©ãã³ã°ã¢ãã«ãDCIã¯ããã°ã©ããŒãµã€ãã®ãŠãŒã¶ãŒã¢ãã«ã衚çŸããŠãããå
çšã®ããŠãŒã¶ãŒãã§ãŠããªãã·ã¹ãã ãªãã¬ãŒã·ã§ã³ã®ãããªã·ã¹ãã ãªãã¬ãŒã·ã§ã³ãèªç¶ã«æ±ãããšãã§ããã
G: ã¿ãŒããããžãŒããšãŠã倧äºãã¿ãŒããããžãŒã®ããŒã¿ããŒã¹ãäŒç€Ÿãæã£ãŠããŠãç·»å¯ã«å®çŸ©ããèŸæžãæã£ãŠããããããäŒç€Ÿã«èŸæžããããããã°ã©ã ã®äžã®å€æ°ããã¡ã€ã«åãªããããã®ããŒã¿ããŒã¹ãèŠãŠæ±ºããã èŸæžã«çšèªããªããã°ãèŸæžã«è¿œå ããã倿Žãããããã远å ãããšãã«ã¯ã¡ãããšç³è«ããªããã°ãããªãã
G: ãœãŒã¹ã³ãŒãã®äžã«ã¯ã³ã¡ã³ããæžããŠã¯ãããªããããã»ã©ã®èŸæžã䜿ã£ãŠããœãŒã¹ã³ãŒãããäŸãã°è±èªãããã€ãèªãªã©ã®èªç¶èšèªã«ãã®ãŸãŸç¿»èš³ãããã®ã§ããœãŒã¹ã³ãŒãäžã«ã³ã¡ã³ãããããšãã®å
容ããã¡ãã¡ç¿»èš³ããªããã°ãªããªããªãã
G: æåã«çãŸããåäŸãšåããããã®æ³šææ·±ãã§ååãã€ãããã
C: ããªã¢ãŒãã£ãºã ããªãããã³ãŒããèªã¿ãããã®ãããããªããããªã¢ãŒãã£ãºã ããããšãã¡ãœãããã©ãããåŒã³åºããããããããªãããããã°ã©ã ã®èŠéããæªããªããããã£ãã©ãªãŒã倧äºã ãæ§é ã倧äºãããç ç©¶ã§ã¯ããŠãŒã¹ã±ãŒã¹ã®ããããªç®æã«ã³ãŒãã忣ããããšãšã©ãŒçã70%å¢ãããšãã調æ»çµæãããã
C: ãªãŒã³ã¢ãŒããã¯ãã£ã®è¯ããšãããšããŠããšã©ãŒãæ©ãèŠã€ããããšãã§ããããšãããããã¹ããããŠãããšãã§ã¯ãªããã³ãŒããèªãã§ããæã«ãšã©ãŒã«æ°ã¥ãããšãã§ããã
C: ãã©ãŒãã¯çµã¿ç«ãŠãå®éã«ããŠããã¹ãã¯æåŸã«ç¢ºèªããŠãããããšã¿ã®å Žåã¯ãçµç«æã«ãã®å Žã§ãã¹ããããŠããããªãŒã³ã®ã¢ãããŒãã®1ã€ãšããŠãåé¡ãããæ©ãèŠã€ãããšããå©ç¹ãããã
C: ã¢ãžã£ã€ã«ãšãªãŒã³ã«ã€ããŠããªãŒã³ã¯ã¯ã©ã¹ã®æ§é ãéèŠããªãŒã³ã«ã³ã¹ãããããŠãã¢ãžã£ã€ã«ã§å®éã«ã©ã皌ãã§è¡ãããèãããã¢ãžã£ã€ã«ã¯ãªããžã§ã¯ãã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãéèŠã
C: ãã¡ã€ã³åæãšãŠãŒã¹ã±ãŒã¹åæãåæäžŠè¡çã«ãããåæäžŠè¡çã«ãããšéãªãå Žæããããã¿ããªããããåæã«å®è¡ããŠããã
C: éäžå
çãããšã¿ã«ããæã«æ°ã¥ãããããããã®åæããããªããã£ãŠé²ãã§ãããããããåºã身ã¢ãã«ãšãããïŒâ»ã©ã°ããŒã®ïŒã¹ã¯ã©ã ãåºã身ãæãŸãåã£ãŠããã§ããããŠã©ãŒã¿ãŒãã©ãŒã«ãšã¯éã£ãŠçãå
šãŠã®ããšãããããã¹ã¯ã©ã ã
C: ãªãŒã³ã¯é·ãæéã®ãã©ã³ãã³ã°ãå¿
èŠã§å€§äºã«ãªã£ãŠãããã¢ãžã£ã€ã«ã¯ãã£ãŒãããã¯ã«å¿ããå調æŽãèèŠããªãŒã³ã¯ãæ·±ãã¬ãã«ã®å°éå®¶ãäœããã¢ãžã£ã€ã«ã¯ãªãã§ãããã¿ãããªãšããããããã¹ã¯ã©ã ãšDCIã¯ãã®ãµãã€ã®ããšãããã
C: ãã¿ãŒã³ãåãããã«äž¡æ¹ã®ãã®ãå«ããããã¯æ¥æ¬ã®çŠ
ããæ¥ãŠãããšæããŸãããã¿ãŒã³ç³»ã®ã¬ã€ãã³ã¹ã«åŸã£ãŠãéãéã£ãŠãŽãŒã«ã«è¿ã¥ãããšã¯ã§ããã®ã§ã¯ãªããïŒãã¿ãŒã³ãã¹ã¯ã©ã ããããçšåºŠã®ã¬ãã«ã§ã¯DCIããã»ãšãã©ã¯æ¥æ¬ç±æ¥ã®ãã®ãéæã ãããããã
C: ãªãŒã³åŽã®ã»ãã¯ãæ¥æ¬ã®ããšã¿ã®ææ³ãå±±ç° ã²ãããšèšãæåãªãšã³ãžãã¢ã§ãã³ãã®äººãããšã¿ã«æãããïŒâ»åå
žèŠã€ããããïŒ
C: ã¢ãžã£ã€ã«ã®ã»ãã¯ãæ¥æ¬ã§ããç¥ãããæ¯å©ã§äŒããã®ã¯é£ããã§ãã⊠瀟äŒçæ§é ãéãã®ã§ããã³ããŒã¯ã¯ã瀟äŒããšãŠããã©ãããæ¥æ¬ã¯éå±€çãªãšããããããããã·ã¹ãã åãããŠããã®ã§ãè²ã
ãªã«ãŒã«ãååšãããæ¥æ¬ã¯ãããã¡ãã£ãšã¢ãžã£ã€ã«ã®ã»ãããšã¯ãµãµã€ãºãããšãããããããŸããã
C: å®éã®éçºã®æµãããã¡ã€ã³åæ â å
±éæ§å¯å€æ§åæ â ã¯ã©ã¹ â ã€ã³ã¿ãã§ãŒã¹ãAPIèšèšãæåã¯ã€ã³ã¿ãã§ãŒã¹ããæžããªããããããããã¹ã¿ããããã¯æžããããããªããå®è£
ã¯ãã€æžããïŒãŠãŒã¹ã±ãŒã¹ã®ã¿ã€ãã³ã°ã§ãJust In TimeããŠãŒã¹ã±ãŒã¹ãå¿
èŠãšããã€ã³ã¿ãã§ãŒã¹ã ããå®è£
ãããïŒâ»ã€ã³ã¿ãŒãã§ã€ã¹ãã¯ã©ã¹ã§å®è£
ããã®ã§ã¯ãªããã€ã³ã¿ãŒãã§ã€ã¹èªäœãå®è£
ããïŒã€ã³ã¿ãã§ãŒã¹ã¯æœè±¡çãªæŠå¿µã§ãããŒã«ã¯å
·äœçãªã€ã³ã¿ã©ã¯ã·ã§ã³ãã¢ã«ãŽãªãºã ãªã®ã§ããã®ã¿ã€ãã³ã°ã§ã
C: ãã®äžã§ãã©ãããã©ãŒã ãéçºããŠãã人ããã©ãããã©ãŒã éçºã¯ãªãŒã³ã§ã¯ãªãããããããçšæããŠãããã®ãã ãããªãŒã³ã§ã¯ãªãã䜿ããªããã®ãäœãæã¯äŒç€Ÿãå±ãªããªããããã¯ãç¡é§ãšèšããŸãã
C: DCIã¢ãŒããã¯ãã£ãå©çšããéçºã®é çªãšããŠã¯ããŸãã¢ãŒããã¯ãã£ãäœã£ãŠããããããããããŒã¿ããŒã¹ãšãGUIã®ã€ã³ã¿ãã§ãŒã¹ãäœããäŒç€ŸãšããŠãªã«ã売ãããšããã®ã¯ãããããããã©ã売ãã®ã¯ãŠãŒã¹ã±ãŒã¹ãããããã®ã¯ã©ã¹ã売ã£ãŠããããã§ã¯ãªãããŠãŒã¹ã±ãŒã¹ã¯ãããããã®ããŒã¿ããŒã¹ãšããµãŒããŒãšãã¯ã©ã€ã¢ã³ãã®ãŠãŒã¶ãŒã€ã³ã¿ãã§ãŒã¹ãªã©ãå°ããã€éãããã®ã
C: çç£æ§ãäžçªã®ç¡é§ãçããšãããšã¿ã®å€§éèäžããããã£ããã£ãŠããã
C: ãããã話ãããobject-compositionããšããã¡ãŒãªã³ã°ãªã¹ãã§è©±ãããŠããã®ã§ãå
¥ã£ãŠãã ãããã
C: 1æã«ãŸãæ±äº¬ã«æ¥ãã®ã§ããŸãããããäŒãéå¬ããŸãããïŒ
æåŸã«ãGertrudãããšCoplienãããšåå ã¡ã³ããŒã§éååçãæ®ããŸããã
NOTE: åœæ¥ã¯åæç¿»èš³ä»ãã®è±èªããŒã¯ã§ãããéèš³ã®ä»»ã快諟ããŠãã ãã£ãã @ganchiku ããã@remore ãããããããšãããããŸããããŸããèšäºãæžãã«ããã£ãŠã¯è±èªã®äžèš³ã§ @kuma_nana ããã«è²¢ç®ããŠããã ããŸããããã¡ããããããšãããããŸãããã¡ãããåœãã¹ãã®æè²¬ã¯å·çè
ã§ããç§ã«ãããŸãã
The trygve language project
ãã«ããã©ãã€ã ãã¶ã€ã³èªæžäŒ
[Reenskaug 2006] Trygve Reenskaug. MVC and DCA Example program comments
object-compositionã¡ãŒãªã³ã°ãªã¹ã
PHP Mentors -> Beyond MVC
PHP Mentors -> Debasish Ghoshæ°ã®ããã°èšäºããã¡ã€ã³é§åèšèšïŒå¯å€æ§ã®ç®¡çãã翻蚳ããŸãã
PHP Mentors -> PHPã«ã³ãã¡ã¬ã¹2015 PHPã¡ã³ã¿ãŒãºã»ãããŒãã¢ãã«ãèšèšããïŒâãã¡ã€ã³é§åèšèšãè¶
ããŠãåå ã¬ããŒã