
第31åïŒããã¹ãã³ãŒãã®ã¬ã€ãã©ã€ã³ ãã®6ããå¯çµåãstaticã¡ãœããã®åªã ââ ãã¹ãäžèœãªãåºãŸã£ãå¿èã
âšïž ãããªã®æ²é³Žãšãåããªãããšãã£ã¿
æ±æ ¹æž©æ³æ¯éšã®å»äžã«ãæ¥ã®ã®ã©ããªç©ºæ°ãåãè£ããããªæ²é³Žãé¿ãæž¡ã£ãã
ããµãå 茩ãããïŒïŒ å©ããŠãã ããïŒ ãã¹ããâŠâŠãã¹ããå šç¶æžããªããã§ãïŒã
声ã®äž»ã¯ããã¡ãããããªã ãæ°ååãŸã§ããã¹ãã®å¢çç·ã¯èŠããïŒããšææ°æã ãšãã¹ã¯ã«åãã£ãŠããã¯ãã®åœŒå¥³ããä»ã¯é ãæ±ããã¢ãã¿ãŒã®åã§åæ³£ãã«ãªã£ãŠããã
ãµãïŒ ãã©ããã®ãã²ãŸïŒ æž©æ³ã®æž©åºŠèšå®ã§ãééããŠãã®ãŒãã¡ãã£ãïŒâšã
ãµããããã€ãã®ããã«è»œãè¶³åãã§ãããªã®ãã¹ã¯ã«ãã£ãŠããã
ãããªïŒ ãæž©åºŠã©ãããããªãã§ããïŒ ãã®ããã°ã€ã³ãŠãŒã¶ãŒã®æš©éãã§ãã¯ãã®ãã¹ããæžãããšãããã§ããã©ãã¢ãã¯åããããšããŠããšã©ãŒãåºãããç¡çãããã¹ããæµãããšãããšã1ã±ãŒã¹ããšã«PCãåºãŸã£ãã¿ããã«éããªããã§ãâŠâŠããããç§ã®PCãå£ããŠããã§ããããïŒã
ãããªã®ã¢ãã¿ãŒã«ã¯ãç¡æ©è³ªãªã¹ã¿ãã¯ãã¬ãŒã¹ã®å±±ãšãæ°åéããRunning...ãã®ãŸãŸåããªãããã°ã¬ã¹ããŒãæ ãåºãããŠããã
âšïž ã³ãŒãã«å»ãŸãããstaticãã®å»å°
ãµãã¯ãããªããããŠã¹ãåããåé¡ã®ãããã¯ã·ã§ã³ã³ãŒããã¹ã¯ããŒã«ããããããã«ã¯ãäžèŠãããšéåžžã«ãèªã¿ãããããæŽç¶ãšãããã³ãŒãã䞊ãã§ããã
def publish_article(self, article_id):
  # ãã°ã€ã³ãŠãŒã¶ãŒãååŸ
  user = Auth::user()
 Â
  # æš©éããã§ãã¯
  if not Permission::check(user, 'can_publish'):
    raise Exception("æš©éããããŸãã")
   Â
  # æ¥ä»ããã©ãŒããã
  published_at = TimeUtil::format_now()
 Â
  # ...èšäºå
