10人ã®éçºè
ã«èšèšã«é¢ããæé«ã®ïŒãŸãã¯äŸ¡å€ã®ããïŒæ¬ã«ã€ããŠå°ãããšããã®ãã¡å°ãªããšã6人ãããã»ããŒãã£ã³ã®
æ¬PrinciplesãPatternsãand Agile Development TechniquesãåœåããŸãã ãã®åŸãããããããããã®èäœã®èå³æ·±ãç¹ã§åœŒããèŠããã°ã圌ãã®ã»ãšãã©ã¯é¡ãå°æãããå¿ãããããå€ããã§ãããã
ãã®ã¡ã¢ãèªããšãã¯ãåžžèãå«ããŠãç¥èãªãã®ãžã®æ»æãšã¯èããªãã§ãã ããã çµå±ã®ãšãããå§åçãªãããžã§ã¯ãã§æã«å·è·¡ãå°ãªããªããããã¿ãŒã³ããšããèšèã§èãå°ãéããæ°å¹Žåã«ãããèªãããšã¯ããªãå¯èœã§ãã ã ãããå€åããªãã¯æ°ããçµéšã®é«ããããå€å
žããèŠãã¹ãã§ããããïŒ
æ¬ã®æåã®ããŒãžãããMartinsã¯ãã¡ã³ãéåžžã«è»œãæããŠã次ã®ããã«æ¬ãéå§ããŸãã
ãç§ã®çµéšã§ã¯ã.NETããã°ã©ãã¯JavaãC ++ã§æžã人ããã匱ãããšããããããŸãã äŸå€ãããããšã¯æããã§ãã ãã ãããªã¹ããŒãäœåºŠãäœåºŠãèŠãŠã.NETããã°ã©ããŒã¯éåžžããœãããŠã§ã¢éçºæ¹æ³ãèšèšãã¿ãŒã³ãããã³ååãªã©ã«ããŸã粟éããŠããªããšçµè«ä»ããããŸããã çŸåšã®.NETããã°ã©ããŒã¯ããããã®åºæ¬çãªæŠå¿µã«ã€ããŠãŸã£ããèããŠããªãããšããããããŸããã ãã®ç¶æ³ã¯å€ããªããã°ãªããŸãã ããã®æ¬ã«åãçµãã§ããéã.NETã«æ§ããããæ¬ã®è¡šçŽã«èªåã®ååãèŒãããã©ããçåã«æãããšããããããŸããã .NETãšããã®ãã©ãããã©ãŒã ã«é¢é£ä»ããããŠãããã¹ãŠã®åŠå®çãªãã¥ãŒã«é¢é£ä»ããããã©ãããèªåããŸããã ãããããããæåŠããããšã®äœ¿çšã¯äœã§ããïŒ ç§ã¯.NETããã°ã©ããŒã§ãã ããïŒ ç§ã¯æè»ãª.NETããã°ã©ããŒã§ãã ãããŠãããèªãã«æã£ãŠããŸãããããã§ã¯ãæç²ã®.NETããŒã¯ãããŒãã£ã³ã®ä»²éããåŠã¹ãããšãèŠãŠã¿ãŸãããã
åå
äžè¬ã«ãSOLIDã®ãã¹ãŠã®ååã®èª¬æã¯éåžžã«ææ§ã«æããŸããã äžæ¹ã§ã¯ããããã®å€ãïŒDIPãOCPãªã©ïŒã¯éåžžã«å³å¯ã«è¡šçŸãããŠããŸããDIPã¯ç¹å®ã®åã®å€æ°ã®äœ¿çšãçŠæ¢ããOCPã¯åã³ã³ãã€ã«ãªãã®æ¡åŒµãæå³ããŸãã äžæ¹ãæã«ã¯ããããã®ååãè³¢ã䜿çšããå¿
èŠããããšããå®çšçãªã¡ã¢ãããæããŸãã
èå³æ·±ãç¹ã¯æ¬¡ã®ãšããã§ãã
ãæè»ãªããŒã ã¯ãããã®ååïŒSOLIDãæå³ããïŒãæªèã®é€å»ã«ã®ã¿é©çšããŸãã æªèããªããã°ãååã¯åœãŠã¯ãŸããŸããã ååã§ãããšããçç±ã ãã§ååãç¡æ¡ä»¶ã«å®ãã®ã¯ééãã§ãã æªèããªããããã®ååããããŸãã ãããã¯ãã·ã¹ãã å
šäœã«è±å¯ã«æ°ŽããŸãå¿
èŠãããéŠæ°Žã§ã¯ãããŸããã ååãé床ã«éµå®ãããšãäžå¿
èŠãªè€éãã®æªã«ã€ãªãããŸãããäžæ¹ã§ãããã¯éåžžã«å®çšçãªèŠ³ç¹ã§ãããäžæ¹ã§ãåŸãã¹ãã¿ã€ãã³ã°ãšåŸããªãã¿ã€ãã³ã°ã«é¢ããè¿œå ã®ã«ãŒã«ãå°å
¥ããããã«ããã®ãããªå³æ Œãªã¬ã€ãã©ã€ã³ã«åŸãå¿
èŠãããã®ã¯ãªãã§ããïŒ
å ããŠãããã§ã¯åå ãšçµæãæ··åãããŠããããã«æããŸããååã¯ãèšèšã«ããããææã®äººããå®çŸ©ããããã«ãŸãå¿
èŠã§ãããããããæé€ããã®ã«ã¯ãŸã£ãã圹ç«ã¡ãŸããã
以äžã¯ãåã«éåã§ããªãååã®èª¬æã§ãã
Lsp
ã掟çã¯ã©ã¹ãäœæãããšãã«ããŒã¹ã¯ã©ã¹ãå€æŽããå¿
èŠãããå Žåã¯ãããããèšèšã«æ¬ é¥ããããŸããããŸãã¯ãå¥ã®éžæè¢ããããŸããç§ãã¡ã¯ãé²åèšèšãéèŠãªéçºã¢ãããŒãã§ããçŸå®ã®äžçã«äœãã§ããŸãã
ãLSPã®åçã¯ãå®éã®ããã°ã©ã ã«å¿çšã§ããŸããïŒ ç§ãæ°å¹Žåã«åãçµãã ãããžã§ã¯ãããåã£ãäŸãèããŠã¿ãŠãã ãã... 1990幎代åé ã« ... "ãªãªãžãã«ã®æ¬ã¯2006幎åã°ïŒCïŒ2.0ãšäžè¬åã®ãªãªãŒã¹åŸïŒã«ãªãªãŒã¹ãããŸããããããæ°å¹Žå-ããã¯1990幎代ã®å§ãŸãã§ã
ããªã¹ã¯ä»£æ¿åçã¯ãOCPåçãå®è£
ããããã®äž»èŠãªããŒã«ã®1ã€ã§ãããOCPãéæããããã®ãªãã·ã§ã³ã®1ã€ã¯ããªã¢ãŒãã£ãºã ã§ãããLSPã¯ããªã¢ãŒãã£ãºã ãæåŸ
ã©ããã«æ©èœãããšèšããŸãã ããšãã°ãã³ãŒã«ããã¯é¢æ°ã«åºã¥ããŠãOCPãéæããããã®ãã®ä»ã®ãªãã·ã§ã³ããããŸãã
ãã§ã«LSPååã®åœ¢åŒåã«ã€ããŠè©±ããŠããå Žåã¯ãã³ã³ãã©ã¯ãã«ã€ããŠãç¶æ¿ã®æ£ããå®è£
ã®ããã®ãããã®åœ¹å²ã«ã€ããŠè©±ãåãå¿
èŠããããŸãã å¥çŽã¯æ¬ã§èšåãããŠããŸãããæåéãéãéããŸãã
ãã£ãã
ãã®ååã«ã€ããŠã®ãã詳现ãªæ¹å€ã¯ãèšäº
ãäŸåé¢ä¿ã®é転ã®ååã«é¢ããæ¹å€çãªèŠæ¹ãã«èšèŒãããŠããŸãã
ããããããã¯éåžžã«åã°ããéåžžã«ææ
çãªçµè«ã§ãïŒ
ãå®éããã®ãããªäŸåé¢ä¿ã®é転ã¯ããªããžã§ã¯ãæåèšèšã®å€§ããªå
åã§ãã ããã°ã©ã ãã©ã®èšèªã§æžãããŠãããã¯é¢ä¿ãããŸããã äŸåé¢ä¿ãéã«ãªã£ãŠããå Žåããªããžã§ã¯ãæåèšèšã«ãªããŸãã ãã以å€ã®å Žåãèšèšã¯æç¶ãåã§ãããéåžžã«ç©è°ãéžã声æãåæããŸãïŒ
Opc
Open-Closedååã®èè
ãBob Martinã§ã¯ãªããBertrand Meyerã®èæž "
Object-Oriented Design of Software Systems"ã«ããããšãç¥ã£ãŠãã人ã¯ããŸãããŸããã åæã«ãããã»ããŒãã£ã³ã圌èªèº«ã®æ¹æ³ã§ãã®ååã解éããããšã«æ³šæãæã人ã¯ããã«å°ãªããªããŸããã
Bob Martinããã®å®çŸ© ïŒ
ãœãããŠã§ã¢ãšã³ãã£ãã£ïŒã¯ã©ã¹ãã¢ãžã¥ãŒã«ãé¢æ°ãªã©ïŒã¯æ¡åŒµã®ããã«éãããŠããå¿
èŠããããŸãããå€æŽã®ããã«éããããŠããå¿
èŠããããŸãããããã£ãŠãã¢ãžã¥ãŒã«ã«ã¯2ã€ã®äž»èŠãªç¹æ§ããããŸãã
- ãããã¯æ¡åŒµã«å¯ŸããŠéãããŠããŸãã ããã¯ãã¢ãžã¥ãŒã«ã®åäœãæ¡åŒµã§ããããšãæå³ããŸãã ã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ãå€ãããšãå€åããèŠä»¶ãæºããæ°ããåäœãã¢ãžã¥ãŒã«ã«è¿œå ããŸãã ã€ãŸããã¢ãžã¥ãŒã«é¢æ°ã®æ§æãå€æŽã§ããŸãã
- å€æŽã®ããééãããŠããŸãã ã¢ãžã¥ãŒã«ã®åäœã®æ¡åŒµã¯ãã¢ãžã¥ãŒã«ã®ãœãŒã¹ã³ãŒããŸãã¯ãã€ããªã³ãŒãã®å€æŽã«é¢é£ä»ããããŠããŸããã æ§æå¯èœãªã©ã€ãã©ãªãDLLããŸãã¯EXEãã¡ã€ã«ã§ãã£ãŠããã¢ãžã¥ãŒã«ã®ãã€ããªå®è¡å¯èœè¡šçŸã¯å€æŽãããŸããã
Bertrand Meyerããã®å®çŸ© ïŒ
ã¢ãžã¥ãŒã«ã¯ãªãŒãã³ãšã¯ããŒãºã®äž¡æ¹ãå¯èœã§ãªããã°ãªããŸãããããã«ã
ãªãŒãã³ãã¹ãšã¯ããŒãº
ãã¹ã®æŠå¿µã¯æ¬¡ã®ããã«
å®çŸ©ãããŠããŸãã
- ã¢ãžã¥ãŒã«ã¯ããŸã æ¡åŒµå¯èœãªå Žåã ãªãŒãã³ãšåŒã°ããŸãã ããšãã°ãå€ãã®æäœãå±éããããããŒã¿æ§é ã«ãã£ãŒã«ããè¿œå ãããã§ããŸãã
- ã¢ãžã¥ãŒã«ã¯ ãä»ã®ã¢ãžã¥ãŒã«ã§äœ¿çšã§ããå Žåã ãã©ã€ããŒããšåŒã°ããŸãã ããã¯ãã¢ãžã¥ãŒã«ïŒæ
å ±é èœã®èŠ³ç¹ããã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒã«ãå³å¯ã«å®çŸ©ãããæçµèšè¿°ããã§ã«ããããšãæå³ããŸãã å®è£
ã¬ãã«ã§ã¯ãã¢ãžã¥ãŒã«ã®ã¯ããŒãºç¶æ
ã¯ãã¢ãžã¥ãŒã«ãã³ã³ãã€ã«ããã©ã€ãã©ãªã«ä¿åããä»ã®ã¢ãžã¥ãŒã«ïŒãã®ã¯ã©ã€ã¢ã³ãïŒã䜿çšã§ããããã«ããããšãæå³ããŸãã
èšãæãããšãMeyerã¯ã¢ãžã¥ãŒã«ã®ãªãŒãã³/ã¯ããŒãºãã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèªããMartinã¯ã€ã³ã¿ãŒãã§ãŒã¹ãšå®è£
ãå«ãã¢ãžã¥ãŒã«å
šäœããªãŒãã³/ã¯ããŒãºãããŸããåã³ã³ãã€ã«ããã«ã¢ãžã¥ãŒã«ã®åäœãæ¡åŒµããå¯èœæ§ã¯ãã¢ãžã¥ãŒã«ã®èŠä»¶ã«èšèŒããå¿
èŠããããååã«åºã¥ããã®ã§ã¯ãããŸããã
åæã«ãOpen-Closedååã®äŸãšããŠã
Drawã¡ãœãããåãã
Shapeã¯ã©ã¹ããŸã äžããããŠããããšã¯é¢çœãã§ããããã¯ãæ§é èšèšã®ãœãªã¥ãŒã·ã§ã³ãšæ¯èŒããŠãOpen-Closedååã«å¯Ÿå¿ããŠããŸãã ãããåæã«ãæ°ããã¿ã€ãã®FigureãŸãã¯æ°ããæäœãåºæ¬ã¯ã©ã¹
Shapeã«è¿œå ããå Žåããã®ãœãªã¥ãŒã·ã§ã³ãå±éçšã«éããŠå€æŽçšã«éããæ¹æ³ã«ã€ããŠã¯æ²é»ããŠããŸãã
ISP
æ¬ãèªãã§ããéãç§ã¯æ¬ããŒãããæžãããã®ã§ã¯ãªãã第2çã§ããããã®äŸãCïŒã«ç¿»èš³ãããŠãããšç¹°ãè¿ãæããŸããã ããã«ããã®æ¬ã¯ãé¡ã«æ²¿ã£ãŠãããçŽãããŠããã.NETãã©ãããã©ãŒã ã®ã€ãã£ãªã ã䜿çšããŠåŠçãããŸããã
ãã®ããããã£ã®æãåªããè¡šçŸã®1ã€ã¯ãã€ã³ã¿ãŒãã§ã€ã¹åé¢ã®ååã®èª¬æã«èšèŒãããŠããäŸã§ãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®åé¢ã®åçã¯ã2ã€ã®äŸã§æ€èšãããŸãã1ã€ã¯ã
Door ïŒDoorïŒã®ã¯ã©ã¹ãš
TimedDoorã®ãµãã¯ã©ã¹ãæã€ã»ãã¥ãªãã£ã·ã¹ãã ã§ããã¢ããã°ããéããããªãå Žåã«å¯èŽä¿¡å·ãçºãããã®ã§ãã ãã®åé¡ã解決ããããã®ãªãã·ã§ã³ã®1ã€ã¯ããå§ä»»ã«ããåé¢ãã»ã¯ã·ã§ã³ã§èª¬æãããŠãããèè
ã«ããã°ãISPãæºãããŸãã

