SOLID ååã«ã€ããŠèããããšããªãéçºè
ã«ããäŒããŸã (ç§ãã¡ã¯
ãªãã€ã³ããŒïŒ ãã¹ãŠã® Habr èªè 察象 - Habr ããã¢ãŒã·ã§ã³ ã³ãŒãã䜿çšããŠã¹ãã«ããã¯ã¹ ã³ãŒã¹ã«ç»é²ãããš 10 ã«ãŒãã«ã®å²åŒã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã æè²ãªã³ã©ã€ã³ã³ãŒã¹
ãJavaéçºè ã .
DRY (ç¹°ãè¿ããªãã§ãã ãã)
éåžžã«ã·ã³ãã«ãªååã§ããããã®æ¬è³ªã¯ãã®ååããæããã§ãããåãããšãç¹°ãè¿ããªããã ããã°ã©ããŒã«ãšã£ãŠãããã¯éè€ã³ãŒããé¿ããå¿ èŠãããããšãšãäœæ¥ã§æœè±¡åã䜿çšããæ©äŒãæå³ããŸãã
ã³ãŒãå ã« XNUMX ã€ã®ç¹°ãè¿ãã»ã¯ã·ã§ã³ãããå Žåã¯ããããã XNUMX ã€ã®ã¡ãœããã«çµåããå¿ èŠããããŸãã ããŒãã³ãŒããããå€ãè€æ°å䜿çšãããå Žåã¯ãããããããªãã¯å®æ°ã«å€æãã䟡å€ããããŸãã
ããã¯ãã³ãŒããç°¡çŽ åããä¿å®ã容æã«ããããã«å¿ èŠã§ãããããã OOP ã®äž»ãªç®çã§ãã åãã³ãŒã㯠OrderId ãš SSN ã®äž¡æ¹ã§æ€èšŒã«åæ ŒããªãããããŠããªã³ãé床ã«äœ¿çšããªãã§ãã ããã
å€æŽã®ã«ãã»ã«å
ã»ãšãã©ã®äŒæ¥ã®ãœãããŠã§ã¢è£œåã¯åžžã«é²åããŠããŸãã ããã¯ãã³ãŒãã«å€æŽãå ããå¿
èŠãããããµããŒãããå¿
èŠãããããšãæå³ããŸãã ã«ãã»ã«åã䜿çšãããšäœæ¥ã楜ã«ãªããŸãã ããã«ãããæ¢åã®ã³ãŒã ããŒã¹ãããå¹ççã«ãã¹ãããã³ä¿å®ã§ããããã«ãªããŸãã
Javaã§æžããšã
ééåç
ãã®ååã¯ã次ã®æãèªããšç°¡åã«æãåºãããšãã§ããŸããããœãããŠã§ã¢ ãšã³ãã£ã㣠(ã¯ã©ã¹ãã¢ãžã¥ãŒã«ãé¢æ°ãªã©) ã¯æ¡åŒµã«å¯ŸããŠãªãŒãã³ã§ããã¹ãã§ãããå€æŽã«å¯ŸããŠã¯ã¯ããŒãºãããŠããå¿ èŠããããŸããã å®éã«ã¯ãããã¯ããœãŒã¹ ã³ãŒããå€æŽããã«åäœãå€æŽã§ããããšãæå³ããŸãã
ãã®ååã¯ããœãŒã¹ ã³ãŒãã®å€æŽã§ã³ãŒãã®æ¹èšãåäœãã¹ãããã®ä»ã®æé ãå¿ èŠã«ãªãå Žåã«éèŠã§ãã ãªãŒãã³/ã¯ããŒãºã®ååã«åŸãã³ãŒãã¯æ¡åŒµãããŠãå€æŽãããªããããåé¡ã¯ã¯ããã«å°ãªããªããŸãã
ãã®ååã«éåããã³ãŒãã®äŸã次ã«ç€ºããŸãã
ãã®äžã®äœããå€æŽããå¿
èŠãããå Žåã¯ãç®çã®ãã©ã°ã¡ã³ããšé¢é£ããã³ãŒãã®ãã¹ãŠã®ã»ã¯ã·ã§ã³ãå€æŽããå¿
èŠããããããããªãã®æéãããããŸãã
ã¡ãªã¿ã«ãSOLIDã®ååã®äžã€ã«éæŸæ§ãšééæ§ããããŸãã
åäžè²¬ä»»ã®åå (SRP)
SOLID ã»ããã®ãã XNUMX ã€ã®ååã ããã¯ããéçŽã®å€åãåŒãèµ·ããåå ã¯ãã äžã€ã§ããããšè¿°ã¹ãŠããŸãã ãã®ã¯ã©ã¹ã§ã¯åé¡ã XNUMX ã€ã ã解決ãããŸãã ããã€ãã®æ¹æ³ãããå ŽåããããŸãããããããã¯äžè¬çãªåé¡ã解決ããããã«ã®ã¿äœ¿çšãããŸãã ãã¹ãŠã®ã¡ãœãããšããããã£ã¯ããã®ã¿ãæäŸããå¿ èŠããããŸãã
ãã®ååã®äŸ¡å€ã¯ãåã
ã®ãœãããŠã§ã¢ ã³ã³ããŒãã³ããšã³ãŒãã®éã®çµåãç·©ããããšã§ãã ã¯ã©ã¹ã«è€æ°ã®æ©èœãè¿œå ãããšãXNUMX ã€ã®é¢æ°éã«é¢ä¿ãçããŸãã ãããã£ãŠããããã®ãã¡ã® XNUMX ã€ãå€æŽãããšãæåã®ãã®ã«æ¥ç¶ãããŠãã XNUMX ã€ç®ã®ãã®ãå°ç¡ãã«ãªãå¯èœæ§ãé«ããªããŸãã ããã¯ããã¹ãŠã®åé¡ãäºåã«ç¹å®ããããã«ãã¹ã ãµã€ã¯ã«ãå¢ããããšãæå³ããŸãã
äŸåæ§é転ã®åå (DIP)
äžèšã¯ãAppManager ã EventLogWriter ã«äŸåããAppManager ãšå¯æ¥ã«é£æºããã³ãŒãäŸã§ãã ããã·ã¥ãSMSãé»åã¡ãŒã«ãªã©ãå¥ã®æ¹æ³ã§éç¥ã衚瀺ããå¿
èŠãããå Žåã¯ãAppManager ã¯ã©ã¹ãå€æŽããå¿
èŠããããŸãã
ãã®åé¡ã¯ DIP ã䜿çšããŠè§£æ±ºã§ããŸãã ãããã£ãŠãAppManager ã®ä»£ããã«ããã¬ãŒã ã¯ãŒã¯ã䜿çšããŠå ¥åããã EventLogWriter ããªã¯ãšã¹ãããŸãã
DIP ã䜿çšãããšãäŸåé¢ä¿ã¢ãžã¥ãŒã«ãå€æŽããããšã§ãåã ã®ã¢ãžã¥ãŒã«ãä»ã®ã¢ãžã¥ãŒã«ã«ç°¡åã«çœ®ãæããããšãã§ããŸãã ããã«ãããä»ã®ã¢ãžã¥ãŒã«ã«åœ±é¿ãäžããããšãªã XNUMX ã€ã®ã¢ãžã¥ãŒã«ãå€æŽã§ããŸãã
ç¶æ¿ã§ã¯ãªãåæ
ã³ãŒããåå©çšããã«ã¯äž»ã«ç¶æ¿ãšåæã® XNUMX ã€ã®æ¹æ³ããããã©ã¡ãã«ãç¬èªã®é·æãšçæããããŸãã é垞㯠XNUMX çªç®ã®æ¹ãæè»æ§ãé«ããããåªå ãããŸãã
ã³ã³ããžã·ã§ã³ã䜿çšãããšãã¯ã©ã¹ã®ããããã£ãèšå®ããããšã«ãã£ãŠãå®è¡æã«ã¯ã©ã¹ã®åäœãå€æŽã§ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããå Žåãããªã¢ãŒãã£ãºã ã䜿çšãããããæè»ãªå®è£ ãå¯èœã«ãªããŸãã
Joshua Bloch èã®ãEffective Javaãã§ããç¶æ¿ã§ã¯ãªãåæãéžæããããã¢ããã€ã¹ããŠããŸãã
ããŒãã©ã»ãªã¹ã³ãã®çœ®æåç (LSP)
SOLID ããŒã«ãããã®ãã XNUMX ã€ã®ååã ãµãã¿ã€ãã¯ã¹ãŒããŒã¿ã€ãã®ä»£ããã«äœ¿çšã§ããå¿ èŠããããšèŠå®ãããŠããŸãã ã€ãŸããã¹ãŒããŒã¯ã©ã¹ã§åäœããã¡ãœãããšé¢æ°ã¯ããã®ãµãã¯ã©ã¹ã§ãåé¡ãªãåäœã§ããå¿ èŠããããŸãã
LSP ã¯ãåäžè²¬ä»»ååãšå ±æ責任ååã®äž¡æ¹ã«é¢é£ä»ããããŠããŸãã ã¯ã©ã¹ããµãã¯ã©ã¹ãããå€ãã®æ©èœãæäŸããå ŽåãåŸè ã¯äžéšã®æ©èœããµããŒãããªããªãããã®ååã«éåããŸãã
以äžã¯ LSP ãšççŸããã³ãŒãã§ãã
area(Rectangle r) ã¡ãœããã¯ãRectangle ã®é¢ç©ãèšç®ããŸãã ããã§ã¯ Square 㯠Rectangle ã§ã¯ãªããããSquare ãå®è¡ãããšããã°ã©ã ãã¯ã©ãã·ã¥ããŸãã LSP ã®ååã«ããã°ãåºæ¬ã¯ã©ã¹ãžã®åç
§ã䜿çšããé¢æ°ã¯ãè¿œå ã®åœä»€ãªãã§æŽŸçã¯ã©ã¹ã®ãªããžã§ã¯ãã䜿çšã§ããå¿
èŠããããŸãã
ãã®ååã¯ãµãã¿ã€ãã®å ·äœçãªå®çŸ©ã§ããããããŒã¿ã®æœè±¡åãšéå±€ããšé¡ããã 1987 幎ã®äŒè°ã®åºèª¿è¬æŒã§ Barbara Liskov ã«ãã£ãŠææ¡ãããããããã®ååãä»ããããŸããã
ã€ã³ã¿ãŒãã§ã€ã¹åé¢ã®åå (ISP)
ããäžã€ã®å åºãªååã ããã«ãããšã䜿çšãããªãã€ã³ã¿ãŒãã§ã€ã¹ã¯å®è£ ãã¹ãã§ã¯ãããŸããã ãã®ååã«åŸãããšã§ãã·ã¹ãã ã®æè»æ§ãç¶æãããåäœããžãã¯ã«å€æŽãå ããããå Žåã®ãªãã¡ã¯ã¿ãªã³ã°ã«é©ããç¶æ ãä¿ã€ããšãã§ããŸãã
ã»ãšãã©ã®å Žåããã®ç¶æ³ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã«äžåºŠã«è€æ°ã®æ©èœãå«ãŸããŠãããã¯ã©ã€ã¢ã³ãããã®ãã¡ã® XNUMX ã€ã ããå¿ èŠãšããå Žåã«çºçããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãæžãã®ã¯é£ããäœæ¥ãªã®ã§ãäœæ¥ãå®äºããåŸã«äœãå£ããã«å€æŽããã®ã¯å°é£ã§ãã
Java ã® ISP ååã®å©ç¹ã¯ããã¹ãŠã®ã¡ãœãããæåã«å®è£ ããå¿ èŠãããããã®åŸã§ã®ã¿ã¯ã©ã¹ã§äœ¿çšã§ããããšã§ãã ãããã£ãŠããã®åçã«ããã¡ãœããã®æ°ãæžããããšãã§ããŸãã
å®è£ ã§ã¯ãªãã€ã³ã¿ãŒãã§ã€ã¹ã®ããã°ã©ãã³ã°
ããã®ãã¹ãŠã¯ååããæããã§ãã ãã®ååãé©çšãããšãã€ã³ã¿ãŒãã§ã€ã¹ã®æ°ããå®è£ ã§åäœããæè»ãªã³ãŒããäœæãããŸãã
å€æ°ãæ»ãå€ã®åããŸãã¯ã¡ãœããã®åŒæ°ã®åã«ã¯ã€ã³ã¿ãŒãã§ã€ã¹åã䜿çšããå¿ èŠããããŸãã äŸãšããŠã¯ããµãã¯ã©ã¹ã§ã¯ãªãã¹ãŒããŒã¯ã©ã¹ã䜿çšããããšãæããããŸãã
I.eïŒ
ãªã¹ãçªå· = getNumbers();
ã§ã¯ãªãïŒ
ArrayList ã®æ°å€ = getNumbers();
ããã§ã¯ãäžã§èª¬æããå 容ã®å®éçãªå®è£ ã瀺ããŸãã
å§ä»»ã®åå
äžè¬çãªäŸã¯ãJava ã® equals() ã¡ãœãããš hashCode() ã¡ãœããã§ãã XNUMX ã€ã®ãªããžã§ã¯ããæ¯èŒããå¿ èŠãããå Žåããã®ã¢ã¯ã·ã§ã³ã¯ã¯ã©ã€ã¢ã³ãã®ã¯ã©ã¹ã§ã¯ãªãã察å¿ããã¯ã©ã¹ã«å§ä»»ãããŸãã
ãã®ååã®å©ç¹ã¯ãã³ãŒãã®éè€ããªããåäœã®å€æŽãæ¯èŒçç°¡åã§ããããšã§ãã ããã¯ã€ãã³ãã®å§ä»»ã«ãé©çšãããŸãã
ããããã¹ãŠã®ååã«ãããåéæ§ãé«ããçµåæ§ãäœããããæè»ã§çŸããä¿¡é Œæ§ã®é«ãã³ãŒããäœæã§ããŸãã ãã¡ããçè«ã¯è¯ãã®ã§ãããéçºè
ãåŸãç¥èãå®éã«æŽ»çšããã«ã¯å®è·µãå¿
èŠã§ãã OOP ã®ååããã¹ã¿ãŒãããã次ã®ã¹ãããã¯ãäžè¬çãªãœãããŠã§ã¢éçºã®åé¡ã解決ããããã®èšèšãã¿ãŒã³ãåŠã¶ããšãããããŸããã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã
- å®è·µã³ãŒã¹
ãã¢ãã€ã«ããããããŒPROã .- ãªã³ã©ã€ã³ã³ãŒã¹ã®ç³ã蟌ã¿
ãPythonã§åŠã¶ããŒã¿ã¢ããªã¹ãã .- XNUMX幎éã®å®è·µã³ãŒã¹
ãç§ã¯ããã®ãŠã§ãéçºè ã§ãã .
åºæïŒ habr.com