¬éåŠç
ãµãïŒ ãããâŠâŠãããããããããâŠâŠãâšã
ãµãã®å£èª¿ããããã€ãã®è»œããããå°ãã ãæ¶ããã
ãããªïŒ ããã£ãäœãå€ã§ããïŒ Auth::user() ãšã TimeUtil::format() ãšããã©ãããã§ãåŒã¹ãŠäŸ¿å©ã ããã³ãŒããã¹ãããªããŠãŠãããªã£ãŠæã£ãŠããã§ããã©âŠâŠãã
ãµãïŒ ããããæžãã®ã¯æ¥œã ãããã§ãããã²ãŸãããããã¹ãã®ç¥æ§ããèŠããã絶察ãæãããªã³ãŒããªãã ããâš ãã®ã³ãŒãã«ã¯ããã¹ãã®èªç±ã奪ãåªããè³ãæã«å»ãŸããŠããã ãã
âšïž å¯çµåã®æ£äœ ââ ããã»ã¹åé¢ã®åŒå®³
ã«ã«ïŒ ãïŒèåŸããçŸããæã§å€§ããããå°ãäœã£ãŠæèšããïŒâŠâŠåœç¶ã§ããstatic㯠ãå¯çµåã ã®æš©åã§ããïŒð€ã
çªç¶ã®ã«ã«ã®ç»å Žã«ããããªã¯èçãæ£ãã
ãããªïŒ ãå¯çµåâŠâŠãã§ãããã ã®äŸ¿å©ããŒã«ãåŒãã§ããã ããããªãã§ãããã
ã«ã«ïŒ ãããã倧ããªééãã§ããïŒ staticã¡ãœããããªãåäœãã¹ãã«äžéœåãªã®ãããã®çç±ã¯å€§ããåããŠäºã€ãããŸããð€ã
â å·®ãæ¿ãäžèœãªãå£ã
ã«ã«ïŒ ããã¹ããšã¯ã察象ã®ã³ãŒããå€éšããåãé¢ããäŸåããŠããéšåãã身代ããïŒã¢ãã¯ïŒãã«å·®ãæ¿ããŠå®éšããè¡çºã§ããããããAuth::user() ã®ããã«ã¯ã©ã¹åã«çŽæ¥çŽã¥ããã¡ãœããã¯ãå€éšããå·®ãæ¿ããééããããŸãããæ¬ç©ã®èªèšŒåŠçãæ¬ç©ã®DBæ¥ç¶ã匷å¶çã«åŒãé£ããŠãããããã§ã¯åäœãã¹ãã«ãªããŸãããïŒïŒð€ã
â¡ å®è¡é床ã®äœäžãšãããæ³¥æ²Œã
ã«ã«ïŒ ãèšèªãç¹ã«PHPãªã©ã«ãããŠã¯ãããããstaticã¡ãœãããç¡çããå€éšããæžãæããŠãã¹ãããããšãããšããã¹ãã±ãŒã¹ããšã«ãããã»ã¹åé¢ïŒProcess IsolationïŒããšããéåžžã«éãåŠçãèµ°ãããå¿ èŠãåºãŠããŸããããªãããPCãéãããšèšã£ãŠããã®ã¯ãäžã€ã®ãã¹ããæµããã³ã«ãè£åŽã§PHPã®å®è¡ç°å¢ãäžžããšåèµ·åãããŠããããã§ãããïŒïŒð€ã
ãµãããã¯ã€ãããŒãã«å¿èã®çµµãæããã
ãµãïŒ ãã²ãŸãæ³åããŠã¿ãŠãå¿èãèžã®éªšãçèãšããã¿ãªäžäœåããŠåºãŸã£ãŠããããããµãŒãžãã§ããªããããã€ãã¹æè¡ãã§ããªãã§ããïŒâš ãã¹ãã£ãŠããã®ã¯ãäžåºŠå¿èãäœããåãé¢ããŠã人工å¿èºïŒã¢ãã¯ïŒã«äº€æããŠåãããŠã¿ãå®éšãªãã ãstaticãå€çšããã³ãŒãã¯ãéšååå£«ãæº¶ãåã£ãŠåºãŸã£ãå¿èãšåããã¡ã¹ãå ¥ããééããªããã ããâšã
âšïž staticãé¿ããŠãDIããšããåè·¯ãéã ââ ããªãããªçŸ
ãããªã¯ãèªåã®æžããã䟿å©ãªã¯ãã®ã³ãŒããããããã«ã¡ã³ããã³ã¹ã®èªç±ã奪ã£ãŠããããçæããã
ããªïŒ ããããªã¡ãããã ãããããèšèšã®åã§åŠãã ãDIïŒäŸåæ§ã®æ³šå ¥ïŒããå¿ èŠã«ãªãã®ããâã
ããªãéãã«è£è¶³ããã
ããªïŒ ãstaticã§çŽæ¥åŒã¶ã®ã§ã¯ãªããå¿ èŠãªæ©èœãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã§ãåãåããããã«å€ãããããã ãã§ãã³ãŒãã«åçãªãããªãããããçãŸããããâã
# DIã䜿ã£ãèšèš
class ArticleService:
  def __init__(self, auth_provider, permission_checker):
    self.auth = auth_provider
    self.permission = permission_checker
  def publish_article(self, article_id):
    user = self.auth.get_user() # staticã§ã¯ãªã
    # ...
