
äžèŠãããšããã Clean Architectureã¯ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ããªãåçŽãªäžé£ã®æšå¥šäºé
ã§ãã ããããç§ãšç§ã®ååã§ãã匷åãªéçºè
ã®å€ãã¯ããã®ã¢ãŒããã¯ãã£ãããã«ã¯ç解ããŸããã§ããã ãããŠæè¿ããã£ããã«ãŒã ãã€ã³ã¿ãŒãããã§ãããã«é¢é£ãã誀解ãå¢ããŠããŸãã ãã®èšäºã§ãç§ã¯ã³ãã¥ããã£ãClean Architectureãããããç解ãããããã誀解ãåãé€ãã®ãå©ãããã§ã ã
ããã«äºçŽãããã®ã§ãããåŠæ³ã¯ç§çãªåé¡ã§ãã 誰ãã誀解ãããæš©å©ãæã£ãŠããŸãã ãããŠãããã圌ã«åã£ãŠããã°ãç§ã¯éªéããããããŸããã ããããä»ã®äººã®æèŠãèãããšã¯åžžã«è¯ãããšã§ãããå€ãã®å Žåã人ã
ã¯æåç·ã«ãã人ã®æèŠãããç¥ããŸããã
èµ·æº
2011幎ã«ã ãããŒãC.ããŒãã£ã³ã¯ ããããããããšããŠãç¥ããã ã¹ã¯ãªãŒãã³ã°ã¢ãŒããã¯ãã£ã«é¢ããèšäºãå
¬éããŸãããããã¯ãã¢ãŒããã¯ãã£ã䜿çšãããã¬ãŒã ã¯ãŒã¯ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³èªäœã«ã€ããŠãå«ã¶ãã¹ãã ãšè¿°ã¹ãŠããŸãã åŸã«ããããããããçŽç²ãªå»ºç¯ã®ã¢ã€ãã¢ãšæŠãèšäºãåºãŸããã ãããŠ2012幎ã«ã圌ã¯ãã®ã¢ãããŒãã®äž»èŠãªèª¬æã§ããèšäºã ã¯ãªãŒã³ã¢ãŒããã¯ã㣠ããå
¬éããŸããã ãããã®èšäºã«å ããŠãããããããã®ãããªãã¬ãŒã³ããŒã·ã§ã³ãèŠãããšã匷ããå§ãããŸãã
Clean Architectureã«é¢ããŠéçºè
ã®é ã«æåã«æµ®ããã èšäºã®å
ã®æŠèŠã¯æ¬¡ã®ãšããã§ãã

Androidã³ãã¥ããã£ã§ã¯ãã Androidãèšèšãã...ã¯ãªãŒã³ãªæ¹æ³ïŒããšããèšäºã®åŸãCleanã¯ããã«äººæ°ãåãå§ããŸããã ãã§ã«ãã³ãã»ã»ãã¹ã«ãã£ãŠæžãããŸããã ç§ã¯æåã«ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã«ã€ããŠåŠã³ãŸããã ãããŠãã®åŸã圌ã¯ãªãªãžãã«ãæ¢ãã«è¡ããŸããã ãã®èšäºã§ã¯ãFernandoããã®ã¬ã€ã€ãŒã¹ããŒã ãæäŸããŠããŸãã

