
ãœãããŠã§ã¢ãä»ã®éçºè
ãšè°è«ãããã³ã«ãç¹ã«WordPresséçºã®ã³ã³ããã¹ãã§ã¯ãã·ã³ã°ã«ãã³ããŒãããããã¢ããããŸãã æšæºãã³ãã¬ãŒããšèŠãªãããŠããå Žåã§ããããããé¿ããã¹ãçç±ã説æããããšããããšããããããŸãã
ãã®èšäºã§ã¯ããªãã³ãŒãã§ã·ã³ã°ã«ããŒã³ã䜿çšãã¹ãã§ã¯ãªãã®ããåæ§ã®åé¡ã解決ããããã«ã©ã®ãããªä»£æ¿çãååšããã®ãããšãããããã¯ã«ã€ããŠè©³ãã説æããŸãã
ã·ã³ã°ã«ãã³ãšã¯äœã§ããïŒ
ã·ã³ã°ã«ãã³ã¯ãã ãã¶ã€ã³ãã¿ãŒã³ïŒåå©çšå¯èœãªãªããžã§ã¯ãæåãœãããŠã§ã¢ã®èŠçŽ ïŒèè
-The Gang of Four ïŒ ããšããæ¬ã§èª¬æãããŠãããœãããŠã§ã¢éçºã®ãã¶ã€ã³ãã¿ãŒã³ã§ãããã®ãããã§ããã¶ã€ã³ãã¿ãŒã³ããœãããŠã§ã¢éçºããŒã«ãšããŠåãäžããããŸããã
ã¢ã€ãã¢ã¯ãã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã ãååšããå¿
èŠãããããã®ã¯ã©ã¹ãžã®ã°ããŒãã«ãªåäžã¢ã¯ã»ã¹ãã€ã³ããæäŸãããšãããã®ã§ãã
ããã¯å®éã«ã¯èª¬æãšçè§£ãéåžžã«ç°¡åã§ãããå€ãã®äººã«ãšã£ãŠãã·ã³ã°ã«ãã³ã¯ãã¶ã€ã³ãã¿ãŒã³ã®äžçãžã®ç°¡åãªãšã³ããªãŒã§ãããæã人æ°ã®ãããã¿ãŒã³ã§ãã
ã·ã³ã°ã«ãã³ã¯äººæ°ããããæ¬ã§èª¬æããæšæºåãããæåã®ãã³ãã¬ãŒãã®1ã€ã§ããã äžéšã®éçºè
ã¯ããããã¢ã³ããã³ãã¬ãŒããšã©ã®ããã«èããŠããŸããïŒ ããã¯æ¬åœã«ãããªã«æªãããšãã§ããŸããïŒ
ã¯ã
ã¯ããã§ããŸãã
ããããã·ã³ã°ã«ããŒã³ã¯äŸ¿å©ã§éèŠã§ãïŒ
å€ãã®äººã2ã€ã®é¢é£ããæŠå¿µãæ··åããŠããããšã«æ°ä»ããŸããã ã·ã³ã°ã«ãã³ãå¿
èŠã§ãããšèšããšãããªããžã§ã¯ãã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãç°ãªãã€ã³ã¹ã¿ã³ã¹åæäœã§å®éã«äœ¿çšããå¿
èŠããããŸã ã äžè¬ã«ãã€ã³ã¹ã¿ã³ã¹ãäœæãããšããã®ã¯ã©ã¹ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæãããŸãã ãã ããäžéšã®ãªããžã§ã¯ãã§ã¯ã䜿çšå Žæã«é¢ä¿ãªãããªããžã§ã¯ãã®åãå
±æã€ã³ã¹ã¿ã³ã¹ãåžžã«äœ¿çšããå¿
èŠããããŸãã
ããããã·ã³ã°ã«ãã³ã¯ãã®ããã®é©åãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãã ã
æ··ä¹±ã¯ãã·ã³ã°ã«ãã³ã2ã€ã®æ©èœïŒè²¬ä»»ïŒã1ã€ã®ãªããžã§ã¯ãã«çµåãããšããäºå®ã«ãã£ãŠåŒãèµ·ããããŸã ã ããŒã¿ããŒã¹ã«æ¥ç¶ããã·ã³ã°ã«ãã³ããããšããŸãã ïŒéåžžã«å·§åŠã«ïŒ DatabaseConnection
ãšåŒã³ãŸãããã ã·ã³ã°ã«ãã³ã«ã¯çŸåšã2ã€ã®äž»èŠãªæ©èœããããŸãã
- æ¥ç¶ç®¡çã
DatabaseConnection
ã€ã³ã¹ã¿ã³ã¹ç®¡çã
人ã
ãã·ã³ã°ã«ãã³ãéžæããã®ã¯2çªç®ã®æ©èœã®ããã§ãããå¥ã®ãªããžã§ã¯ãããã®åé¡ã解決ããå¿
èŠããããŸãã
äžè¬çãªã€ã³ã¹ã¿ã³ã¹ã«åé¡ã¯ãããŸããã ãã ããããã«äœ¿çšãããªããžã§ã¯ãã¯ããã®ãããªå¶éã®å Žæã§ã¯ãããŸããã
以äžã«ããã€ãã®éžæè¢ã瀺ããŸãã ãããããŸããã·ã³ã°ã«ãã³ãåŒãèµ·ããå¯èœæ§ã®ããåé¡ã説æããŸãã
ã·ã³ã°ã«ãã³ã®åé¡
ã·ã³ã°ã«ãã³ãšãœãªãã
ãŸã第äžã«ãããã¯çè«çãªåé¡ã®ããã«èŠãããããããŸããããã·ã³ã°ã«ãã³ã¯å€ãã®åºäœåçã«éåããŠããŸãã
- Sã¯å¯äžã®è²¬ä»»ã®ååã§ã ã åè¿°ã®ããã«ãæããã«ã·ã³ã°ã«ãã³ã¯åœŒãšççŸããŠããŸãã
- O- éæŸæ§/ééæ§ã®åå ïŒãªããžã§ã¯ãã¯å±éã®ããã«éããã倿Žã®ããã«éããããã¹ãã§ãã ã·ã³ã°ã«ãã³ã¯ã¢ã¯ã»ã¹ãã€ã³ããå¶åŸ¡ããæ¡åŒµæ©èœã§ã¯ãªãèªåèªèº«ã ããè¿ããããã·ã³ã°ã«ãã³ã¯ãã®ååã«éåããŸãã
- Lã¯ã Barbara Liskovã眮ãæããååã§ã ããªããžã§ã¯ãã¯ã䜿çšããã³ãŒãã倿Žããã«ããµãã¿ã€ãã®ã€ã³ã¹ã¿ã³ã¹ã«çœ®ãæããããšãã§ããŸãã ããã¯ãã·ã³ã°ã«ãã³ã®å Žåã«ã¯åœãŠã¯ãŸããŸããããªããžã§ã¯ãã®è€æ°ã®ç°ãªãããŒãžã§ã³ãæã€ããšã¯ãã·ã³ã°ã«ãã³ã§ã¯ãªããªã£ãããšãæå³ããããã§ãã
- I- ã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®åç ïŒå€ãã®ç¹æ®ãªã€ã³ã¿ãŒãã§ãŒã¹ã¯ã1ã€ã®æ±çšã€ã³ã¿ãŒãã§ãŒã¹ãããåªããŠããŸãã ããã¯ãã·ã³ã°ã«ãã³ãçŽæ¥éåããªãå¯äžã®ååã§ãããã€ã³ã¿ãŒãã§ãŒã¹ã®äœ¿çšãèš±å¯ããªãããã§ãã
- Dã¯äŸåé¢ä¿ã®å転ã®åçã§ã ãç¹å®ã®äœãã§ã¯ãªããæœè±¡åã®ã¿ã«äŸåããå¿
èŠããããŸãã ãã®å Žåãã·ã³ã°ã«ãã³ã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã«ã®ã¿äŸåã§ãããããã·ã³ã°ã«ãã³ã¯éåããŸãã
ã·ã³ã°ã«ãã³ãã¿ãŒã³ã¯ã5ã€ã® SOLIDååã®ãã¡4ã€ã«éåããŠããŸãã 圌ã¯ãããã圌ãã€ã³ã¿ãŒãã§ãŒã¹ãæã€ããšãã§ããã°ã5çªç®ãå£ããããšæãã§ããã...
ããã€ãã®çè«çåçã®ããã ãã«ã³ãŒããæ©èœããªããšèšãã®ã¯ç°¡åã§ãã ãããŠãç§èªèº«ã®çµéšã«ãããšããããã®ååã¯ããœãããŠã§ã¢ãéçºããéã«ä¿¡é Œã§ããæã䟡å€ãããä¿¡é Œã§ããã¬ã€ãã§ããããããã¯äºå®ã§ãããšããèšèã¯å€ãã®äººã«çŽåŸãããããªãããšãçè§£ããŠããŸãã ç§ãã¡ã¯ãããªãã®æ¯æ¥ã®ç·Žç¿ã«å¯Ÿããã·ã³ã°ã«ãã³ã®åœ±é¿ã远跡ããå¿
èŠããããŸãã
ã·ã³ã°ã«ãã³ãã¿ãŒã³ã䜿çšãã
ã·ã³ã°ã«ãã³ãæ±ããšãã«ééãããããããªãæ¬ ç¹ã®ããã€ãã以äžã«ç€ºããŸãã
ã³ã³ã¹ãã©ã¯ã¿ã«åŒæ°ãæž¡ããããåã蟌ãããšã¯ã§ããŸããã ã·ã³ã°ã«ãã³ãžã®æåã®åŒã³åºãã¯å®éã«ã³ã³ã¹ãã©ã¯ã¿ãŒãå®è¡ããã ãã§ãããã©ã®ã³ãŒããæåã«ã·ã³ã°ã«ãã³ã«å€ããããäºåã«ç¥ãããšã¯ã§ããªãããããã¹ãŠã®æ¶è²»ã³ãŒãã§ã¯ãåãåŒæ°ã»ããã䜿çšããŠã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãå¿
èŠããããŸãããããã¯å€ãã®å Žåã»ãšãã©äžå¯èœã§ããããŸã£ããæå³ããããŸããã ãã®çµæãã·ã³ã°ã«ãã³ã¯ãOOPèšèªã®åºæ¬çãªã€ã³ã¹ã¿ã³ã¹åã¡ã«ããºã ã圹ã«ç«ããªãããŸãã
ã·ã³ã°ã«ãã³ã䜿çšããã³ã³ããŒãã³ãããã¹ããããšããã·ã³ã°ã«ãã³ãã¢ãã¯ããããšã¯ã§ããŸããã ããã«ããããã¹ã察象ã®ã³ãŒããå®å
šã«åé¢ããããšãã§ããªããããæ£ãããŠããããã¹ããã»ãŒäžå¯èœã«ãªããŸãã ãã®åé¡ã¯ããã¹ãããããžãã¯ã§ããåŒãèµ·ããããã®ã§ã¯ãªãããããã©ããããã€ã³ã¹ã¿ã³ã¹åã®ä»»æã®å¶éã«ãã£ãŠåŒãèµ·ããããŸãã
ã·ã³ã°ã«ãã³ã¯ãã³ãŒãããŒã¹å
šäœã§äœ¿çšãããã°ããŒãã«ã«ã¢ã¯ã»ã¹å¯èœãªæ§é ã§ãããããã«ãã»ã«åã®åªåã¯ç¡é§ã«ãªããã°ããŒãã«å€æ°ã®å Žåãšåãåé¡ãçºçããŸãã ã€ãŸããã³ãŒãã®ã«ãã»ã«åãããéšåã§ã·ã³ã°ã«ãã³ãã©ã®ããã«åé¢ããããšããŠããä»ã®å€éšã³ãŒãã¯ã·ã³ã°ã«ãã³ã§å¯äœçšããã°ãåŒãèµ·ããå¯èœæ§ããããŸãã ãããŠãé©åãªã«ãã»ã«åããªããã°ãOOPã®åçã¯è¡°åŒ±ããŸãã
DatabaseConnection
ã·ã³ã°ã«ãã³ãçªç¶ãæåã®ããŒã¿ããŒã¹ä»¥å€ã®2çªç®ã®ããŒã¿ããŒã¹ã«æ¥ç¶ããå¿
èŠãããã»ã©å€§ãããªã£ãWebãµã€ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ãããå Žåãåé¡ãçºçããŸãã ã¢ãŒããã¯ãã£èªäœã忀èšããå Žåã«ãã£ãŠã¯ã³ãŒãã®å€§éšåãå®å
šã«æžãçŽãå¿
èŠããããŸãã
ã·ã³ã°ã«ãã³ãçŽæ¥ãŸãã¯éæ¥çã«äœ¿çšãããã¹ãŠã®ãã¹ãã¯ã1ã€ã®ãã¹ãããå¥ã®ãã¹ãã«æ£ããåãæ¿ããããšã¯ã§ããŸããã ãããã¯åžžã«ã·ã³ã°ã«ãã³ãä»ããŠç¶æ
ãä¿åããŸããããã¯ããã¹ããèµ·åã®é åºã«äŸåããäºæããªãåäœã«ã€ãªããå¯èœæ§ããããŸãã
- ã·ã³ã°ã«ãã³ã®ã€ã³ã¹ã¿ã³ã¹åã¯ãéçã¹ã³ãŒãã«é©ããçŸåšã®ããã»ã¹ã®ã¹ããŒã¹ã«åŒ·å¶çã«é©çšãããŸãã ããã¯ãè€æ°ã®ããã»ã¹ãŸãã¯åæ£å®è¡ãããå Žåã®äžŠååã®åé¡ãæå³ããŸãã ããã¯ãã·ã³ã°ã«ããŒã³ã忣ã·ã¹ãã ã§ã®äœæ¥ãéå§ãããšããã«å£ããåãªã誀ã£ãæŠå¿µã§ããå¯èœæ§ã瀺åããã¯ãã§ãã
ã·ã³ã°ã«ãã³ã®ä»£æ¿
ç§ã¯ãã¹ãŠã«æªããã®ãèŠãŠãã人ã«ã¯ãªããããããŸããããåé¡ã®è§£æ±ºçãæäŸããããšã¯ã§ããŸããã æåã«ã·ã³ã°ã«ãã³ã®äœ¿çšãåé¿ããæ¹æ³ã決å®ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒããã¯ãã£å
šäœãè©äŸ¡ããå¿
èŠããããšæããŸãããã·ã³ã°ã«ãã³ããã¹ãŠã®èŠä»¶ãæºãããã»ãšãã©ã®æ¬ ç¹ããªãã¡ã«ããºã ã«ç°¡åã«çœ®ãæããããšãã§ããWordPressã®æãäžè¬çãªæ¹æ³ã®ããã€ãããå§ãããŸãã ããããããã«ã€ããŠè©±ãåã«ãç§ã®ææ¡ããã¹ãŠåŠ¥åã§ããçç±ã«æ³šç®ããããšæããŸãã
ã¢ããªã±ãŒã·ã§ã³éçºçšã®ãçæ³çãªãã¬ãŒã ã¯ãŒã¯ãããããŸãã çè«çã«ã¯ãæé©ãªãªãã·ã§ã³ã¯ãã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ããªãŒå
šäœãäžããäžã«äœæããããŒãã³ãŒãå
ã®å¯äžã®ã€ã³ã¹ã¿ã³ã¹ååŒã³åºãã§ãã ããã¯æ¬¡ã®ããã«æ©èœããŸãã
- ã€ã³ã¹ã¿ã³ã¹
App
ïŒ Config
ã Database
ã Controller
ãå¿
èŠïŒã App
ã€ã³ã¹ã¿ã³ã¹Config
ãApp
ã§ã®å±éã®ããã®Database
ãApp
ã§å®è£
ããããã®Controller
ã€ã³ã¹ã¿ã³ã¹ïŒ Router
ã Views
ãå¿
èŠïŒãController
å®è£
ããããã®Router
ã€ã³ã¹ã¿ã³ã¹ïŒ HTTPMiddleware
ãå¿
èŠïŒã- ...
1åã®åŒã³åºãã§ãã¢ããªã±ãŒã·ã§ã³ã¹ã¿ãã¯å
šäœãäžããäžã«äžŠã¹ãããå¿
èŠã«å¿ããŠäŸåé¢ä¿ã泚å
¥ãããŸãã ãã®ã¢ãããŒãã®ç®çïŒ
- åãªããžã§ã¯ãã«ã¯ãå¿
èŠãªäŸåé¢ä¿ã®æ£ç¢ºãªãªã¹ããããããããã ãããããã䜿çšããå¿
èŠããããŸãã äœããå£ããå Žåããã®åå ãšãªã£ãŠããã³ãŒããç°¡åã«åé¢ã§ããŸãã
- ãªããžã§ã¯ãéã«å¯æ¥ãªæ¥ç¶ã¯ãããŸãã;å®è£
ãããå®è£
ã䜿çšãããšãããã¹ãŠã®ãªããžã§ã¯ãã¯ã€ã³ã¿ãŒãã§ãŒã¹ã®ã¿ã«äŸåããŸãã
- ã°ããŒãã«ã¹ããŒã¿ã¹ã¯ãããŸããã éå±€ã®äžäœã«ããåãµãããªãŒã¯ãä»ã®ãµãããªãŒããæ£ããåé¢ããããããéçºè
ã¯ã¢ãžã¥ãŒã«Aã倿ŽããŠãã¢ãžã¥ãŒã«Bã«ãã°ãäœæããããšã¯ãããŸããã
ããããã©ãã»ã©è¯ãé³ãèãããŠããWordPressã§ãããè¡ãããšã¯äžå¯èœã§ããããã¯ãéäžåãããã³ã³ãããŸãã¯å®è£
ã¡ã«ããºã ãæäŸããããã¹ãŠã®ãã©ã°ã€ã³/ããŒããåç¬ã§ããŒããããããã§ãã
ã¢ãããŒããè°è«ããéããããèŠããŠãããŠãã ããã WordPressã¹ã¿ãã¯å
šäœãäžå
åãããå®è£
ã¡ã«ããºã ã«ãã£ãŠã€ã³ã¹ã¿ã³ã¹åãããçæ³çãªãœãªã¥ãŒã·ã§ã³ã¯ãWordPressã³ã¢ã®ãµããŒããå¿
èŠãšãããããå©çšã§ããŸããã 以äžã«èª¬æãããã¹ãŠã®ã¢ãããŒãã¯ãäŸåé¢ä¿ãå°å
¥ããã®ã§ã¯ãªããããžãã¯ããçŽæ¥åç
§ããŠäŸåé¢ä¿ãé ããªã©ãç¹å®ã®äžè¬çãªæ¬ ç¹ãç¹åŸŽã§ãã
ã·ã³ã°ã«ãã³ã³ãŒã
ä»ã®äººãšæ¯èŒããã·ã³ã°ã«ãã³ã¢ãããŒãã䜿çšãããµã³ãã«ã³ãŒãïŒ
// . final class DatabaseConnection { private static $instance; private function __construct() {} // . public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } // . public function query( ...$args ) { // . } } // . $database = DatabaseConnection::get_instance(); $result = $database->query( $query );
ããã§ã¯ãçè«çãªè°è«ã«ãšã£ãŠéèŠã§ã¯ãªããããã·ã³ã°ã«ããŒã³ãé »ç¹ã«ããŠã³ããŒããããå®è£
ã®è©³çްããã¹ãŠèšèŒããŠããŸããã
å·¥å Žæ¹åŒ
ã»ãšãã©ã®å Žåãã·ã³ã°ã«ãã³ã«é¢é£ããåé¡ãåé¿ããæåã®æ¹æ³ã¯ããã¡ã¯ããªã¡ãœãããã¶ã€ã³ãã¿ãŒã³ã䜿çšããããšã§ãã ãã¡ã¯ããªã¯ãä»ã®ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããããšãå¯äžã®çŸ©åãšãããªããžã§ã¯ãã§ãã get_instance()
ã¡ãœããã䜿çšããŠç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãäœæããDatabaseConnectionManager
代ããã«ã DatabaseConnection
ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããDatabaseConnection
ãŸãã äžè¬ã«ãå·¥å Žã¯åžžã«ç®çã®æœèšã®æ°ããã€ã³ã¹ã¿ã³ã¹ãçæããŸãã ãã ããèŠæ±ããããªããžã§ã¯ããšã³ã³ããã¹ãã«åºã¥ããŠããã¡ã¯ããªã¯ãæ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããåžžã«å
±æããããèªåã§æ±ºå®ã§ããŸãã
ãã³ãã¬ãŒãã®ååãèãããšãPHPã³ãŒããããJavaã³ãŒãã«äŒŒãŠãããšæããããããããŸããããã®ãããå³å¯ãããïŒãããŠæ laãªïŒåœåèŠåããéžè±ããŠãããç¬åµçã«ãã¡ã¯ããªãŒã«ååãä»ããŠãã ããã
ãã¡ã¯ããªã¡ãœããã®äŸïŒ
// . final class Database { public function get_connection(): DatabaseConnection { static $connection = null; if ( null === $connection ) { // , , . $connection = new MySQLDatabaseConnection(); } return $connection; } } // , (mock) . interface DatabaseConnection { public function query( ...$args ); } // . final class MySQLDatabaseConnection implements DatabaseConnection { public function query( ...$args ) { // . } } // . $database = ( new Database )->get_connection(); $result = $database->query( $query );
ã芧ã®ãšãããã³ãŒãã®æ¶è²»ã¯ããã»ã©èšå€§ã§è€éã§ã¯ãªããããæ³šæç¹ã¯1ã€ã ãã§ãã DatabaseConnection
ãæäŸããAPIã®äžéšã§ããããã DatabaseConnection
代ããã«ååãä»ããããšã«ããŸããããŸããè«ççãªæ£ç¢ºããšç°¡æœãã®ãã©ã³ã¹ãåžžã«ãšãããã«åªåããå¿
èŠããããŸãã
å·¥å Žã®æå®ã®ããŒãžã§ã³ã«ã¯ã1ã€ãé€ããŠãåè¿°ã®ã»ãšãã©ãã¹ãŠã®æ¬ ç¹ããããŸããã
DatabaseConnection
ãªããžã§ã¯ããšã®å¯æ¥ãªé¢ä¿ãåé€ããŸãããã代ããã«ãã¡ã¯ããªãšã®æ°ããé¢ä¿ãäœæããŸããã ãã¡ã¯ããªã¯çŽç²ãªæœè±¡åã§ãããããããã¯åé¡ã§ã¯ãããŸãããããæç¹ã§ãã€ã³ã¹ã¿ã³ã¹åãã®æŠå¿µããé¢ããå¿
èŠããã確çã¯éåžžã«å°ããã§ãã ãããçºçããå ŽåãOOPãã©ãã€ã å
šäœãåèããå¿
èŠããããŸãã
ãããããç§ãã¡ã¯åäžã®ã€ã³ã¹ã¿ã³ã¹åã«èªåã匷å¶çã«éå®ããããšã¯ãã¯ãã§ããªãã®ã§ã¯ãªãããšæããå§ããŠããã§ãããã DatabaseConnection
å®è£
ã®å
±æã€ã³ã¹ã¿ã³ã¹ã¯åžžã«æäŸããŸãããã ãã§ãnew MySOLDatabaseConnection
ãå®è¡ããŠè¿œå ã®ã€ã³ã¹ã¿ã³ã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã ã¯ããããã§ãããããã·ã³ã°ã«ãã³ãæŸæ£ããçç±ã®1ã€ã§ãã ããããããã¯å®éã®ã¿ã¹ã¯ã§åžžã«å©ç¹ããããããšã¯éããŸããããŠããããã¹ããªã©ã®åºæ¬çãªèŠä»¶ã«æºæ ããããšãäžå¯èœã«ãªãããã§ãã
éç代ç
éçãããã·ã¯ãã·ã³ã°ã«ãã³ã倿Žã§ããå¥ã®èšèšãã¿ãŒã³ã§ãã ããã¯ããã¡ã¯ããªãŒãããããã«è¿ãæ¥ç¶ãæå³ããŸãããå°ãªããšãç¹å®ã®å®è£
ã§ã¯ãªããæœè±¡åã«ããæ¥ç¶ã§ãã èãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®éçãããã³ã°ãããããããã®éçåŒã³åºãã¯ç¹å®ã®å®è£
ã«ééçã«ãªãã€ã¬ã¯ãããããšããããšã§ãã ãããã£ãŠãå®éã®å®è£
ãšã®çŽæ¥çãªé¢ä¿ã¯ãªãã éçãªä»£ç人ã䜿çšããå®è£
ã®éžææ¹æ³ã決å®ããŸãã
// . final class Database { public static function get_connection(): DatabaseConnection { static $connection = null; if ( null === $connection ) { // You can have arbitrary logic in here to decide what // implementation to use. $connection = new MySQLDatabaseConnection(); } return $connection; } public static function query( ...$args ) { // Forward call to actual implementation. self::get_connection()->query( ...$args ); } } // , (mock) . interface DatabaseConnection { public function query( ...$args ); } // . final class MySQLDatabaseConnection implements DatabaseConnection { public function query( ...$args ) { // . } } // . $result = Database::query( $query );
ã芧ã®ãšããã éçãªä»£æ¿ã¯éåžžã«çãã¯ãªãŒã³ãªAPIãäœæããŸãã æ¬ ç¹ã«ã¯ãã³ãŒããšã¯ã©ã¹ã·ã°ããã£ã®éã«å¯æ¥ãªé¢ä¿ããããšããäºå®ãå«ãŸããŸãã é©åãªå Žæã§äœ¿çšãããšãç¹å®ã®å®è£
ã§ã¯ãªããçŽæ¥å¶åŸ¡ã§ããæœè±¡åãšã®æ¥ç¶ã§ãããããããã¯ç¹å¥ãªåé¡ãåŒãèµ·ãããŸããã 1ã€ã®ããŒã¿ããŒã¹ã®ã³ãŒãããå¿
èŠãšèããä»ã®ããŒã¿ããŒã¹ã®ã³ãŒãã«çœ®ãæããããšãã§ããå®è£
ã¯ãã¹ãå¯èœãªå®å
šã«æ£åžžãªãªããžã§ã¯ãã®ãŸãŸã§ãã
WordPressãã©ã°ã€ã³API
WordPressãã©ã°ã€ã³APIã¯ããã©ã°ã€ã³ãä»ããŠã°ããŒãã«ã¢ã¯ã»ã¹ãæäŸã§ããããã«ããããã«äœ¿çšãããå Žåãã·ã³ã°ã«ããŒã³ã眮ãæããããšãã§ããŸãã ããã¯ãWordPressã®å¶éãèæ
®ããæãã¯ãªãŒã³ãªãœãªã¥ãŒã·ã§ã³ã§ããã³ãŒãã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãšã¢ãŒããã¯ãã£å
šäœãWordPressãã©ã°ã€ã³APIã«é¢é£ä»ããããŠããããšã«æ³šæããŠãã ããã ç°ãªããã¬ãŒã ã¯ãŒã¯ã§ã³ãŒããåå©çšããå Žåã¯ããã®æ¹æ³ã䜿çšããªãã§ãã ããã
// , (mock) . interface DatabaseConnection { const FILTER = 'get_database_connection'; public function query( ...$args ); } // . class MySQLDatabaseConnection implements DatabaseConnection { public function query( ...$args ) { // . } } // . $database = new MySQLDatabaseConnection(); add_filter( DatabaseConnection::FILTER, function () use ( $database ) { return $database; } ); // . $database = apply_filters( DatabaseConnection::FILTER ); $result = $database->query( $query );
äž»ãªãã¬ãŒããªãã®1ã€ã¯ãã¢ãŒããã¯ãã£ãWordPressãã©ã°ã€ã³APIã«çŽæ¥çµã³ä»ããããããšã§ãã Drupalãµã€ãã«ãã©ã°ã€ã³æ©èœãæäŸããäºå®ãããå Žåã¯ãã³ãŒããå®å
šã«æžãçŽãå¿
èŠããããŸãã
ãã1ã€ã®èããããåé¡ã¯ãWordPressããã¯ã®ã¿ã€ãã³ã°ã«äŸåããŠããããšã§ãã ããã«ãããã¿ã€ãã³ã°ã«é¢é£ãããã°ãçºçããå¯èœæ§ããããå€ãã®å ŽåãåçŸããã³ä¿®æ£ãå°é£ã§ãã
ãµãŒãã¹ãã±ãŒã¿ãŒ
ãµãŒãã¹ãã±ãŒã¿ãŒã¯ã Inversion of Control Containerã® 1ã€ã®åœ¢åŒã§ãã äžéšã®ãµã€ãã§ã¯ããã®æ¹æ³ãã¢ã³ããã¿ãŒã³ãšããŠèª¬æããŠããŸãã äžæ¹ã§ãããã¯çå®ã§ããã仿¹ã§ãäžã§è°è«ããããã«ãããã§è¡ããããã¹ãŠã®æšå¥šäºé
ã¯åŠ¥åãšèŠãªãããšãã§ããã ãã§ãã
ãµãŒãã¹ãã±ãŒã¿ãŒã¯ãä»ã®å Žæã§å®è£
ããããµãŒãã¹ãžã®ã¢ã¯ã»ã¹ãæäŸããã³ã³ãããŒã§ãã ã³ã³ããã¯ãã»ãšãã©ã®å Žåãèå¥åã«é¢é£ä»ããããã€ã³ã¹ã¿ã³ã¹ã®ã³ã¬ã¯ã·ã§ã³ã§ãã ããé«åºŠãªãµãŒãã¹ãã±ãŒã¿ãŒã®å®è£
ã§ã¯ãé
å»¶ã€ã³ã¹ã¿ã³ã¹åã代æ¿çæãªã©ã®æ©èœãå°å
¥ã§ããŸãã
// , . interface Container { public function has( string $key ): bool; public function get( string $key ); } // . class ServiceLocator implements Container { protected $services = []; public function has( string $key ): bool { return array_key_exists( $key, $this->services ); } public function get( string $key ) { $service = $this->services[ $key ]; if ( is_callable( $service ) ) { $service = $service(); } return $service; } public function add( string $key, callable $service ) { $this->services[ $key ] = $service; } } // , (mock) . interface DatabaseConnection { public function query( ...$args ); } // . class MySQLDatabaseConnection implements DatabaseConnection { public function query( ...$args ) { // . } } // . $services = new ServiceLocator(); $services->add( 'Database', function () { return new MySQLDatabaseConnection(); } ); // . $result = $services->get( 'Database' )->query( $query );
ãæ³åã®ãšããã $services
ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ãååŸããåé¡ã¯ãªããªããŸããã§ããã ãã®æ¹æ³ãåã®3ã€ãšçµã¿åãããããšã§è§£æ±ºã§ããŸãã
- å·¥å Žã§ïŒ
$result = ( new ServiceLocator() )->get( 'Database' )->query( $query );
- éç代æ¿ã®å Žå ïŒ
$result = Services::get( 'Database' )->query( $query );
- WordPressãã©ã°ã€ã³APIã䜿çšããå ŽåïŒ
$services = apply_filters( 'get_service_locator' ); $result = $services->get( 'Database' )->query( $query );
ãã ããã·ã³ã°ã«ãã³ã¢ã³ããã¿ãŒã³ã®ä»£ããã«ãµãŒãã¹ãã±ãŒã¿ãŒã¢ã³ããã¿ãŒã³ã䜿çšãããã©ããã®è³ªåã«ã¯ãŸã çãããããŸãã... ãµãŒãã¹ãã±ãŒã¿ãŒã«åé¡ããããŸããäŸåé¢ä¿ããé ãããŸãã æ£ããã³ã³ã¹ãã©ã¯ã¿ãŒå®è£
ã䜿çšããã³ãŒãããŒã¹ãæ³åããŠãã ããã ãã®å Žåãç¹å®ã®ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãèŠãã ãã§ããã®ãªããžã§ã¯ããäŸåããŠãããªããžã§ã¯ããããã«çè§£ã§ããŸãã ãªããžã§ã¯ãããµãŒãã¹ãã±ãŒã¿ãŒãžã®ãªã³ã¯ã«ã¢ã¯ã»ã¹ã§ããå ŽåãäŸåé¢ä¿ã®ãã®æç€ºçãªè§£æ±ºããã€ãã¹ããå®éã®ããžãã¯ãããªããžã§ã¯ãã«ãªã³ã¯ãæœåºããããšãã§ããŸãïŒãããã£ãŠãäŸåãå§ããŸãïŒã ããã¯ã ãµãŒãã¹ãã±ãŒã¿ãŒãäŸåé¢ä¿ããé ãããšèšããšãã®æå³ã§ãã
ããããWordPressã®ã³ã³ããã¹ããèãããšãæåããå®å
šãªãœãªã¥ãŒã·ã§ã³ãå©çšã§ããªããšããäºå®ãåãå
¥ããå¿
èŠããããŸãã ã³ãŒãããŒã¹å
šäœã«äŸåé¢ä¿ã®æ£ããå®è£
ãå®è£
ããæè¡çãªæ©èœã¯ãããŸããã ããã¯ããããã«ããã劥åãæš¡çŽ¢ããå¿
èŠãããããšãæå³ããŸãã ãµãŒãã¹ãã±ãŒã¿ãŒã¯çæ³çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãããããã®ãã³ãã¬ãŒãã¯ã¬ã¬ã·ãŒã³ã³ããã¹ãã«é©åããå°ãªããšãã³ãŒãããŒã¹ã«æ£ãã°ãã®ã§ã¯ãªãã1ãæã§ãã¹ãŠã®ã劥åç¹ããåéã§ããŸãã
äŸåæ§æ³šå
¥
ç¬èªã®ãã©ã°ã€ã³ã§ã®ã¿äœæ¥ããä»ã®ãã©ã°ã€ã³ãžã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ãæäŸããå¿
èŠããªãå Žåã¯ã幞éã§ãããã®äŸåæ§æ³šå
¥ã䜿çšããŠãäŸåæ§ãžã®ã°ããŒãã«ã¢ã¯ã»ã¹ãåé¿ã§ããŸãã
// , (mock) . interface DatabaseConnection { public function query( ...$args ); } // . class MySQLDatabaseConnection implements DatabaseConnection { public function query( ...$args ) { // . } } // . class Plugin { private $database; public function __construct( DatabaseConnection $database ) { $this->database = $database; } public function run() { $consumer = new Consumer( $this->database ); return $consumer->do_query(); } } // . // . class Consumer { private $database; public function __construct( DatabaseConnection $database ) { $this->database = $database; } public function do_query() { // . // . return $this->database->query( $query ); } } // . $database = new MySQLDatabaseConnection(); $plugin = new Plugin( $database ); $result = $plugin->run();
, , , .
, , , .
, (wiring) . ( Dependency Injector ) ( ), .
, ( /, ):
// , (resolving) DatabaseConnection. $injector->alias( DatabaseConnection::class, MySQLDatabaseConnection::class ); // , DatabaseConnection . $injector->share( DatabaseConnection::class ); // Plugin, , . $plugin = $injector->make( Plugin::class );
çµã¿åãã
, , , .
, , , :
- .
- â (service provider), .
- â> .
- â> (service location).
- â> , .
Bright Nucleus Architecture .
ãããã«
. WordPress', .
, , , , .
, â , !