ãŠã€ïŒ ããã âŠâŠã£ãâŠâŠãããªãããã¹ãã®æã«âŠâŠæ¬ç©ã®Authã¯ã©ã¹ãããªããŠâŠâŠãåžžã«ç¹å®ã®ãŠãŒã¶ãŒãè¿ãåœç©ãããå€ãããµããšæž¡ããŠãããããããâŠâŠã£ãã
ãŠã€ã®èšèã«ããããªã®ç®ãèŒããåãæ»ããã ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããŠãã¢ãããšããŠæ±ãããã£ãããã ãã®ããšã§ãããã»ã©èŠåŽããŠããã¢ãã¯åãåã®ããã«ã¹ã ãŒãºã«ãªããããã»ã¹åé¢ãšããéãæ·ãå€ããã®ã ã
ãããªïŒ ãstaticã¯äŸ¿å©ãã®è£ã«ããã¹ãã®èªç±ã奪ãåªãããã£ããã§ãããâŠâŠãç§ã䟿å©ã ããã£ãŠå®æã«éããã®ããããŸããDIãšããåè·¯ãã¡ãããšéããŠããã€ã§ãéšåã亀æã§ãããããªãããªçŸãäœããŸãïŒã
æ±æ ¹æž©æ³ã®ç¥çè²ã®æ¹¯ããã®æãããã¯ã決ããŠåºãŸãããšã®ãªããããªããããã®è±¡åŸŽã®ããã ã£ãã ãããªã®æéµé³ã¯åã³è»œå¿«ã«ãªããä»åºŠã¯ãRunning...ãã®ããã°ã¬ã¹ããŒããç¬ãéã«Greenãžãšé§ãæããŠãã£ãã
ð ãã¹ã®ç§èµïŒèšèšã®çŸåŠãšçŸå Žã®ãªã¢ã«
staticã¡ãœããã¯ã確ãã«äŸ¿å©ã§ãã ã€ã³ã¹ã¿ã³ã¹åã®æéãããããã©ãããã§ãæè»œã«åŒã³åºããããããããã®ãæè»œããããããå€§èŠæš¡ãªãããžã§ã¯ãã«ãããŠã¯èŽåœçãªè¶³ãããšãªããŸãã
ãããŸã§ã®èšèšã®é£èŒã§ãè§ŠããŠããŸããããç§ãã¡ã¯DIïŒDependency InjectionïŒãåºæ¬ã«æ®ããã¹ãã§ãã ãªããªããstaticã¡ãœãããå éšã§åŒã³åºããç¬éããã®ã¡ãœããã¯åŒã³åºãå ãšãå¯çµåãããŠããŸãããã§ããå€éšããåãé¢ããŠãã¹ãããããšããŠããstaticã¡ãœãããšããå£ãç«ã¡ã¯ã ãããäŸåé¢ä¿ã®æ³¥æ²Œã«åŒããã蟌ãŸããããšã«ãªããŸãã
æè¡çãªåŽé¢ããèŠãã°ãåé¿çããªãããã§ã¯ãããŸããã Pythonã§ããã°ãã¹ãå®è¡æã«ã¡ãœããèªäœãå·®ãæ¿ããããšãã§ããŸãããPHPã§ãã©ã€ãã©ãªãé§äœ¿ããŠstaticã¡ãœããã匷åŒã«äžæžãïŒOverrideïŒããããšã¯å¯èœã§ãã
ããããããã«ã¯å€§ããªä»£åã䌎ããŸãã ç¹ã«PHPã§ã¯æ¬æ¥ã¡ã¢ãªäžã«ããŒããããã¹ããæ£ããå®çŸ©ãããã¹ãã®ããã«æªããŠããŸããããä»ã®ãã¹ãã±ãŒã¹ã«æ·±å»ãªå¯äœçšãåãŒããªã¹ã¯ãçããŸãããã®å¯äœçšãé¿ããããã«ãå®è¡ããã»ã¹ãåããããšããéžæãããããåŸãªããªããçµæãšããŠãã¹ãã®å®è¡æéãèšãäžãã£ãŠããâŠâŠãããããååã話ããããé ããããã¹ãããçãå å¶ã®äžã€ãªã®ã§ãã
äžæ¹ã§ãLaravelã®ãFacadeãã®ããã«ãstaticãªã€ã³ã¿ãŒãã§ãŒã¹ãæã¡ãªããããã¹ãæã«ã¯ Fake ã¡ãœãããžå®¹æã«åãæ¿ããããä»çµã¿ãåãããã®ããããŸããããã¯Pythonã®å·®ãæ¿ãã«è¿ãå©äŸ¿æ§ãæäŸããŠãããŸãã
ã§ããããããã¯ãããŸã§ãææžæªçœ®ãã«éããŸããã æ¬è³ªçã«ã¯ãstaticã¡ãœããã«äŸåããèšèšãã®ãã®ãå¯çµåãæããŠããäºå®ã«å€ããã¯ãªãã®ã§ãã
DIã軞ã«èšèšãè¡ããäŸåé¢ä¿ãå€ããæ³šå ¥ããã ãã®ãççµåããä¿ã€ããã®èŠåŸããããã¯ãªãŒã³ã¢ãŒããã¯ãã£ãžãšç¶ãçéã§ãããå€åã«åŒ·ãããã€çéã§æ€èšŒå¯èœãªãçŸããäœãäžããããã®å¯äžã®è§£ã§ã¯ãªãã§ããããã
ïŒã€ã¥ãïŒ
#ãšã³ãžã㢠#ããã°ã©ãã³ã° #ãã¹ãã³ãŒã #ãŠããããã¹ã #èšèš #DI #äŸåæ§ã®æ³šå ¥ #staticã¡ãœãã #å¯çµå #ççµå #ãœãããŠã§ã¢éçº #ãªãã¡ã¯ã¿ãªã³ã° #ã¯ãªãŒã³ã³ãŒã #PHP #Python #æè¡çè² åµ #æ±æ ¹æž©æ³ç§å¯çµç€Ÿ #ãã¹ãå®¹ææ§