ä»ã®ã¬ã€ã€ãŒããã®å³ã«ãããä»ã®ããã€ãã®ã€ã³ã¿ã©ã¯ã¿ãŒãšå¢çããã¡ã€ã³ã¬ã€ã€ãŒã«ãããšããäºå®ã¯ãçŽããããã§ãã å
ã®åçã¯èª°ã«ãšã£ãŠãæ確ã§ã¯ãããŸããã èšäºã§ã¯ãå€ãã¯ææ§ãŸãã¯ãããã«æœè±¡çã§ãã ãããŠã誰ãããããªãèŠãããã§ã¯ãããŸããïŒéåžžãè±èªã®ç¥èãäžååãªããïŒã ãããŠä»ã 誀解ã®ããã«ã人ã
ã¯äœããçºæãå§ããç©äºãè€éã«ããééããç¯ãå§ããŸã...
ãããç解ããŸãããïŒ
ããããªå»ºç¯
ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯ãä»ã®ããã€ãã®ã¢ãŒããã¯ãã£ã¢ãããŒãã®ã¢ã€ãã¢ãçµã¿åããããã®ã§ãã
- ãã¹ã察象
- UIã«äŸåããŸããã
- ããŒã¿ããŒã¹ãå€éšãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã«äŸåããŸããã
ããã¯ãäŸåé¢ä¿ã«ãŒã«ïŒäŸåé¢ä¿ã«ãŒã«ïŒãéå±€åããŠåŸãããšã«ãã£ãŠå®çŸãããŸãã
äŸåé¢ä¿ã«ãŒã«
äŸåæ§ã«ãŒã«ã¯ãå
åŽã®å±€ãå€åŽã®å±€ã«äŸåããŠã¯ãªããªãããšã瀺ããŠããŸã ã ã€ãŸããããžãã¹ããžãã¯ãšã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯ããã¬ãŒã³ã¿ãŒãUIãããŒã¿ããŒã¹ãªã©ã«äŸåãã¹ãã§ã¯ãããŸããã å
ã®å³ã§ã¯ããã®èŠåã¯å
åŽãæãç¢å°ã§è¡šãããŠããŸãã
èšäºã«ãããšãå€åŽã®å±€ã§å®£èšããããšã³ãã£ãã£ïŒã¯ã©ã¹ãé¢æ°ãå€æ°ããã®ä»ïŒã®ååã¯ãå
åŽã®å±€ã®ã³ãŒãã«ã¯è¡šç€ºãããŸãã ã
ãã®ã«ãŒã«ã䜿çšãããšãå€åŽã®ã¬ã€ã€ãŒã®å€æŽãå
åŽã®ã¬ã€ã€ãŒã«åœ±é¿ãäžããªããããã¡ã³ããã³ã¹ã容æãªã·ã¹ãã ãæ§ç¯ã§ããŸãã
ã¬ã€ã€ãŒ
ããããããã¯4ã€ã®ã¬ã€ã€ãŒãéžæããŸãã
- ãšã³ãã£ã㣠ããžãã¹ããžãã¯ã¯å€ãã®ã¢ããªã±ãŒã·ã§ã³ã«å
±éã§ãã
- ãŠãŒã¹ã±ãŒã¹ïŒã€ã³ã¿ã©ã¯ã¿ãŒïŒ ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã
- ã€ã³ã¿ãŒãã§ã€ã¹ã¢ããã¿ãŒ ã ãŠãŒã¹ã±ãŒã¹ãšå€éšã®äžçãšã®éã®ã¢ããã¿ãŒã ããã«ã¯ãMVPãã¬ãŒã³ã¿ãŒãšã²ãŒããŠã§ã€ïŒããäžè¬çãªãªããžããªåïŒãå«ãŸããŸãã
- ãã¬ãŒã ã¯ãŒã¯ ã äžçªå€åŽã®å±€ã¯ãããã«ãããŸãïŒUIãããŒã¿ããŒã¹ãhttpã¯ã©ã€ã¢ã³ããªã©ã
ãã®èšäºã®äžã§ããããã®ã¬ã€ã€ãŒãã©ã®ãããªãã®ã§ããããããã«è©³ããæ€èšããŸãã ãããŸã§ã®éããããã®éã®ããŒã¿ã®è»¢éã«ã€ããŠèª¬æããŸãããã
é·ç§»
ã¬ã€ã€ãŒéã®é·ç§»ã¯ãBoundariesãä»ã㊠ãã€ãŸãããªã¯ãšã¹ãçšãšã¬ã¹ãã³ã¹çšã®2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠè¡ãããŸãã å
ã®å³ïŒInput / OutputPortïŒã®å³åŽã«è¡šç€ºãããŸãã ãããã¯ãå
åŽã®å±€ãå€åŽã«äŸåããªãããã«ããããã«å¿
èŠã§ãïŒäŸåæ§ã«ãŒã«ã«åŸã£ãŠïŒããåæã«ããŒã¿ãæž¡ãããšãã§ããŸãã