èè
ã¯ããã«ã€ããŠæ¬¡ã®ããã«æžããŠããŸãã
ããã®ãœãªã¥ãŒã·ã§ã³ã¯ISPã®ååãšäžèŽããŠãããDoorã¯ã©ã€ã¢ã³ããšTimerã¯ã©ã¹ã®éã«æ¥ç¶ãäœæããŸããã ...ããããããã¯ããŸãã«ããšã¬ã¬ã³ãã§ã¯ãããŸããã ã¿ã€ã ã¢ãŠããç»é²ãããã³ã«ãæ°ãããªããžã§ã¯ããäœæããå¿
èŠããããŸãããã®ã»ã¯ã·ã§ã³ãèªãã åŸãç§ã¯è¥ãããŒãã£ã³ïŒ.NETã®æ¯åïŒããããèªãã åŸã«èšãã¹ãããšãæ³åããŸããã
ãPaãèããŠãã ããããã®ãã¶ã€ã³ãªãã·ã§ã³ã¯ææ°ã®ãã®ã§ã¯ãªãããšãç解ããŠããŸããããªããšç§ã¯äžããæ¬ãæžããŠããããã§ã¯ãããŸããããããã§ã...
çµå±ã®ãšããã2ã€ã®äœåãªã¯ã©ã¹ããããŸããã
timeoutIdãåãå
¥ãã
TimedDoorã¯ã©ã¹ã®
DoorTimeoutã¡ãœããã«ã€ããŠã¯
ãããªãã¯ããŸã£ãã
åŒãè£ãããŸãïŒ çµå±ã®ãšããã.NETã«ã¯æåããã¿ã€ããŒãããããããã®ããªãã¶ãŒããŒãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãªãã€ãã³ãã«åºã¥ããŠæ§ç¯ãããŸãã ãããã£ãŠã
TimerClientãš
DoorTimerAdapterãç Žæ£ã ã
DoorTimeoutã¡ãœãããéããããšãã§ããŸãïŒããã«ããã®timeoutIdã
ç Žæ£ããããšãã§ããŸãïŒã
ãããã£ãŠãèšèšã®èŠ³ç¹ããã¯ãã³ãŒãã¯ããã¯ãªãŒã³ã«ãªããå®è£
ã®èŠ³ç¹ãããåæ§ã«ãªããŸãã ãããã£ãŠããã®äŸãæšãŠãŠãCïŒã®ã€ãã£ãªã ã®ããã«ç« ãå®å
šã«åŠçããå¿
èŠããããŸããããããªããšãã³ãã¥ããã£ã¯ãã®ãããªåµé æ§ãèªããªããããããŸããïŒ
ããããæããã«ãã®ãããªäŒè©±ã¯ãããŸããã§ããïŒ ãããã£ãŠããã®ç« ã§ã¯ãéåžžã®CïŒã¢ããªã±ãŒã·ã§ã³ã§ã¯èŠã€ããããšãã§ããªãéåžžã«æªãäŸã瀺ããŸãã
UML
ãéçãã€ã¢ã°ã©ã ã¯ãããã°ã©ã ã®äžå€ã®è«çæ§é ãã€ãŸãèŠçŽ ãã€ãŸãã¯ã©ã¹ã ãªããžã§ã¯ã ãããŒã¿æ§é ãããã³ãããã®éã®é¢ä¿ãèšè¿°ããŸããããªããžã§ã¯ãã¯ãããã°ã©ã ã®äžå€ã®è«çæ§é ãã®äžéšã§ã¯ãããŸããã
ãé¢é£ä»ãã¯åçŽãªé¢ä¿ã§ããããããªããžã§ã¯ããå¥ã®ãªããžã§ã¯ããžã®ãªã³ã¯ãä¿æããå¥ã®ãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºããšããäºå®ããæããŸãããé¢é£ä»ãã¯ããªã³ã¯ã®ä¿åãæå³ãããã®ã§ã¯ãããŸããã ã¯ã©ã¹
Aã
ã·ã³ã°ã«ãã³ãçŽæ¥äœ¿çšããå Žåããªã³ã¯ã¯ãããŸããããé¢é£ä»ãããããŸãã
ãæ§æã¯ãéèšã®ç¹æ®ãªã±ãŒã¹ã§ãã ç¹°ãè¿ããŸãããå®è£
ã¯äžè¬çãªé¢é£ä»ããšåºå¥ã§ããªãããšã«æ³šæããŠãã ããã ä»åã¯ããã®é¢ä¿ã¯C ïŒ ããã°ã©ã ã§ã»ãšãã©äœ¿çšãããªãããã§ããããã§ãå¶åŸ¡èšèªã§ã¯ãå
šäœãã³ã³ããŒãã³ãã®å¯¿åœãå³å¯ã«å¶åŸ¡ããŠããå ŽåãçŽç²ãªæ§æãéæããããšã¯äžå¯èœã§ãããšèšããªããã°ãªããŸããã ããããè«ççãªèŠ³ç¹ãã話ããšãéçºè
ãäŸåé¢ä¿ã®é転ã®ååãä¹±çšããªãå ŽåãCïŒã§ã®åæãéåžžã«é »ç¹ã«äœ¿çšãããŸãã
ãã¿ãŒã³
æ¬ãååãšãã¿ãŒã³ã説æããŠããã®ã¯éåžžã«èå³æ·±ãã§ãããäžéšã®èª¬æã¯ä»ã®èª¬æã«ã»ãšãã©äŸåããŸããã ãããã£ãŠãDIPãã¿ãŒã³ã§èª¬æãããŠããåé¡ã®å€ãã¯ããªãã¶ãŒããŒãæŠç¥ãããã³ã¡ãã£ãšãŒã¿ãŒã«ãã£ãŠæ£åžžã«è§£æ±ºãããŠããŸããããã®ååã説æããéã«ãã¿ãŒã³ã¯å®éã«ã¯èšåãããŠããŸããã ãŸãã¯ã
Singletonã®åé¡ã説æãããšãããã¹ãŠã®ãŠãŒã¶ãŒãDIPã«éåãããã¹ã容ææ§ã«åé¡ããããšèšããªããã°ãªããŸãããããããã®é¡äŒŒç¹ã¯æãããŠããŸããã
ä»ãå°ãç¹ç°æ§ã
ãã¡ãµãŒããšã¡ãã£ãšãŒã¿ãŒ
ããã®ç« ã§èª¬æãããã¿ãŒã³ã«ã¯ã1ã€ã®ç®æšããããŸãããªããžã§ã¯ãã®ã°ã«ãŒãã«äœããã®ããªã·ãŒã課ãããšã§ãã ãã¡ãµãŒãã¯äžããããªã·ãŒã課ããã¡ãã£ãšãŒã¿ãŒã¯äžããããªã·ãŒã課ããŸãã ãã¡ãµãŒãã¯è¡šç€ºãããå¶éã課ãããŸããã¡ãã£ãšãŒã¿ãŒã¯è¡šç€ºããããäœãå¶éããŸããããããŒã«80å·Šã¬ãã«ïŒ ãããã£ãŠã2ã€ã®æŠå¿µã®éã«å
±éã®åºç€ãèŠã€ããããšãã§ããããããååšããªãå Žåã§ãããããã®éãã®ãããã§ãããã1ãæã«ãŸãšããããšãã§ããŸãïŒ
ãããã®ãã¿ãŒã³ã«ã¯å®éã«ã¯å
±éç¹ã¯ãªããããŸããŸãªã«ããŽãªãŒïŒãã¡ãµãŒã-æ§é ãã¡ãã£ãšãŒã¿ãŒ-è¡åïŒã«å±ããããŸããŸãªæœè±¡åã¬ãã«ã§ããŸããŸãªåé¡ã解決ããããã«èšèšãããŠããŸãã æ¬ã®ç« ã¯ãã¯ã©ã¹ãã¢ãžã¥ãŒã«ãšåãããããŸãšãŸããããã¹ãã§ããã1ã€ã®å Žæã§ç°çš®ã®æŠå¿µã説æããããšããè©Šã¿ã¯çãããããã§ãã
ãã³ã¬ãŒã¿
ãããŒã¿ããŒã¹ãæäœããããã«ãã³ã¬ãŒã¿ã䜿çšããæ¹æ³ã¯2ã€ãããŸãã èªã¿åãããã³æžã蟌ã¿ã®ã¡ãœãããè¿œå ããŠããžãã¹ãªããžã§ã¯ããè£
食ããããããžãã¹ã«ãŒã«ãæäŸããŠãèªèº«ã®èªã¿åãããã³æžã蟌ã¿æ¹æ³ãæ¢ã«ç¥ã£ãŠããããŒã¿ãªããžã§ã¯ããè£
食ããããšãã§ããŸãã åŸè
ã®ã¢ãããŒãã¯ããªããžã§ã¯ãæåããŒã¿ããŒã¹ãæäœãããšãã«ãã䜿çšãããŸããWTFïŒïŒ ãã³ã¬ãŒã¿ã®æ¬è³ªã¯ãè£
食ããããªããžã§ã¯ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå€æŽããã«åäœãå€æŽã§ããããšã§ãã ãèªã¿åãããã³æžã蟌ã¿ã¡ãœããã§ãããè£å
ãããåäžã®ä»®æ³ã¡ãœãããåå®çŸ©ããªãå Žåãçµæã®ã¯ã©ã¹ã¯é©åãªãã³ã¬ãŒã¿ãŒã«ãªããŸããïŒ
ã¯ããæ£åŒã«ã¯ããã³ã¬ãŒã¿ãŒã䜿çšããŠæäœãè¿œå ã§ããŸãããåºæ¬çã«æ°ããæäœãè¿œå ããã®ã§ã¯ãªããæ¢åã®ã¯ã©ã¹ã®æ©èœãæ¡åŒµããå¿
èŠããããŸãã ããã§ãããã³ã¬ãŒã¿ã¯ã顧客ã®è²¬ä»»ããªããžã§ã¯ãã«åçã«åçã«è¿œå ããããã«ã䜿çšãããŸãã
蚪åè
ããã®äŸåãµã€ã¯ã«ã¯ã蚪åãããã¹ãŠã®ãµãã¯ã©ã¹ïŒãã¹ãŠã®ã¢ãã ã¿ã€ãïŒããªã³ã¯ããããã蚪åè
ã段éçã«ã³ã³ãã€ã«ãããã蚪åããéå±€ã«æ°ãããµãã¯ã©ã¹ãè¿œå ãããããããšã¯å°é£ã§ãããæããã«ãéžæããããã©ã°ã¡ã³ãã¯ãC ++ããCïŒãžã®ç§»è¡åŸã«æŽæ°ãããŠããŸããã
ãããã«æªãããšã«ããã£ã¹ãé床ã¯éå±€ã®å¹
ãšæ·±ãã«äŸåããå¯èœæ§ããããããäºæž¬ãå°é£ã§ãããå®è£
ã®å€éç¶æ¿ãããç°å¢ã§ã¯ã倧ããªéå±€ããã£ã¹ãã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããã.NETã®ãããã®åèªã®èšŒæ ãèŠã€ããããšãã§ããŸããã§ããã
ç¶æ
第36ç« ã§ã¯ãåçŽãªãã¯ãã«ïŒ
IListåã®ãã£ãŒã«ãïŒã«åºã¥ããŠäœæãããå€æããŒãã«ã«ã€ããŠèª¬æã
ãŸã ãããã«ããã次ã®ã¢ããã€ã¹ãåŸãããŸãã
ããã®ãœãªã¥ãŒã·ã§ã³ã®æ¬ ç¹ã¯ãäž»ã«çç£æ§ãäœãããšã§ãã å€æããŒãã«ã§ã®æ€çŽ¢ã«ã¯æéãããããŸãã ã¹ããŒããã·ã³ãéåžžã«å€§ããå Žåãæ€çŽ¢æéãé¡èã«ãªãå¯èœæ§ããããŸããé·ç§»è¡šã«åºã¥ã
ç¶æ
ãã¿ãŒã³ã¯ãéçºã³ã¹ã/å¹çã®ç¹ã§æãæåãããœãªã¥ãŒã·ã§ã³ã®1ã€ã§ãããšåžžã«èããŠããŸããã ãããããã¡ãããå
žåçãªè§£æ±ºçã¯ãOïŒ1ïŒé·ç§»æ€çŽ¢ã®è€éããæäŸããèŸæžã®äœ¿çšã䌎ããŸãã
ãã³ãã¬ãŒãã®æ¹æ³ãšæŠç¥
ããã¿ãŒã³ãã³ãã¬ãŒãã¡ãœããã¯å®éã«ã¯äœ¿ããããã§ãããååãªæè»æ§ããããŸããã Strategyãã¿ãŒã³ã«ã¯å¿
èŠãªæè»æ§ããããŸãããè¿œå ã®ã¯ã©ã¹ãå°å
¥ããè¿œå ã®ãªããžã§ã¯ããäœæããŠã·ã¹ãã ã«çµã¿èŸŒãå¿
èŠããããŸãããããã£ãŠããããã®ãã¿ãŒã³ã®éžæã¯ãStrategyã®æè»æ§ãå¿
èŠããTemplateã¡ãœããã®ã·ã³ãã«ãã楜ããæºåãã§ããŠãããã«ãã£ãŠç°ãªããŸãããã¿ãŒã³ã®æè»æ§ã®æ¬ åŠãã³ãã¬ãŒãæ¹åŒã¯æ¬ ç¹ã§ã¯ãªããæ©èœã§ãã çžç¶äººã«ãã䟿å©ãªæ¡åŒµã®ããã®ã¯ã©ã¹ã®éçºã¯åçŽãªã¿ã¹ã¯ã§ã¯ãªããããåºæ¬ã¯ã©ã¹ã¯ãçžç¶äººãæŒã蟌ãŸãªããã°ãªããªããã¬ãŒã ã¯ãŒã¯ãæäŸã§ããŸãã
åäœãã¹ã
ããã»ããŒãã£ã³ã¯TDDã®æåãªæ¯æè
ã§ãããå¥çŽã®èŠ³ç¹ãããã¶ã€ã³ã«ã€ããŠèããããšã奜ã¿ãŸãã ãã®çµæãå®è£
ã¯åææ¡ä»¶ãäºåŸæ¡ä»¶ã§ã¯ãªããã¹ãã«ãã£ãŠãé§åãããããããæ¬ã®ã³ãŒãã«ã¯ããã€ãã®ãã°ããããŸãã 詳现ã«ã€ããŠã¯ãèšäº
ãå¥çŽãã¹ããŒã¿ã¹ããŠããããã¹ãããåç
§ããŠãã ãã ã
Martinåäœãã¹ãã«ã¯ããã€ãã®åé¡ããããŸãã ãŸããèšå€§ãªæ°ã®ãã¹ããããŒã¿ããŒã¹ã«éããããããæ¬è³ªçã«çµ±åãã¹ãã«ãªããŸãã 2006幎ã«2ã€ã®æŠå¿µã«æ確ãªåé¢ããã£ããã©ããã¯ããããŸããããçŸåšããããã®æŠå¿µã®éãã¯å€ããå°ãªããæããã§ãã
ãã©ãŒã«ã³ãŠããããã¹ããšã¯ãã³ãŒãã®ãã°ããŸãã¯å°ãªããšãæå³ããåäœãšå®éã®åäœã®äžäžèŽãæå³ããŸãã çµ±åãã¹ãã®å€±æã¯ãç°å¢åé¡ã«èµ·å ããå¯èœæ§ããããããäœãæå³ããŸããã ãŠããããã¹ãããã«ãã«èœã¡ãŠãã¹ãŠã®ãã«ãã§å®è¡ãããçµ±åãã¹ãã¯å¥ã®ã¢ã»ã³ããªã§å®è¡ãããããã»ã©é »ç¹ã«å®è¡ãããªãã®ã¯ãã®ããã§ãã第äºã«ãããŒãã£ã³ã¯ååã«åŸã£ãŠæžããããã¹ããå€ãããããšãåŒçšããŠããŸãïŒãã¹ãŠã®ã¯ã©ã¹ã®å²ãåœãŠãããã€ã³ã¿ãŒãã§ãŒã¹ããã¹ãã®äœæã幞çŠã ãã®ã¢ãããŒãã¯ãæ°ãæéãã®æ¹æ³ã§äœæ¥ããåŸãã«ãã¬ããžã¯è¯å¥œã§ããããã¶ã€ã³ãæªãã³ãŒããååŸããããšãæ°ã«ããŸãã
ãã¡ããã次ã®ããã«èšãããšãã§ããŸããããŸããããã¯ãŸã æ¬ã®ç¬¬2çã§ãããåçã®ãªãªãžãã«ã¯2002幎ã«ãã§ã«åºãŠããã®ã§ããã¹ãŠãç°ãªã£ãŠããŸããïŒã ãããã2006幎ã«ç¬¬2çãçºè¡ãããèè
ã¯åŸãããçµéšã«åºã¥ããŠæ¬ã®å
容ãæŽæ°ããæéããããŸããã ããããããã¯ãã€ã³ãã§ããããŸããã åçïŒããæ£ç¢ºã«ã¯1幎åŸïŒã®ãªãªãŒã¹äžã«ããšãã³ã¹ã¯æžç±
ãDomain-Driven DesignããåºçããŸãããããã¯ãèšèšããã¹ããè€éããä»ã®å€ãã®åé¡ãšã®æŠãã«é¢ããããå®çšçãªèŠè§£ã瀺ããŠããŸãã Evansã¯ãäžå€æ§ã®å©ç¹ãããžãã¯ãåçŽãªãªããžã§ã¯ãïŒå€ãªããžã§ã¯ããšåŒã°ããïŒã«è»¢éããããšã«ã€ããŠã®èããæ¢ã«èŠãŠããŸããã»ãšãã©ã®å Žåãè€éãªè€åãªããžã§ã¯ãããã®ãããªé«ã¬ãã«ã®ã¡ãã£ãšãŒã¿ãŒã«ãªãããã«èšèšãå€ããããšãã§ããŸãã
ãã®çµæããã§ã«æåã®æ®µéã§ããã€ã³ã¿ãŒãã§ã€ã¹ãšãã¹ãã匷調ããã代ããã«ãå¥ã®ã¢ãããŒããååšããããšãããã£ãŠããŸãããåäœããä»ã®ã¯ã©ã¹ã«ãå€éšç°å¢ã«ãäŸåããªãã¯ã©ã¹ã«åé¢ããŸãã 次ã«ãå®çžŸã®ããäœã¬ãã«ã¯ã©ã¹ã«åºã¥ããŠæ§ç¯ãããé«ã¬ãã«ã¯ã©ã¹ãäœæããŸãã ãã®çµæãå®è¡æã«åäœã眮ãæããæ©èœãã¢ããªã±ãŒã·ã§ã³ã§å¿
èŠãªå Žåã«ã®ã¿ã€ã³ã¿ãŒãã§ã€ã¹ã匷調衚瀺ãããã匷åºãªåºç€äžã«æ§ç¯ãããéå±€ã·ã¹ãã ãåŸãããŸãã
泚ããã«ã€ããŠã¯ã
ããã¹ãæžã¿ãã¶ã€ã³vs. è¯ããã¶ã€ã³ ã
ãèå³æ·±ãããšã«ãåããããã¯ã§ãå¥çŽå¯Ÿ ãŠããããã¹ãã§ã¯ãMartinãšKoplienããã£ãŒãã£ãŒããèå³æ·±ãInfoQãããªããããŸãïŒ
CoplienãšMartin Debate TDDãCDDãããã³ãããã§ãã·ã§ããªãºã ã²ã©ããã¹ãã®è¯ãäŸ
ãŸããæ¬ã¯ããªããããŒããŒããéžæããå¿
èŠããããã¹ãã®äŸãæäŸããŸãã ãããã®1ã€ã次ã«ç€ºããŸãã
[Test] public void LoadingEmployeeDataCommand() { operation = new LoadEmployeeOperation(123, null); SqlCommand command = operation.LoadEmployeeCommand; Assert.AreEqual("select * from Employee " + "where EmpId=@EmpId", command.CommandText); Assert.AreEqual(123, command.Parameters["@EmpId"].Value); }
ãã®ãã¹ãã¯äœããã§ãã¯ããŸãããåæ Œããå Žåããã¹ããšã¯ã©ã¹ã®ã³ãŒãã¯åãã§ããããšãæå³ããŸãããæäœãæ£ããå®è£
ãããŠãããšã¯èšããŸããã ããã§ãããã¹ãã¯ãã¹ããããã³ãŒããšæ¯èŒããŠããæœè±¡çã§ããå¿
èŠããããŸããããã§ãªãå Žåããããã¯åœ¹ã«ç«ããªããªããŸãã
.NET
æ¬ãèªãã§ãããšããããã¯æ¬ã®ç¬¬2çã§ãããCïŒèšèªã«ãããã«é©åããŠããããæ°ããããã°ã©ãã³ã°èšèªã®ã€ãã£ãªã ã䜿çšããŠå®å
šã«åŠçãããŠããªãããã«æããŸãã å€ãã®å Žæã§ãJavaåœåã®ã€ãã£ãªã ã䜿çšããïŒå°æåã®ã¡ãœããåCONSTANTS_WRITE_THE_ SOKïŒã
Mainã¡ãœããããã¡ã€ã³ãªããžã§ã¯ãã«è¿œå ãããã¢ã»ã³ããªã®ä»£ããã«ãããã±ãŒãžãã®æŠå¿µã䜿çšãããå ŽåããããŸãã äŸã«ã¯æšæºã®.NETã€ãã£ãªã ããããŸããããªãã¶ãŒããŒã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããã€ãã³ãã¯äœ¿çšãããŸããã
readonly修食åã¯äœ¿çšãããŸããããªãœãŒã¹ãæã€ã¯ã©ã¹ã¯
IDisposableãªã©ãå®è£
ããŸããã äžè¬åã¯äœ¿çšãããŸããããæ¬ãç»å Žãã1幎åã«ç»å ŽããŸããã
æãé倧ãªééãã®1ã€ã¯ã次ã®ãµã€ãããŒãã©ãã«è¡ããŸãããïŒãã«èšèŒãããŠããŸãã
ãäžè¬çã«èšãã°ãç¹ã«ãã®æŠå¿µãå€ããå¯èœæ§ãããå Žåã¯ãããã«çŽäº€ããç¹å®ã®æŠå¿µãååã«å«ããã¹ãã§ã¯ãããŸããã ããšãã°ã ICommandãã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãªãæœè±¡ã¯ã©ã¹ã«ãããå Žåã¯ã©ãã§ããããïŒ ICommandãžã®ãã¹ãŠã®åç
§ãæ€çŽ¢ããããããCommandã«çœ®ãæããŸããïŒ ãã®å€æŽã®åœ±é¿ãåãããã¹ãŠã®ã¢ã»ã³ããªãåã³ã³ãã€ã«ããŠå±éããŸããïŒ ãç§èŠã
ããªãã®ã€ãã£ãªã ã§å¥ã®èšèªã«æ¥ãããããããªãèªèº«ã®ãã£ãŒã¿ãŒã§å€åœã®ä¿®éé¢ã«æ¥ãæ¹ãç°¡åã§ãã Javaã§ããã°ã©ã ããå Žåãèªåã®å¥œã¿ã«é¢ä¿ãªãããŒã«ã«ã®åœåæ³ã䜿çšããŸããããã¯æ£ããã§ãïŒ ãããããã®ãµã€ãããŒã®äœããããç§ã¯è°è«ã奜ãã§ãã
è¥ãããŒãã£ã³ã¯ããšã³ãã£ãã£ã®ååãå€æŽãããã©ããã«é¢ä¿ãªããã€ã³ã¿ãŒãã§ã€ã¹ããæœè±¡ã¯ã©ã¹ãžã®ç§»è¡ãæœåšçãªé倧ãªå€æŽã§ããããšãé·èã«äŒããªãã£ãããã§ãããããã«ããŠããããã®å€æŽã®åœ±é¿ãåãããã¹ãŠã®ã¢ã»ã³ããªãåã³ã³ãã€ã«ããŠãããã€ãããå¿
èŠããããŸãïŒ åæ§ã®å€æŽã§ãªã³ã¶ãã©ã€ã§ã¢ã»ã³ããªã亀æããããšãããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãïŒ
ãã©ã€ã ãžã§ãã¬ãŒã¿ãŒ
Martinsã¯ç¶æ
ãéåžžã«å¥œãã§ãããããçŽ æ°ãžã§ãã¬ãŒã¿ïŒpã80ïŒããªãã¡ã¯ã¿ãªã³ã°ãããšãã«ãéçãã£ãŒã«ããå²ãåœãŠãããŸããã
ã3ã€ã®é¢æ°ã®å²ãåœãŠã«ãããããã€ãã®ããŒã«ã«å€æ°ãã¯ã©ã¹ã®éçãã£ãŒã«ãã«å€æã§ããŸããã ãã®çµæãã©ã®å€æ°ãå®éã«ããŒã«ã«ã§ãããã©ã®å€æ°ãããåºãã¹ã³ãŒããæã£ãŠããããããæ確ã«ãªããŸããã
class PrimeGenerator { private static bool[] crossedOut; private static int[] result; public static int[] GeneratePrimeNumbers(int maxValue) { return null; }
ç§ã¯ãã£ãŒã«ãã§äžéçµæãç¶æããããšã®æãç解ããŠããŸããã ããŒã«ã«å€æ°ãéããŒã«ã«å€æ°ããåé¢ããå Žåãã¡ãœããã®åŒæ°ãããã«é©ããŠããŸããå
±æç¶æ
ã䜿çšããå¿
èŠã¯ãããŸããã
å
±æç¶æ
ã¯ã³ãŒããè€éã«ãïŒåŒã³åºãã®é åºãéèŠã«ãªããŸãïŒãç°ãªãã¹ã¬ãããã䞊è¡ããŠçŽ æ°ãååŸããããšãäžå¯èœã«ãªããŸããããã¯ãéçã¯ã©ã¹ã¡ã³ããŒã¯ã¹ã¬ããã»ãŒãã§ããå¿
èŠããããšè¿°ã¹ãŠãããã¬ãŒã ã¯ãŒã¯èšèšã¬ã€ãã©ã€ã³ã®äžè¬ã«åãå
¥ããããŠããèŠåã«éåããŠããŸãã
ã³ãŒããããã®æ¬ã®ãªãªãŒã¹ã®1幎åã«åºãŠããã€ãã¬ãŒã¿ãããã¯ã䜿çšããªããšèšã£ãŠããã®ã§ã¯ãããŸããã
SocketServer
ãã®ã³ãŒãã¯251ããŒãžã§èª¬æãããŠãããæ¬ã«ä»å±ã®äŸã«ã¯å«ãŸããŠããŸããã ããã«çœ®ããŸã ã
public interface SocketService { void Serve(Socket s); } public class SocketServer { private TcpListener serverSocket = null; private Thread serverThread = null; private bool running = false; private SocketService itsService = null; private ArrayList threads = new ArrayList(); public SocketServer(int port, SocketService service) { itsService = service; IPAddress addr = IPAddress.Parse("127.0.0.1"); serverSocket = new TcpListener(addr, port); serverThread = new Thread(new ThreadStart(Server)); serverThread.Start(); } public void Close() { running = false; serverThread.Interrupt(); serverSocket.Stop(); serverThread.Join(); WaitForServiceThreads(); } private void Server() { serverSocket.Start(); running = true; while (running) { Socket s = serverSocket.AcceptSocket(); StartServiceThread(s); } }
ã³ãŒãã«ã¯2ã€ã®ã¿ã€ãã®åé¡ããããŸãïŒç¬¬1ã«ããããã¯ãèªã¿åãå°çšã®æ¬ åŠã IDisposableã€ã³ã¿ãŒãã§ã€ã¹ã®æ¬ åŠããªãã¶ãŒããŒãå®è£
ããããã®ã€ãã³ãã®ä»£ããã®ã€ã³ã¿ãŒãã§ã€ã¹ã®äœ¿çšãéåææäœã.NET Frameworkã®æåã®ããŒãžã§ã³ããå©çšå¯èœãªå Žåã®ãããŒã®æåæäœãããã³äŸå€åŠçã®æ¬ åŠãªã©ã®äºçŽ°ãªåé¡ã§ãã
ããããæãéèŠãªããšã¯ããã®ã³ãŒãã¯èšèšãäžååãªäŸã§ãã SocketServer ã ServiceRunnerãããã³SocketServiceã¯ã©ã¹ã®åœ¹å²ã¯ ãããŸã㧠ããã ã«ããã§ãã
ããšãã°ã SocketServiceã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¯ã©ã¹ããããŸãã Serve ïŒSocket s ïŒã¡ãœããã§äœãã§ããŸããïŒ ã©ããããããã圌ã¯ãã®ã¡ãœãããå¥ã®ã¹ã¬ããã§åŒã³åºããããšèšã£ãŠããŸããïŒ ãã ãããã芪ãœã±ãããéããŠããããšãšãæäœãäžæããå¿
èŠãããããšãã©ã®ããã«ããŠç¥ãã®ã§ããããïŒ ãããããã®ã¡ãœããã§Receiveã¿ã€ãã®ããããã³ã°ã¡ãœãããåŒã³åºãããšãå¯èœãã©ããããŸãã¯ç¬èªã®ç¡éã«ãŒãããããå¿
èŠããããã©ãããã©ã®ããã«ç解ããã®ã§ããããïŒ
ã³ãŒãã®ãã¹ããæžãããšãäžå¯èœãªå ŽåãçµæãšããŠçããããŒãã£ã³ã®èšèšã¯ã²ã©ããã®ã«ãªãããšãããããŸãã ãã®ã³ãŒãã¯ã.NET Frameworkã®çµã¿èŸŒã¿æ©èœãå¹æçã«äœ¿çšããŠããŸããããé¢çœãã®ã¯ãæ©èœããªãããšã§ãïŒ Closeã¡ãœãããèŠãŠã runningã ããã§falseã« èšå®ãããããããthread .Interrupt ïŒïŒãåŒã³åºãããŸãããçŸåšã®ãµãŒããŒã¹ã¬ããã¯serverSocket .AcceptSocket ïŒïŒã¡ãœããã§æ°ããæ¥ç¶ãåŸ
ã£ãŠãã³ã°ããŠãããããäœã«ãã€ãªãããŸããã åæ§ã®åé¡ã¯ã Serverã¡ãœããã§s .Receive ïŒïŒãåŒã³åºãå Žåããã¹ãŠã®ã¯ã©ã€ã¢ã³ããœã±ããã§çºçããŸã ããã®horoshkaã¯ãã¹ãŠéããããšãã§ããŸããã
ããªãŒããã
ããã§ã³ãŒãå
šäœãèŠãããšãã§ããŸã ã
internal class TreeMapNode { private static readonly int LESS = 0; private static readonly int GREATER = 1; private IComparable key; private object value; private TreeMapNode[] nodes = new TreeMapNode[2]; private int SelectSubNode(IComparable key) { return (key.CompareTo(this.key) < 0) ? LESS : GREATER; } }
ããã§ã¯ãã¹ãŠãããã»ã©èŽåœçã§ã¯ãããŸããããjavaã¹ã¿ã€ã«ã®å®æ°ã®äœ¿çšã ããŒããã³ããŒããã£ãŒã«ãã®readonlyããŒã¯ãŒãã®äžåšããªãã³ã«å€±æããå®æ°åïŒ LESSããã³GREATER㯠ãå®éã«ã¯ãµãããªãŒã®ã€ã³ããã¯ã¹ã決å®ããŸãã
ãããã«

ãã®æ¬ãgoodreads.comã§2ç¹ã§è©äŸ¡ããçç±ãå°ããããŸããã ããŠããã®å Žåãç§ã¯å察ã®è³ªåãæã£ãŠããŸãïŒããã¯æ¬åœã«ãã£ãšäŸ¡å€ãããã®ã§ããïŒ
ãã®æ¬ã¯ã»ãšãã©å€å
žçãªãã®ã§ããããšãéåžžã«æãã§ãããããããã®æ¬ã«ã¯ãåŸãã¹ãæãšããã§ãªããšãã«ã€ããŠã®çãããã«ãŒã«ãå«ãçãããååãå«ãŸããŠããŸãã ãã®æ¬ã«ã¯ããã¿ãŒã³ã®æŒ ç¶ãšãã説æããããŸãããããã¯åè¿°ã®ååãšã¯ãŸã£ããé¢ä¿ãããŸããã ãã®æ¬ã«ã¯ãå£ãããããã¹ããšãã¯ã©ã¹ã®èšèšãå°ãªããšãå°ãåã«èããããŠããå Žåã«ã¯çºçããªãã£ããšã©ãŒã䌎ãã³ãŒãã䜿çšããŠã«ãŒã«ããã¹ããã2ã€ã®ãã±ããå«ãŸããŠããŸãã ãã®æ¬ã¯CïŒããã°ã©ããŒã察象ãšããŠããŸããã2006幎ã®æšæºã§ããããã®äžã®ã³ãŒãã¯äŸ¡å€ããããŸããã
ãã®æ¬ã¯ãçµéšã®æµ
ãéçºè
ãèªãã å Žåã貚ç©ã®ã«ã«ãã®æ·±å»ãªçç¶ã«ã€ãªããå¯èœæ§ããããçµéšã®ããéçºè
ã«ã¯äœãäžããªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã ãããã£ãŠããã®æ¬ã®äž»ãªå©ç¹ã¯ãSOLID-ahãä»ã®ååã«ã€ããŠã®ãããŒãªã³ã°ã«é©åã«åå ã§ããããšã§ããããã以äžã®ããšã¯ãªããšããããšãããããŸãã