ãªããžã§ã¯ãæåãåŠãã§ãããšãå¿ ãã©ããã§ãDI(Dependency InjectionïŒäŸåæ§ã®æ³šå ¥)ããšããã¯ãŒãã«åºäŒããŸããæåã¯åªæã®ããã«é£ããèããããããããŸãããããã®æ¬è³ªã¯ãšãŠãã·ã³ãã«ããããã¯ã©ã¹ãå¿ èŠãšããéšåããå€ããå·®ãæ¿ããããåœ¢ã§æž¡ããŠãããããšããèšèšææ³ã«éããŸããã
ãã®èãæ¹ã身ã«ã€ããšãããŒã¿ããŒã¹æ¥ç¶ãWeb APIã«åãæ¿ããããæ¬çªã³ãŒããäžåå€ããã«ãã¹ãçšã®ã¢ãã¯ã«å·®ãæ¿ããããšãã£ãæäœããé©ãã»ã©ã¹ã ãŒãºã«ã§ããããã«ãªããŸãããèšèšã®ã»ã³ã¹ããã人ããšè©äŸ¡ãããå®åãšã³ãžãã¢ã«ãªãããã®ãæåã«ããŠæéèŠã®ç»ç«éããããDIã§ãðªâš
ããšãã°ããŠãŒã¶ãŒæ
å ±ãç»é¢ã«è¡šç€ºããServiceã¯ã©ã¹ããããšããŸãããã®ã¯ã©ã¹ã®äžã§DBUserRepository()ãçŽæ¥__init__ã§çæããget_user_by_id()ãåŒã³åºããŠããŒã¿ãååŸããŠãããšããããServiceã¯ã©ã¹ã¯ãDBUserRepositoryã¯ã©ã¹ã«åŒ·ãäŸåããŠãããç¶æ
ã§ãã
ãã®èšèšã®äœãããºãããšãããšãããŒã¿ã®ååŸå ãããŒã¿ããŒã¹ããWeb APIã«å€ããããªã£ãç¬éãServiceã¯ã©ã¹æ¬äœã®ã³ãŒããæžãæããå¿ èŠãåºãŠããç¹ã§ããã¯ã©ã¹åãéããã¡ãœããåãéããåŒæ°ãéãâŠããã倿ŽããããšãããšããµãŒãã¹ã¯ã©ã¹ã®äžèº«ãäžæ°ã«æžãçŽãã«ãªããŸããããã¯ã¡ããã©ãå€éšã©ã€ãã©ãªã䜿ãããã«ãã©ã€ãã©ãªã®äžèº«ãæ¯åæžãæããªããšåããªãããšèšããããšãã®éåæã«äŒŒãŠããŸãã䟿å©ãªéšåã¯ã䜿ãåŽã®ã³ãŒããæ±ããã«å·®ãæ¿ããããã¹ãã§ãð§
Pythonã«ã¯å³å¯ãªãã€ã³ã¿ãŒãã§ã€ã¹ãæ§æã¯ãããŸããããabcã¢ãžã¥ãŒã«ã®ABCMetaãš@abstractmethodã䜿ãããšã§ãæœè±¡åºåºã¯ã©ã¹ãšããŠåã圹å²ãæãããŸããããŠãŒã¶ãŒããŒã¿ãååŸããã¯ã©ã¹ã¯ãå¿
ãget_user_by_id(user_id)ãšããã¡ãœãããæã€ããšããšããã«ãŒã«ãUserRepositoryã¯ã©ã¹ã«å®çŸ©ããŠãããŸãã
SQLiteããããŒã¿ãåã£ãŠããDBUserRepositoryã¯ã©ã¹ãšãWeb APIããåã£ãŠããAPIUserRepositoryã¯ã©ã¹ããããããUserRepositoryãç¶æ¿ãã圢ã§å®è£
ãããã§ããŠãŒã¶ãŒããŒã¿ãååŸããããšããå
±éã®è²¬åããç°ãªãææ®µã§æãã2ã€ã®å®è£
ã宿ããŸãã
Serviceã¯ã©ã¹ã®__init__ã§å
·äœã¯ã©ã¹ãçæããã®ã§ã¯ãªããå€ããUserRepositoryåã®ãªããžã§ã¯ããåŒæ°ãšããŠåãåããã€ã³ã¹ã¿ã³ã¹å€æ°ã«ä»£å
¥ããŠãããŸããããããŸãã«ãäŸåæ§ã®æ³šå
¥ãã®ã³ã¢ãServiceã¯ã©ã¹ã¯ããŠãŒã¶ãŒããŒã¿ãåãããªãã誰ã§ããããããšããæœè±¡çãªçŽæããšã«ã ãäŸåããããŒã¿ååŸã®äžèº«ã¯äžåç¥ããŸããã
åŒã³åºãåŽã§ããmain颿°ã§ã¯ãç®çã«å¿ããŠAPIUserRepository(url)ãDBUserRepository(connection)ãçæãããããService(user_repository)ã«æž¡ããŸããå®è¡ç°å¢ãåãæ¿ããããã°ãmain颿°ã®1è¡ãå·®ãæ¿ããã ããServiceã¯ã©ã¹ã®ã³ãŒãã¯1æåãè§ŠããŸããð¯
Pythonã¯åçåä»ãèšèªãªã®ã§ãæœè±¡åºåºã¯ã©ã¹ãç¶æ¿ãå¿ããŠããŠãå®è¡æãŸã§ãšã©ãŒãåºãªãããšããããŸããããã§def __init__(self, user_repository: UserRepository)ã®ããã«åãã³ããä»ããmypyãVS Codeã®mypyæ¡åŒµæ©èœã§éçè§£æããããã°ããåãéããããšããèŠåããšãã£ã¿äžã§å³åº§ã«è¡šç€ºãããããã«ãªããŸããå®è¡åã«ãã¹ã朰ããå®å¿æã¯ãäžåºŠå³ãããšææŸããŸããð¡
DIãã³ãŒãã«çµã¿èŸŒããããã«ãªããšãéçºã®ããããå Žé¢ã§æ©æµãåããããŸãã
åç»ã®è§£èª¬ã§å šäœåã¯ã€ãããŠããå®åã§äœ¿ãããªããèšèšåã身ã«ã€ããã«ã¯äœç³»çãªæžç±åŠç¿ãå§åçã«å¹ããŸããã¯ã©ã¹ã»ç¶æ¿ã»æœè±¡åºåºã¯ã©ã¹ã®åºç€ãããSOLIDååããã¶ã€ã³ãã¿ãŒã³ããã¹ãé§åéçºãŸã§äžæ°é貫ã§åŠã¹ãæ¬ãæå ã«çœ®ããŠãããšãå幎åŸã®èªåãèŠéããã»ã©æé·ããŸãã
ã¯ã©ã¹ãç¶æ¿ãããªã¢ãŒãã£ãºã ãæœè±¡åºåºã¯ã©ã¹ãšãã£ãåºç€ãããDIãå«ãèšèšãã¿ãŒã³ãŸã§ãPythonã³ãŒãã§äžå¯§ã«è§£èª¬ããäžåãåç»ã§ã¯é§ãè¶³ã ã£ãéšåã®ããªãããããã®ãããè ã«èœã¡ã仿žããŠããã³ãŒãã®èšèšãèŠçŽããã£ããã«ãªããŸãã
DIã¯åç¬ã®ãã¯ããã¯ã§ã¯ãªããäŸåé¢ä¿é転ã®åå(DIP)ãšãããã倧ããªææ³ã®äžéšã§ããClean Architectureãèªããšãããªãæœè±¡ã«äŸåãããã®ããããªãããžãã¹ããžãã¯ã¯å€éšã®éœåã«æ¯ãåãããã¹ãã§ãªãã®ãããšããèšèšã®æ žå¿ãè ¹èœã¡ããŸããäžçŽä»¥äžãç®æããªãå¿ èªã®äžåã
DIã®èåŸã«ã¯ãStrategyã»Factoryã»Adapterãªã©å€ãã®ãã¶ã€ã³ãã¿ãŒã³ãšã®é¢é£ããããŸããGoFæ¬ã¯å°ãé£è§£ã§ãããPythonåãã«ãã¿ç ããŠè§£èª¬ãããå ¥éæžãäžåãã蟌ãã°ãã³ãŒãã®åŒãåºããäžæ°ã«å¢ããŸãããããããåã«èŠããã¿ãŒã³ã ããšæ°ä»ããæèŠããèšèšã®è³ªãåºäžãããŠãããŸãã
DIã®ç䟡ã¯ããã¹ãã³ãŒããæžãå§ãããšäžæ°ã«å®æã§ããŸããpytestã䜿ã£ããã¹ãã®æžãæ¹ãã¢ãã¯ã®å·®ãæ¿ãæ¹ããªãã¡ã¯ã¿ãªã³ã°ã®é²ãæ¹ãå®è·µçã«åŠã¹ãæ¬ãäžåæã£ãŠãããšããDIãå ¥ããŠãããŠããã£ãããšæããç¬éãäœåºŠã蚪ããŸãã
ã¯ã©ã¹å³ãèŠãªããã³ãŒããæžããè€æ°ã®ãã¡ã€ã«ãåæã«éããŠåç §ãããããã¥ã¡ã³ããèªã¿ãªããå®è£ ãããDIã®ãããªæœè±¡çãªèšèšãæ±ããšãã»ã©ãç»é¢ã®åºããæèã®åºãã«çŽçµããŸãããµãã¢ãã¿ãŒãäžæè¿œå ããã ãã§ãé ã®æŽçã¹ããŒããšå®è£ é床ãäœæã§å€ãããŸãã
äœ¿ãæšãŠã®ã¹ã¯ãªããã§ããã°ãç¡çã«DIãå°å ¥ããå¿ èŠã¯ãããŸããããã ããããã¯å°æ¥ãããŒã¿ã®ååŸå ãå€ãããããããã¹ããæžãããããšå°ãã§ãæã£ãããæåããDIåæã§æžããŠããã»ããçµæçã«æ¥œã§ããæ £ããŠããã°ãDIãå ¥ããããšã®ã³ã¹ãã¯ã»ãŒãŒãã«ãªããŸãã
åçåä»ãã®Pythonã§ã¯ãããã¯ã¿ã€ãã³ã°ã ãã§ãDIã¯æç«ããŸãããã ãå€§èŠæš¡åããå Žåããè€æ°äººã§éçºããå Žåã¯ãæœè±¡åºåºã¯ã©ã¹+åãã³ã+mypyã®çµã¿åããã䜿ãã»ããæå³ãæç¢ºã«ãªãããã¹ãé²ããŸãããåãã°ãããããäžæ©é²ãã åè³ªãæ±ãããªããæœè±¡ãæŽ»çšããã®ãå§åçã«ããããã§ãã
ã¯ã©ã¹æ°ãå¢ããŠããŠãmain颿°ã§çµã¿ç«ãŠããªããžã§ã¯ãã®æ°ãèšå€§ã«ãªã£ãŠãããæ€èšãã䟡å€ããããŸããéã«ã¯ã©ã¹ãæ°åçšåºŠã®ãã¡ã¯ãææžãã®çµã¿ç«ãŠã§ååãæåããã³ã³ããã䜿ããšãéæ³ã®ããã«åããã©äžèº«ãåãããªããç¶æ ã«ãªããã¡ãªã®ã§ããŸãã¯æåDIã«æ £ããŠããå°å ¥ããã®ãçéã§ãã
VS Codeãªãæ¡åŒµæ©èœã1ã€å
¥ããã ãã§äœ¿ããŸããæåã¯èŠåã®éã«å§åããããããããŸããããèšå®ãã¡ã€ã«mypy.iniã§æ®µéçã«å³ããã調æŽã§ããã®ã§ãåŸã
ã«å°å
¥ããŠããã°åé¡ãããŸãããäžåºŠåã®æ©æµãäœæãããšãæ»ããªããªãããã䟿å©ã§ãã
ãŸãã¯ãã¯ã©ã¹ãšã€ã³ã¹ã¿ã³ã¹ããç¶æ¿ããæœè±¡åºåºã¯ã©ã¹ãã®3ç¹ããæãåãããŠæžããªããçè§£ããã®ãããããã§ããPythonã®å ¬åŒãã¥ãŒããªã¢ã«+å ¥éæžãäžåããåããšãDIã®è§£èª¬ãã¹ããšé ã«å ¥ã£ãŠããããã«ãªããŸãã
äŸåæ§ã®æ³šå ¥ã¯ãèŠããŠããŸãã°ããªãã§ãããªã«åœããåã®ããšã«ååãä»ããŠããã®ïŒããšæãããããã·ã³ãã«ãªèãæ¹ã§ããããã©ãããã®èãæ¹ãæèçã«ã³ãŒããžèœãšã蟌ãããã©ããã§ãå幎åŸã»äžå¹ŽåŸã®ã³ãŒãã®ä¿å®æ§ã¯åçã«å€ãããŸãã
å
·äœã¯ã©ã¹ãçŽæ¥__init__ã§çæããã®ã§ã¯ãªããæœè±¡ã«äŸåãããŠå€ããæž¡ãããã£ãããã ãã®ã«ãŒã«ã§ããã¹ããæžãããããªããæ©èœã®å·®ãæ¿ããç°¡åã«ãªãã倿Žã«åŒ·ãã³ãŒãããŒã¹ãæã«å
¥ããŸãã仿¥ã®ãªãã¡ã¯ã¿ãªã³ã°ã§ããæ°ã«å
¥ãã®ãããžã§ã¯ãã1ã€ã ãDIåããŠã¿ãŠãã ããããèšèšã®äžçãåºããæèŠããããã²èªåã®æã§å³ãã£ãŠã¿ãŸãããð
æœè±¡åºåºã¯ã©ã¹ãæžããŠãåãã³ããæ·»ããŠãmypyã«èŠå®ã£ãŠãããããã®å°ããªç©ã¿éãããäžå¹ŽåŸã«ã¯ãèšèšã®ã»ã³ã¹ããã人ããšããããªãã®æ°ããè©æžããäœã£ãŠãããŸãð
ð€ ãAIã«èªç€Ÿã·ã¹ãã ãæäœ…
ð® PythonãšMinecr…
ð€ ãåãç»é¢æäœãæ¯æ100…
ð ãPythonã£ãŠæåŒ·ãã…
ð Pythonã®ç°å¢æ§ç¯ã§ã€…