äž¡æ¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãå
åŽã®ã¬ã€ã€ãŒã«å±ããŸãïŒç»åå
ã®è²ã«æ³šæããŠãã ããïŒã
èŠãŠãã ãããã³ã³ãããŒã©ãŒã¯InputPortã§ã¡ãœãããåŒã³åºããUseCaseãå®è£
ãã次ã«UseCaseãPresenterãå®è£
ããOutputPortã€ã³ã¿ãŒãã§ãŒã¹ã«å¿çããŸãã ã€ãŸããããŒã¿ã¯ã¬ã€ã€ãŒéã®å¢çãè¶ããŸãããããã¹ãŠã®äŸåé¢ä¿ã¯UseCaseã¬ã€ã€ãŒãå
åŽã«åããŠããŸãã
äŸåé¢ä¿ãããŒã¿ãããŒãšã¯å察ã®æ¹åã«åããããããã«ã äŸåé¢ä¿ã®å転ã®åçãé©çšãããŸã ïŒç¥èªSOLIDã®æåDïŒã ã€ãŸããUseCaseããã¬ãŒã³ã¿ãŒã«çŽæ¥äŸåããïŒäŸåèŠåã«éåããïŒä»£ããã«ãã¬ã€ã€ãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã«äŸåãããããPresenterã¯ãã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããå¿
èŠããããŸãã
UsingCaseãGateway / Repositoryã«ã¢ã¯ã»ã¹ããå Žåãªã©ããŸã£ããåãã¹ããŒã ãä»ã®å Žæã§ãæ©èœããŸãã ãªããžããªã«äŸåããªãããã«ãã€ã³ã¿ãŒãã§ãŒã¹ã匷調衚瀺ãããUseCasesã¬ã€ã€ãŒã«é
眮ãããŸãã
åœå¢ãè¶ããããŒã¿ã«é¢ããŠã¯ã åçŽãªæ§é ã§ããã¹ãã§ãã DTOãšããŠæž¡ãããHashMapã«ã©ããããããã¡ãœãããåŒã³åºããšãã«åŒæ°ãšããŠæž¡ãããšãã§ããŸãã ãããããããã¯å
å±€ã«ãšã£ãŠãã䟿å©ãªåœ¢åŒã§ãªããã°ãªããŸããïŒ å
å±€ã«ãããã ïŒã
ã¢ãã€ã«ã¢ããªã®æ©èœ
Clean Architectureã¯ããããã«ç°ãªãã¿ã€ãã®ã¢ããªã±ãŒã·ã§ã³ã念é ã«çœ®ããŠèæ¡ãããããšã«æ³šæããå¿
èŠããããŸã ã 倧äŒæ¥åãã®å€§èŠæš¡ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ã§ããããããªãéçºãå¿
èŠãšããªãäžçšåºŠã®è€éãã®ã¢ãã€ã«ã¯ã©ã€ã¢ã³ããµãŒããŒã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŸããïŒãã¡ãããããŸããŸãªã¢ããªã±ãŒã·ã§ã³ããããŸãããã»ãšãã©ããã®ãããªãã®ã§ããããšãèªããå¿
èŠããããŸãïŒã ãããç解ããªããšã éå°ãªãšã³ãžãã¢ãªã³ã°ã«ã€ãªããå¯èœæ§ããããŸãã
å
ã®å³ã«ã¯ãã³ã³ãããŒã©ãŒãšããåèªããããŸãã ããã¯ãç¹ã«Ruby On Railsã®ããã³ããšã³ãã®ããã«å³ã«çŸããŸããã å€ãã®å Žåããªã¯ãšã¹ããåŠçããŠçµæãè¿ãControllerãšããã®çµæããã¥ãŒã«è¡šç€ºããPresenterãåé¢ããŠããŸãã å€ãã®äººã¯ããã«ã¯æšæž¬ããŸããããAndroidã¢ããªã±ãŒã·ã§ã³ã§ã¯ã³ã³ãããŒã©ãŒã¯å¿
èŠãããŸãã ã
ããããããã¯ãŸããèšäºã§4å±€ããå¿
èŠã¯ãªããšèšã£ãŠããŸã ã ä»»æã®æ°ãæå®ã§ããŸãããäŸåé¢ä¿ã«ãŒã«ãåžžã«é©çšããå¿
èŠããããŸãã
Fernando Cejasã®èšäºã®ã¹ããŒã ãèŠããšãèè
ã¯ãã®æ©äŒãå©çšããŠã¬ã€ã€ãŒã®æ°ã3ã€ã«æžããããšæããããããŸããã ããããããã¯ããã§ã¯ãããŸããã èŠãŠã¿ããšããã¡ã€ã³ã¬ã€ã€ãŒã«ã¯ã€ã³ã¿ã©ã¯ã¿ãŒïŒããã¯UseCasesã®å¥åïŒãšãšã³ãã£ãã£ã®äž¡æ¹ããããŸãã
ãã§ã«ãã³ãã®èšäºã«æè¬ããŸããããã¯Androidã³ãã¥ããã£ã§ã®Cleanã®éçºã«å€§ããªåŒŸã¿ãã€ããŸãããã圌ã®ã¹ããŒã ãæ··ä¹±ãæããŸããã
誀解ïŒã¬ã€ã€ãŒãšçŽç·æ§
ããããããã®å
ã®ãµãŒããããšãã§ã«ãã³ãã»ã»ãã¹ã®ã¹ããŒã ãæ¯èŒãããšãå€ãã®äººãæ··ä¹±ãå§ããŸãã ç·åœ¢ã¹ããŒã ã¯ç°¡åã«èªèããã人ã
ã¯ãªãªãžãã«ã誀解ãå§ããŸãã ãããŠããªãªãžãã«ãç解ããŠããªãã®ã§ã圌ãã¯èª€è§£ããŠç·åœ¢ã«ãªãå§ããŸãã åã®äžã®ç¢æã®äœçœ®ã¯ç¥èãªæå³ãæã£ãŠããããŸãã¯ã³ã³ãããŒã©ãŒã䜿çšããå¿
èŠãããããŸãã¯2ã€ã®ã¹ããŒã ã®ã¬ã€ã€ãŒã®ååãçžé¢ãããå¿
èŠããããšèª°ããèããŠããŸãã ãããããŠæ²ããã§ãããåºæ¬çãªã¹ããŒã ããšã©ãŒã®äž»ãªåå ã«ãªã£ãŠããŸãïŒ
ä¿®æ£ãè©Šã¿ãŸãã ã¯ããã«ãã¡ã€ã³åè·¯ãã¯ãªã¢ããŠãäžèŠãªãã®ãåé€ããŸãã ãããŠãã²ãŒããŠã§ã€ã®ååããªããžããªã«å€æŽããŸãã ããã¯ããã®ãšã³ãã£ãã£ã®ããäžè¬çãªååã§ãã

å°ãæ確ã«ãªããŸããã 次ã«ããããè¡ããŸãã ã¬ã€ã€ãŒãæçã«ã«ãããããã®ã¹ããŒã ããããã¯ã¹ããŒã ã«å€æŽããŸããããã§ãè²ã¯ã¬ã€ã€ãŒãå±ããããšã瀺ããŸãã

äžã§èšã£ãããã«ãè²ã¯ã¬ã€ã€ãŒã瀺ããŸãã ãŸããäžã®ç¢å°ã¯ãäŸåé¢ä¿ã«ãŒã«ã瀺ããŠããŸãã
çµæã®å³ã§ã¯ãUIããããŒã¿ããŒã¹ãŸãã¯ãµãŒããŒãžããŸãã¯ãã®éãžã®ããŒã¿ã®æµããç°¡åã«æ³åã§ããŸãã ããããã¬ã€ã€ãŒãã«ããŽãªã«é
眮ããããšã«ãããç·åœ¢æ§ã«åããŠå¥ã®ã¹ããããèžã¿ãŸãããã

ãã§ã«ãã³ãã»ã»ãã¹ãšã¯ç°ãªããç§ã¯æå³çã«ãã®åé¢ãã¬ã€ã€ãŒã§åŒã¶ããšã¯ããŸããã ãã§ã«ã¬ã€ã€ãŒãåå²ããŠããããã§ãã ã«ããŽãªãŸãã¯ããŒããšåŒã³ãŸãã 奜ããªååãä»ããããšãã§ããŸããããã¬ã€ã€ãŒããšããèšèãåå©çšããªãã§ãã ããã
ããã§ã¯ããã§ã«ãã³ããµãŒãããã§äœãèµ·ãã£ãã®ããæ¯èŒããŸãããã

ç§ã¯ä»ããã¹ãŠãé©æã«èœã¡å§ããããšãé¡ã£ãŠããŸãã ç§ã®æèŠã§ã¯ããã§ã«ãã³ãã«ã¯ãŸã 4ã€ã®å±€ããããšäžèšã§è¿°ã¹ãŸããã ä»ã§ã¯ãããæããã«ãªã£ããšæããŸãã ãã¡ã€ã³éšåã«ã¯ããŠãŒã¹ã±ãŒã¹ãšãšã³ãã£ãã£ã®äž¡æ¹ããããŸãã
ãã®ãããªã¹ããŒã ã¯ç°¡åã«èªèãããŸãã çµå±ã®ãšãããéåžžãã¢ããªã±ãŒã·ã§ã³ã®ã€ãã³ããšããŒã¿ã¯UIããããã¯ãšã³ããŸãã¯ããŒã¿ããŒã¹ã«ããŸãã¯ãã®éã«ç§»åããŸãã ãã®ããã»ã¹ã説æããŸãããïŒ

èµ€ãç¢å°ã¯ããŒã¿ã®æµãã瀺ããŸã ã
ãŠãŒã¶ãŒã€ãã³ãã¯ãã¬ãŒã³ã¿ãŒã«éããããã¬ãŒã³ã¿ãŒã¯ãŠãŒã¹ã±ãŒã¹ã«æž¡ãããŸãã ãŠãŒã¹ã±ãŒã¹ã¯ãªããžããªã«ãªã¯ãšã¹ããè¡ããŸãã ãªããžããªã¯ã©ããã§ããŒã¿ãååŸãããšã³ãã£ãã£ãäœæããŠUseCaseã«æž¡ããŸãã ãããã£ãŠããŠãŒã¹ã±ãŒã¹ã¯å¿
èŠãªãã¹ãŠã®ãšã³ãã£ãã£ãååŸããŸãã 次ã«ãããããšãã®ããžãã¯ãé©çšãããšãPresenterã«è¿ãããçµæãåãåããŸãã 次ã«ãçµæãUIã«è¡šç€ºãããŸãã
ã¬ã€ã€ãŒéã®é·ç§»ïŒã«ããŽãªã§ã¯ãªããç°ãªãè²ã§ããŒã¯ãããã¬ã€ã€ãŒïŒã§ã¯ãåè¿°ã®å¢çã䜿çšãããŸãã
2ã€ã®ã¹ããŒã ãã©ã®ããã«é¢é£ããããç解ããã®ã§ã次ã®èª€è§£ãèŠãŠã¿ãŸãããã
誀解ïŒãšã³ãã£ãã£ã§ã¯ãªãã¬ã€ã€ãŒ
ã¿ã€ãã«ãããããããã«ã誰ãããšã³ãã£ãã£ããã€ã¢ã°ã©ã ã«è¡šãããŠãããšèããŠããŸãïŒããã¯ç¹ã«UseCasesãšEntitiesã«åœ±é¿ããŸãïŒã ããããããã¯ããã§ã¯ãããŸããã
ãã€ã¢ã°ã©ã ã«ã¯ã¬ã€ã€ãŒãæãããŠãããå€ãã®ãšã³ãã£ãã£ãå«ããããšãã§ããŸã ã ãããã«ã¯ãã¬ã€ã€ãŒéã®é·ç§»ïŒå¢çïŒãããŸããŸãªDTOãã¬ã€ã€ãŒã®ã¡ã€ã³ã¯ã©ã¹ïŒUseCasesã¬ã€ã€ãŒã®ã€ã³ã¿ã©ã¯ã¿ãŒãªã©ïŒã®ã€ã³ã¿ãŒãã§ã€ã¹ãå«ãŸããŸãã
ããããããã®ã¹ããŒãã®ãããªã«ç€ºãããŠããããŒãããçµã¿ç«ãŠãããå³ãèŠãã®ã¯äžå¿
èŠã§ã¯ãããŸããã ã¯ã©ã¹ãšäŸåé¢ä¿ã瀺ããŸã ïŒ

äºéç·ãåç
§ããŠãã ããïŒ ãããã¯ãã¬ã€ã€ãŒéã®å¢çã§ãã ãããªã§ã¯ããã¹ãŠã®ããžãã¯ïŒã¢ããªã±ãŒã·ã§ã³ããã³ããžãã¹ïŒãå€çããéé¢ãããŠãããšããäºå®ã«äž»çŒã眮ãããŠããããããšã³ãã£ãã£ã¬ã€ã€ãŒãšãŠãŒã¹ã±ãŒã¹ã¬ã€ã€ãŒã®åé¢ã¯ç€ºãããŠããŸããã
ç§ãã¡ã¯ãã§ã«å¢çã«ç²ŸéããŠãããã²ãŒããŠã§ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯åãã§ãã Request / ResponseModelã¯ãã¬ã€ã€ãŒéã§ããŒã¿ã転éããããã®åãªãDTOã§ãã äŸåé¢ä¿ã®ã«ãŒã«ã«ããã°ããããã¯åçã«èŠãããå
åŽã®å±€ã«ããã¯ãã§ãã
ã³ã³ãããŒã©ãŒã«ã€ããŠã話ããŸããããèå³ã¯ãããŸããã ãã®æ©èœã¯Presenterã«ãã£ãŠå®è¡ãããŸãã
ãŸããå³ã®ViewModelã¯MVVMã®ViewModelã§ã¯ãªãã ã¢ãŒããã¯ãã£ã³ã³ããŒãã³ãã® ViewModelã§ããããŸããã ããã¯ãViewããŒã¿ãéä¿¡ããããã®åãªãDTOã§ãããããViewã¯ãã ã§ããããã£ãŒã«ããåã«ã¡ãã·ã¥ããŸãã ãã ãããããã¯å®è£
ã®è©³çŽ°ã§ããããã¬ãŒã³ããŒã·ã§ã³ãã¿ãŒã³ã®éžæãšå人çãªã¢ãããŒãã«äŸåããŸãã
UseCasesã¬ã€ã€ãŒã«ã¯ãã€ã³ã¿ãŒã¢ã¯ã¿ãŒã ãã§ãªãããã¬ãŒã³ã¿ãŒãšé£æºããããã®å¢çããªããžããªãšé£æºããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãããã³èŠæ±ãšå¿çã®ããã®DTOãå«ãŸããŠããŸãã ããããããªãªãžãã«ã®ã¹ããŒã ããŸã å±€ãåæ ããŠãããšçµè«ã§ããŸãã
誀解ïŒãšã³ãã£ãã£
ãšã³ãã£ãã£ã¯ã誀解ã«ãã£ãŠæ£åœã«æåã®å ŽæãåããŸãã
ããã ãã§ãªããã»ãšãã©èª°ãïŒæè¿ãŸã§ç§ãå«ããŠïŒãããäœã§ããããç解ããŠããªãã ãã§ãªãã圌ãã¯DTOãšæ··åãããŠããŸãã
ãã£ããã«åå ããåŸãçŽäºãçºçããŸãããããã§ã¯ããšã³ãã£ãã£ã¯ããŒã¿ã¬ã€ã€ãŒã§JSONã解æããåŸã«ååŸããããªããžã§ã¯ãã§ãããDTOã¯Interactorsãæäœãããªããžã§ã¯ãã§ããããšã蚌æãããŸãã...
ä»ã®äººããã®ãããªãšã©ãŒãèµ·ãããªãããã«ãããŸãç解ããããšããŸãã
ãšã³ãã£ãã£ãšã¯äœã§ããïŒ
ã»ãšãã©ã®å Žåãã€ã³ã¿ãŒã¢ã¯ã¿ãŒãæ©èœããPOJOã¯ã©ã¹ãšããŠèªèãããŸãã ããããããã¯ããã§ã¯ãããŸããã å°ãªããšãããã§ã¯ãããŸããã
èšäºã®äžã§ãããããããã¯ã ãšã³ãã£ãã£ã¯ããžãã¹ã®ããžã㯠ã ã€ãŸãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã«äŸåããªãããå€ãã®äººã«å
±éãããã¹ãŠã®ãã®ã ã«ãã»ã«åãããšè¿°ã¹ãŠããŸã ã ãã ããå¥ã®ã¢ããªã±ãŒã·ã§ã³ããããæ¢åã®ããžãã¹åãã«èª¿æŽãããŠããªãå Žåããšã³ãã£ãã£ã¯ãæãäžè¬çã§é«ã¬ãã«ã®ã«ãŒã«ãå«ãã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ãªããžã§ã¯ãã«ãªããŸã ã
ããšã³ãã£ãã£ã¯ããžãã¹ãªããžã§ã¯ãã§ãããšãããã¬ãŒãºãæãçŽãããããšæããŸãã ããã«ãäžã®å³ã§ã¯ãInteractorã¯ãããªããã²ãŒããŠã§ã€ãããšã³ãã£ãã£ãååŸããŸãã ãŸãããããã¯åãªãPOJOãªããžã§ã¯ãã§ãããšããæèŠã匷åããŸãã
ãããããã®èšäºã§ã¯ã Entityã¯ã¡ãœãããŸãã¯æ§é ãšæ©èœã®ã»ãããæã€ãªããžã§ã¯ãã«ãªãåŸããšãè¿°ã¹ãŠããŸã ã ã€ãŸããããŒã¿ã§ã¯ãªãã¡ãœãããéèŠã§ãããšããäºå®ã«éç¹ã眮ãããŠããŸãã
ããã¯ãæè¿èŠã€ããããããããã®èª¬æã§ã確èªãããŠããŸãã
ããããããã¯ããšã³ãã£ãã£ã«ã¯ã¢ããªã±ãŒã·ã§ã³ã«äŸåããªãããžãã¹ã«ãŒã«ãå«ãŸããŠãããšèšã£ãŠããŸãã ãããŠããããã¯åãªãããŒã¿ãªããžã§ã¯ãã§ã¯ãããŸããã ãšã³ãã£ãã£ã«ã¯ãããŒã¿ãæã€ãªããžã§ã¯ããžã®åç
§ãå«ãŸããå ŽåããããŸããããã®äž»ãªç®çã¯ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããããžãã¹ããžãã¯ã¡ãœãããå®è£
ããããšã§ã ã
ãããŠãã²ãŒããŠã§ã€ãåçã®ãšã³ãã£ãã£ãè¿ããšããäºå®ã«ã€ããŠã圌ã¯æ¬¡ã®ããã«èª¬æããŠããŸãã
ã²ãŒããŠã§ã€ã®å®è£
ã¯ãããŒã¿ããŒã¹ããããŒã¿ãåãåããããã䜿çšããŠãã²ãŒããŠã§ã€ãè¿ããšã³ãã£ãã£ã«æž¡ãããããŒã¿æ§é ãäœæããŸãã å®è£
ãããããã¯æ§ââå³ãããããŸãã
class MyEntity { private MyDataStructure data;}
class MyEntity extends MyDataStructure {...}
, :
And remember, we are all pirates by nature; and the rules I'm talking about here are really more like guidelinesâŠ
( : , , , , âŠ)
, , . - , .
, Entities :
- Entities â , , ( , );
- DTO, .
, , Entities UseCases, .
: UseCase / Interactor
UseCase Interactor. : « Interactor ». : « Interactorâe UseCase?».
Interactorâa , . :
«...interactor object that implements the use case by invoking business objects.»
:
Interactor â , use case ( ), - (Entities).
Use Case ?
Uncle Bob «Object-Oriented Software Engineering: A Use Case Driven Approach», Ivar Jacobson 1992 , , Use Case.
Use case â , , .
, :

Use Case , .
, , . .
â Use Caseâa, â .
:
- . .
- id . , , . - .
- id . .
, id , , , . Use Case .
Ivar Jacobson Use Case , ControlObject.
Uncle Bob , , Controller MVC Interactor. , UseCase.
.
, Interactor use case execute() , . .
.
- , Interactorâa â . . .
Interactorâ , use caseâ.
, , . Interactorâ, .
: « â UseCaseâ», â . . , UseCase Interactor , .
Interactor UseCase, : Interactor/UseCase â , use case ( ).
, , -, , â Repository.
- , . Uncle Bob Gateway, Repository.
Repository
Repository? , , ( Fernando Cejas ), .
Repository - . , , .
Android- Repository , .
Hannes Dorfmannâ.
Gateway
Repository, «» , login()
(, Repository, â , ).
, Gateway â , . Gateway , API . , , .
«», .
Repository/Gateway Interactor?
, . !
Repository Interactor.
, , , Repository Presenterâa, Interactor.
Repository , Dependency Rule Repository . â Interactor . Interactor, , , proxy-interactorâ, , .
, , Interactor, , , Interactor , . .
:
, . .
DTO Entities . , . Dependency Rule .
â . .
DTO :
DTO Enitities:
.
:
, / , ( ). , API . , , .
: Interactorâe
, . , c:
So when we pass data across a boundary, it is always in the form that is most convenient for the inner circle.
( , )
Interactor .
Interface Adapters, Presenter Repository.
?
. API . , login()
Profile OrderState. , , Repository.
LoginResponse Profile OrderState , Interactorâe Repository?
Interactorâe. , .. .
Repository. :
- Interactorâe, LoginResponse - . , Dependency Rule, LoginResponse Interactorâa (UseCases) Entities. , .
- â use case. : « , ». : « »,â .
Interactor, , .
Interactor Repository?
Interactor Repository. , « Repository/Gateway Interactor?».
Clean Architecture .
:
, , . , . .
RxJava Clean Architecture
Android- RxJava. , Fernando Cejas , RxJava Clean Architecture.
, , , , Boundaries ( Dependency Rule) Observable Subscriber.
, RxJava , . , â Clean Architecture.
, RxJava . Java 9 util.concurrent.Flow, Reactive Streams, RxJava2. - RxJava, .
: Clean Architecture MVP?
, ? .
:
- . Clean â .
- , MVP, , UI. , dmdev.
: Clean Architecture
. Google Architecture Components.
- . . .
, â . , , , . , .
, , .
!
. . Clean Architecture, , , « »!