ä»æ¥ã¯ãOOPã¢ããªã±ãŒã·ã§ã³ã§ã®ãªããžã§ã¯ãã®åæåã§çºçããå¯èœæ§ã®ããåé¡ãšããããã®åé¡ã解決ããããã®äžè¬çãªãã¶ã€ã³ãã¿ãŒã³ã®äœ¿çšæ¹æ³ã«ã€ããŠèª¬æããŸãã
äŸ
ææ°ã®OOPã¢ããªã±ãŒã·ã§ã³ã¯ãæ°åãæ°çŸãæã«ã¯æ°åã®ãªããžã§ã¯ãã§åäœããŸãã ããŠãã¢ããªã±ãŒã·ã§ã³ã§ãããã®ãªããžã§ã¯ããã©ã®ããã«åæåããããã詳ããèŠãŠã¿ãŸãããã ãã®èšäºã§ã¯ããªããžã§ã¯ãã®åæåã®ã¿ãé¢å¿ã®ããåŽé¢ã§ããããããäœåãªãå®è£ ããã¹ãŠçç¥ããããšã«ããŸããã
GETãªã¯ãšã¹ããç¹å®ã®URIã«éä¿¡ãããµãŒããŒã®å¿çããHTMLãè¿ãããšãã§ããéåžžã«äŸ¿å©ãªã¯ã©ã¹ãäœæãããšããŸãããã ã¯ã©ã¹ãåçŽãããããã«èŠããã®ãé²ãããã«ãçµæã確èªãããééã£ãããµãŒããŒå¿çã®å Žåã«äŸå€ãã¹ããŒããŸãã
class Grabber { public function get($url) {/** returns HTML code or throws an exception */} }
çµæã®HTMLã®ãã£ã«ã¿ãªã³ã°ãæ åœãããªããžã§ã¯ããæã€å¥ã®ã¯ã©ã¹ãäœæããŸãã filterã¡ãœããã¯ãHTMLã³ãŒããšCSSã»ã¬ã¯ã¿ãŒãåŒæ°ãšããŠåãåããæå®ãããã»ã¬ã¯ã¿ãŒã§èŠã€ãã£ãèŠçŽ ã®é åãè¿ããŸãã
class HtmlExtractor { public function filter($html, $selector) {/** returns array of filtered elements */} }
ããã§ãæå®ãããããŒã¯ãŒãã®Googleæ€çŽ¢çµæãååŸããå¿ èŠããããšæ³åããŠãã ããã ãããè¡ãããã«ãGrabberã¯ã©ã¹ã䜿çšããŠãªã¯ãšã¹ããéä¿¡ããHtmlExtractorã¯ã©ã¹ã䜿çšããŠå¿ èŠãªã³ã³ãã³ããååŸããå¥ã®ã¯ã©ã¹ãå°å ¥ããŸãã ãŸããURIæ§ç¯ããžãã¯ãåä¿¡ããHTMLããã£ã«ã¿ãªã³ã°ããåä¿¡ããçµæãåŠçããããã®ã»ã¬ã¯ã¿ãŒãå«ãŸããŸãã
class GoogleFinder { private $grabber; private $filter; public function __construct() { $this->grabber = new Grabber(); $this->filter = new HtmlExtractor(); } public function find($searchString) { /** returns array of founded results */} }
Grabberããã³HtmlExtractorãªããžã§ã¯ãã®åæåã¯ãGoogleFinderã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ããããšã«æ°ã¥ããŸãããïŒ ãã®æ±ºå®ãã©ãã»ã©æåããããèããŠã¿ãŸãããã
ãã¡ãããã³ã³ã¹ãã©ã¯ã¿ãŒã§ãªããžã§ã¯ãã®äœæãããŒãã³ãŒãã£ã³ã°ããããšã¯ãå§ãã§ããŸããã ãããŠãããã«çç±ããããŸãã ãŸããå®éã®ãªã¯ãšã¹ãã®éä¿¡ãé¿ããããã«ããã¹ãç°å¢ã§Grabberã¯ã©ã¹ãç°¡åã«çœ®ãæããããšã¯ã§ããŸããã å ¬å¹³ã«èšãã°ãããã¯Reflection APIã䜿çšããŠè¡ãããšãã§ãããšèšã䟡å€ããããŸã ã ã€ãŸã æè¡çãªå¯èœæ§ã¯ååšããŸãããããã¯æã䟿å©ã§æçœãªæ¹æ³ãšã¯ã»ã©é ããã®ã§ãã
次ã«ãGoogleFinderããžãã¯ãGrabberããã³HtmlExtractorã®ä»ã®å®è£ ã§åå©çšãããå Žåãåãåé¡ãçºçããŸãã äŸåé¢ä¿ã®äœæã¯ãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸãã æè¯ã®å ŽåãGoogleFinderãç¶æ¿ãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒããªãŒããŒã©ã€ãã§ããŸãã ãããŠãããã§ããã°ã©ããŒãšãã£ã«ã¿ãŒã®ããããã£ã®ã¹ã³ãŒããä¿è·ãããŠããããå ¬éãããŠããå Žåã®ã¿ã
æåŸã®ç¬éãæ°ããGoogleFinderãªããžã§ã¯ããäœæãããã³ã«ãã¡ã¢ãªå ã«æ°ããäŸåé¢ä¿ãªããžã§ã¯ãã®ãã¢ãäœæãããŸãããGoogleFinderã¿ã€ãã®è€æ°ã®ãªããžã§ã¯ãã§Grabberã¿ã€ãã®1ã€ã®ãªããžã§ã¯ããšHtmlExtractorã¿ã€ãã®1ã€ã®ãªããžã§ã¯ãã䜿çšã§ããŸãã
äŸåé¢ä¿ã®åæåã¯ã¯ã©ã¹ã®å€ã«ç§»åããå¿ èŠãããããšãæ¢ã«ç解ããŠãããšæããŸãã æºåæžã¿ã®äŸåé¢ä¿ãGoogleFinderã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãå¿ èŠãããå ŽåããããŸãã
class GoogleFinder { private $grabber; private $filter; public function __construct(Grabber $grabber, HtmlExtractor $filter) { $this->grabber = $grabber; $this->filter = $filter; } public function find($searchString) { /** returns array of founded results */} }
ä»ã®éçºè ã«GrabberãšHtmlExtractorã®å®è£ ãè¿œå ããã³äœ¿çšããæ©äŒãæäŸãããå Žåããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå°å ¥ããããšãæ€èšãã䟡å€ããããŸãã ãã®å Žåãããã¯æçšã§ããã ãã§ãªããå¿ èŠã§ããããŸãã ãããžã§ã¯ãã§1ã€ã®å®è£ ã®ã¿ã䜿çšããå°æ¥æ°ããå®è£ ãäœæããã€ããããªãå Žåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®äœæãæåŠããå¿ èŠããããšæããŸãã ç¶æ³ã«å¿ããŠè¡åããå®éã«å¿ èŠãçãããšãã«ç°¡åãªãªãã¡ã¯ã¿ãªã³ã°ãè¡ãããšããå§ãããŸãã
ããã§ãå¿ èŠãªã¯ã©ã¹ããã¹ãŠæããã³ã³ãããŒã©ãŒã§GoogleFinderã¯ã©ã¹ã䜿çšã§ããŸãã
class Controller { public function action() { /* Some stuff */ $finder = new GoogleFinder(new Grabber(), new HtmlExtractor()); $results = $finder->find('search string'); /* Do something with results */ } }
å°èšãèŠçŽããŸãã ç§ãã¡ã¯ããããããªã³ãŒããæžããŸããããäžèŠãããšããã§ã¯äœãééã£ãŠããŸããã§ããã ããã... ... GoogleFinderã®ãããªãªããžã§ã¯ããä»ã®å Žæã§äœ¿çšããå¿ èŠãããå Žåã¯ã©ãã§ããããïŒ ãã®äœæãè€è£œããå¿ èŠããããŸãã ãã®äŸã§ã¯ãããã¯1è¡ã®ã¿ã§ãããåââé¡ã¯ããã»ã©ç®ç«ã¡ãŸããã å®éã«ã¯ããªããžã§ã¯ãã®åæåã¯éåžžã«è€éã«ãªãå¯èœæ§ããããæ倧10è¡ããŸãã¯ãã以äžãããå ŽåããããŸãã ã³ãŒãã®è€è£œã«å žåçãªä»ã®åé¡ãçºçããŸãã ãªãã¡ã¯ã¿ãªã³ã°äžã«ã䜿çšããã¯ã©ã¹ã®ååãŸãã¯ãªããžã§ã¯ãã®åæåã®ããžãã¯ãå€æŽããå¿ èŠãããå Žåããã¹ãŠã®å Žæãæåã§å€æŽããå¿ èŠããããŸãã ããªãã¯ãããã©ã®ããã«èµ·ãããç¥ã£ãŠãããšæã:)
éåžžãããŒãã³ãŒãã¯ç°¡åã§ãã éåžžãéè€ããå€ã¯æ§æã«é 眮ãããŸãã ããã«ããã䜿çšããããã¹ãŠã®å Žæã§å€ãäžå çã«å€æŽã§ããŸãã
ã¬ãžã¹ããªãã³ãã¬ãŒãã
ãã®ãããæ§æã«ãªããžã§ã¯ããäœæããããšã«ããŸããã ãã£ãŠã¿ãŸãããã
$registry = new ArrayObject(); $registry['grabber'] = new Grabber(); $registry['filter'] = new HtmlExtractor(); $registry['google_finder'] = new GoogleFinder($registry['grabber'], $registry['filter']);
ArrayObjectãã³ã³ãããŒã©ãŒã«æž¡ãã ãã§åé¡ã¯è§£æ±ºããŸãã
class Controller { private $registry; public function __construct(ArrayObject $registry) { $this->registry = $registry; } public function action() { /* Some stuff */ $results = $this->registry['google_finder']->find('search string'); /* Do something with results */ } }
ã¬ãžã¹ããªã®æŠå¿µãããã«çºå±ãããããšãã§ããŸãã ArrayObjectã®ç¶æ¿ãæ°ããã¯ã©ã¹å ã®ãªããžã§ã¯ãã®äœæã®ã«ãã»ã«åãåæååŸã®æ°ãããªããžã§ã¯ãã®è¿œå ãªã©ãçŠæ¢ããŸãã ããããç§ã®æèŠã§ã¯ãäžèšã®ã³ãŒãã«ãããã¬ãžã¹ããªãã³ãã¬ãŒããäœã§ããããå®å šã«ç解ããããšãã§ããŸãã ãã®ãã¿ãŒã³ã¯ãžã§ãã¬ãŒã¿ãŒã«ã¯é©çšãããŸããããããçšåºŠã¯åé¡ã解決ã§ããŸãã ã¬ãžã¹ããªã¯ããªããžã§ã¯ããæ ŒçŽããã¢ããªã±ãŒã·ã§ã³å ã§è»¢éã§ããåãªãã³ã³ããã§ãã ãªããžã§ã¯ãã䜿çšå¯èœã«ããã«ã¯ããŸããªããžã§ã¯ããäœæãããã®ã³ã³ãããŒã«ç»é²ããå¿ èŠããããŸãã ãã®ã¢ãããŒãã®é·æãšçæãèŠãŠã¿ãŸãããã
äžèŠãç®æšãéæããŸããã ã¯ã©ã¹åã®ããŒãã³ãŒãã£ã³ã°ãåæ¢ãããªããžã§ã¯ãã1ãæã§äœæããŸããã ãªããžã§ã¯ããåäžã®ã³ããŒã§äœæããåå©çšãä¿èšŒããŸãã ãªããžã§ã¯ãã®äœæããžãã¯ãå€æŽãããå Žåãã¢ããªã±ãŒã·ã§ã³å ã®1ã€ã®å Žæã®ã¿ãç·šéããå¿ èŠããããŸãã ããŒãã¹ãšããŠãã¬ãžã¹ããªå ã®ãªããžã§ã¯ããéäžç®¡çããæ©èœãåãåããŸããã 䜿çšå¯èœãªãã¹ãŠã®ãªããžã§ã¯ãã®ãªã¹ããç°¡åã«ååŸãããããã䜿çšããŠæäœãå®è¡ã§ããŸãã ãã®ãã³ãã¬ãŒãã§ç§ãã¡ã«åããªããã®ãèŠãŠã¿ãŸãããã
ãŸããã¬ãžã¹ããªã«ç»é²ããåã«ãªããžã§ã¯ããäœæããå¿ èŠããããŸãã ãããã£ãŠããäžèŠãªãªããžã§ã¯ãããäœæããå¯èœæ§ãé«ããªããŸãã ã¡ã¢ãªå ã«äœæãããŸãããã¢ããªã±ãŒã·ã§ã³ã§ã¯äœ¿çšãããŸããã ã¯ãããªããžã§ã¯ããã¬ãžã¹ããªã«åçã«è¿œå ã§ããŸãã ç¹å®ã®èŠæ±ãåŠçããããã«å¿ èŠãªãªããžã§ã¯ãã®ã¿ãäœæããŸãã äœããã®æ¹æ³ã§ããããæåã§å¶åŸ¡ããå¿ èŠããããŸãã ãããã£ãŠãæéã®çµéãšãšãã«ç¶æããããšã¯éåžžã«å°é£ã«ãªããŸãã
次ã«ãæ°ããã³ã³ãããŒã©ãŒã®äŸåé¢ä¿ããããŸãã ã¯ããã¬ãžã¹ããªãã³ã³ã¹ãã©ã¯ã¿ã«æž¡ããªãããã«ãã¬ãžã¹ããªã®éçã¡ãœãããä»ããŠãªããžã§ã¯ããåãåãããšãã§ããŸãã ããããç§ã®æèŠã§ã¯ããããè¡ãã¹ãã§ã¯ãããŸããã éçã¡ãœããã¯ããªããžã§ã¯ãå ã«äŸåé¢ä¿ãäœæãããããããã«å°é£ãªæ¥ç¶ã§ããããã¹ããå°é£ã§ãïŒãã®ãããã¯ã«é¢ããåªããèšäºãåç §ããŠãã ãã ïŒã
第äžã«ãã³ã³ãããŒã©ãŒã€ã³ã¿ãŒãã§ãŒã¹ã¯ã䜿çšãããŠãããªããžã§ã¯ãã«ã€ããŠã¯äœãäŒããŸããã ã³ã³ãããŒã©ãŒããã¬ãžã¹ããªã§å©çšå¯èœãªãªããžã§ã¯ããååŸã§ããŸãã ãã¹ãŠã®ãœãŒã¹ã³ãŒãããã§ãã¯ãããŸã§ãã³ã³ãããŒã©ãŒã䜿çšãããªããžã§ã¯ããæ£ç¢ºã«èšãã®ã¯å°é£ã§ãã
å·¥å Žæ¹åŒ
ã¬ãžã¹ããªã§ã¯ããªããžã§ã¯ããæåã«åæåããŠã¢ã¯ã»ã¹å¯èœã«ããå¿ èŠããããšããäºå®ã«æãäžå¿«ã§ãã æ§æã§ãªããžã§ã¯ããåæåãã代ããã«ããªããžã§ã¯ããäœæããããžãã¯ãå¥ã®ã¯ã©ã¹ã«åé¢ããããããå¿ èŠãªãªããžã§ã¯ãããã«ãããããã«ãäŸé Œãããããšãã§ããŸãã ãªããžã§ã¯ãã®äœæãæ åœããã¯ã©ã¹ã¯ããã¡ã¯ããªãŒãšåŒã°ããŸãã ãããŠãèšèšãã¿ãŒã³ã¯ãã¡ã¯ããªãŒã¡ãœãããšåŒã°ããŸãã ãã¡ã¯ããªãŒã®äŸãèŠãŠã¿ãŸãããã
class Factory { public function getGoogleFinder() { return new GoogleFinder($this->getGrabber(), $this->getHtmlExtractor()); } private function getGrabber() { return new Grabber(); } private function getHtmlExtractor() { return new HtmlFiletr(); } }
ååãšããŠã1ã€ã®ã¿ã€ãã®ãªããžã§ã¯ãã®äœæãæ åœãããã¡ã¯ããªãŒãäœæãããŸãã ãã¡ã¯ããªã¯ãé¢é£ãããªããžã§ã¯ãã®ã°ã«ãŒããäœæã§ããå ŽåããããŸãã ããããã£ã§ãã£ãã·ã¥ã䜿çšããŠããªããžã§ã¯ãã®åäœæãåé¿ã§ããŸãã
class Factory { private $finder; public function getGoogleFinder() { if (null === $this->finder) { $this->finder = new GoogleFinder($this->getGrabber(), $this->getHtmlExtractor()); } return $this->finder; } }
ãã¡ã¯ããªã¡ãœããããã©ã¡ãŒã¿ãŒåããå ¥åãã©ã¡ãŒã¿ãŒã«å¿ããŠä»ã®ãã¡ã¯ããªãŒã«åæåãå§ä»»ã§ããŸãã ããã¯ãAbstract Factoryãã³ãã¬ãŒãã«ãªããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã¢ãžã¥ãŒã«ã«åå²ããå¿ èŠãçããå Žåãåã¢ãžã¥ãŒã«ãç¬èªã®ãã¡ã¯ããªãŒãæäŸããããã«èŠæ±ã§ããŸãã å·¥å Žã®ããŒããããã«çºå±ãããããšã¯ã§ããŸããããã®ãã³ãã¬ãŒãã®æ¬è³ªã¯æ確ã ãšæããŸãã ã³ã³ãããŒã©ãŒã§ãã¡ã¯ããªãŒã䜿çšããæ¹æ³ãèŠãŠã¿ãŸãããã
class Controller { private $factory; public function __construct(Factory $factory) { $this->factory = $factory; } public function action() { /* Some stuff */ $results = $this->factory->getGoogleFinder()->find('search string'); /* Do something with results */ } }
ãã®ã¢ãããŒãã®å©ç¹ã«ã¯ããã®ã·ã³ãã«ããå«ãŸããŸãã ç§ãã¡ã®ãªããžã§ã¯ãã¯æ瀺çã«äœæãããããªãã®IDEã¯ãããèµ·ããå Žæã«ããªããç°¡åã«å°ããŸãã ãŸããã¬ãžã¹ããªã®åé¡ã解決ããŸãããã¡ã¢ãªå ã®ãªããžã§ã¯ãã¯ããã¡ã¯ããªã«ãåãåãããããšãã«ã®ã¿äœæãããŸãã ããããã³ã³ãããŒã©ãŒã«å¿ èŠãªå·¥å ŽãäŸçµŠããæ¹æ³ããŸã 決å®ããŠããŸããã ããã€ãã®ãªãã·ã§ã³ããããŸãã éçã¡ãœããã䜿çšã§ããŸãã ã³ã³ãããŒã©ãŒã«å¿ èŠãªãã¡ã¯ããªãŒãäœæãããã³ããŒãšè²Œãä»ãããªãããã¹ãŠã®è©Šã¿ãç¡å¹ã«ããããšãã§ããŸãã å·¥å Žã®å·¥å Žãäœæããããã ããã³ã³ãããŒã©ãŒã«è»¢éã§ããŸãã ããããã³ã³ãããŒã©ãŒã§ãªããžã§ã¯ããååŸããããšã¯ããå°ãè€éã«ãªããå·¥å Žéã®äŸåé¢ä¿ã管çããå¿ èŠããããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã§ã¢ãžã¥ãŒã«ã䜿çšããå Žåãã¢ãžã¥ãŒã«ãã¡ã¯ããªãç»é²ããæ¹æ³ãç°ãªãã¢ãžã¥ãŒã«ããã®ãã¡ã¯ããªéã®éä¿¡ã管çããæ¹æ³ã«ã€ããŠã¯ãå®å šã«æ確ã§ã¯ãããŸããã äžè¬ã«ããã¡ã¯ããªã®äž»ãªå©ç¹-ãªããžã§ã¯ãã®æ瀺çãªäœæã倱ããŸããã ãããŠã圌ãã¯ãŸã ã³ã³ãããŒã©ãŒã®ãæé»ã®ãã€ã³ã¿ãŒãã§ãŒã¹ã®åé¡ã解決ããŠããŸããã
ãµãŒãã¹ãã±ãŒã¿ãŒ
Service Locatorãã³ãã¬ãŒãã䜿çšãããšãå·¥å Žã®æçåã®æ¬ åŠã解決ãããªããžã§ã¯ãã®äœæãèªåçãã€äžå çã«ç®¡çã§ããŸãã èããŠã¿ããšãã¢ããªã±ãŒã·ã§ã³å ã§ãªããžã§ã¯ããäœæãããããã®ãªããžã§ã¯ãéã®é¢ä¿ã管çããæœè±¡ã¬ã€ã€ãŒãè¿œå ã§ããŸãã ãã®ã¬ã€ã€ãŒããªããžã§ã¯ããäœæã§ããããã«ããã«ã¯ããããè¡ãæ¹æ³ã«é¢ããç¥èãä»äžããå¿ èŠããããŸãã
Service Locatorãã³ãã¬ãŒãã®æ¡ä»¶ïŒ
- ãµãŒãã¹ïŒServiceïŒ-ã³ã³ããããååŸã§ããå®æãããªããžã§ã¯ãã
- ãµãŒãã¹ã®èª¬æïŒãµãŒãã¹å®çŸ©ïŒ-ãµãŒãã¹ãåæåããããã®ããžãã¯ã
- ã³ã³ããïŒãµãŒãã¹ã³ã³ããïŒã¯ããã¹ãŠã®èª¬æãæ ŒçŽããããããããµãŒãã¹ãäœæã§ããäžå€®ãªããžã§ã¯ãã§ãã
class ServiceContainer extends ArrayObject { public function get($key) { if (is_callable($this[$key])) { return call_user_func($this[$key]); } throw new \RuntimeException("Can not find service definition under the key [ $key ]"); } }
次ã«ãå®çŸ©ã®ç»é²ã¯æ¬¡ã®ããã«ãªããŸãã
$container = new ServiceContainer(); $container['grabber'] = function () { return new Grabber(); }; $container['html_filter'] = function () { return new HtmlExtractor(); }; $container['google_finder'] = function() use ($container) { return new GoogleFinder($container->get('grabber'), $container->get('html_filter')); };
ãããŠã次ã®ããã«ã³ã³ãããŒã©ãŒã§äœ¿çšããŸãïŒ
class Controller { private $container; public function __construct(ServiceContainer $container) { $this->container = $container; } public function action() { /* Some stuff */ $results = $this->container->get('google_finder')->find('search string'); /* Do something with results */ } }
ãµãŒãã¹ã³ã³ããã¯éåžžã«åçŽãªå ŽåããããŸãããéåžžã«è€éãªå ŽåããããŸãã ããšãã°ãSymfony Service Containerã¯å€ãã®å¯èœæ§ãæäŸããŸãïŒãã©ã¡ãŒã¿ãŒããã©ã¡ãŒã¿ãŒããµãŒãã¹ã®ç¯å²ãã¿ã°ã«ãããµãŒãã¹ã®æ€çŽ¢ããšã€ãªã¢ã¹ããã©ã€ããŒããµãŒãã¹ããã¹ãŠã®ãµãŒãã¹ãè¿œå ããåŸã«ã³ã³ãããŒã«å€æŽãå ããæ©èœïŒã³ã³ãã€ã©ãã¹ïŒãªã©ã DIExtraBundleã¯ãæšæºå®è£ ãããã«æ¡åŒµããŸãã
ããããäŸã«æ»ããŸãããã ã芧ã®ãšãããService Locatorã¯ä»¥åã®ãã³ãã¬ãŒããšåæ§ã«ãããã®åé¡ããã¹ãŠè§£æ±ºããã ãã§ãªããç¬èªã®ãµãŒãã¹å®çŸ©ã§ã¢ãžã¥ãŒã«ãç°¡åã«äœ¿çšã§ããããã«ããŸãã
ããã«ããã¬ãŒã ã¯ãŒã¯ã¬ãã«ã§ãè¿œå ã®æœè±¡åã¬ãã«ãåãåããŸããã ã€ãŸããServiceContainer :: getã¡ãœãããå€æŽããããšã«ãããããšãã°ããªããžã§ã¯ãããããã·ã«çœ®ãæããããšãã§ããŸãã ãŸãããããã·ãªããžã§ã¯ãã®ç¯å²ã¯ãéçºè ã®æ³ååã«ãã£ãŠã®ã¿å¶éãããŸãã ããã§ã¯ãAOPãã©ãã€ã ãLazyLoadingãªã©ãå®è£ ã§ããŸãã
ããããã»ãšãã©ã®éçºè ã¯äŸç¶ãšããŠService Locatorãã¢ã³ããã¿ãŒã³ãšèããŠããŸãã çè«çã«ã¯ããããã Container Awareã¯ã©ã¹ïŒã€ãŸããã³ã³ãããŒãžã®åç §ãå«ãã¯ã©ã¹ïŒã ããšãã°ãå éšã§ä»»æã®ãµãŒãã¹ãååŸã§ããã³ã³ãããŒã©ãŒã
ãªããããæªãã®ãèŠãŠã¿ãŸãããã
ãŸããããäžåºŠãã¹ãããŸãã ãã¹ãã§äœ¿çšãããã¯ã©ã¹ã«å¯ŸããŠã®ã¿mokaãäœæãã代ããã«ãã³ã³ããå šäœã«å¯ŸããŠmokãå®è¡ããããå®éã®ã³ã³ããã䜿çšããå¿ èŠããããŸãã æåã®ãªãã·ã§ã³ã¯åããªã 2çªç®ã®ãã¹ãã§ã¯ãäžå¿ èŠãªã³ãŒããããããæžãå¿ èŠããããŸãã åäœãã¹ãã®ååãšççŸãããã¹ãããµããŒãããããã®è¿œå ã³ã¹ãã«ã€ãªããå¯èœæ§ããããŸãã
第äºã«ããªãã¡ã¯ã¿ãªã³ã°ããããšã¯å°é£ã§ãã ã³ã³ããå ã®ãµãŒãã¹ïŒãŸãã¯ServiceDefinitionïŒãå€æŽããããšã«ããããã¹ãŠã®äŸåãµãŒãã¹ã匷å¶çã«ãã§ãã¯ãããŸãã ãããŠããã®åé¡ã¯IDEã䜿çšããŠè§£æ±ºãããŸããã ã¢ããªã±ãŒã·ã§ã³å šäœã§ãã®ãããªå ŽæãèŠã€ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã äŸåãµãŒãã¹ã«å ããŠãã³ã³ãããããªãã¡ã¯ã¿ãªã³ã°ããããµãŒãã¹ãååŸããããã¹ãŠã®å Žæã確èªããå¿ èŠããããŸãã
ããŠã3çªç®ã®çç±ã¯ãã³ã³ããããã®ãµãŒãã¹ã®å¶åŸ¡ãããªããããããé ããæ©ãããã³ãŒãã®æ··ä¹±ãšäžå¿ èŠãªæ··ä¹±ã«ã€ãªããããšã§ãã ããã説æããã®ã¯å°é£ã§ããç¹å®ã®ãµãŒãã¹ãã©ã®ããã«æ©èœããããç解ããããã«ããå€ãã®æéãè²»ããå¿ èŠããããŸããèšãæãããšããã¹ãŠã®ãœãŒã¹ã³ãŒããèªãã ãã§ã¯ã©ã¹ã®æ©èœãåäœãå®å šã«ç解ã§ããŸãã
äŸåæ§æ³šå ¥
ã¢ããªã±ãŒã·ã§ã³ã§ã³ã³ããã®äœ¿çšãå¶éããããã«ä»ã«äœãã§ããŸããïŒ ã³ã³ãããŒã©ãå«ããã¹ãŠã®ãŠãŒã¶ãŒãªããžã§ã¯ãã®äœæã«å¯Ÿããå¶åŸ¡ããã¬ãŒã ã¯ãŒã¯ã«æž¡ãããšãã§ããŸãã ã€ãŸãããŠãŒã¶ãŒã³ãŒãã¯ã³ã³ããã®getã¡ãœãããåŒã³åºããªãã§ãã ããã ãã®äŸã§ã¯ãã³ã³ãããŒã©ãŒã®å®çŸ©ã³ã³ãããŒã«è¿œå ã§ããŸãã
$container['google_finder'] = function() use ($container) { return new Controller(Grabber $grabber); };
ãããŠãã³ã³ãããŒã©ãŒã®ã³ã³ãããŒãåãé€ããŸãã
class Controller { private $finder; public function __construct(GoogleFinder $finder) { $this->finder = $finder; } public function action() { /* Some stuff */ $results = $this->finder->find('search string'); /* Do something with results */ } }
ãã®ã¢ãããŒãïŒãµãŒãã¹ã³ã³ãããžã®ã¢ã¯ã»ã¹ãã¯ã©ã€ã¢ã³ãã¯ã©ã¹ã«æäŸãããªãå ŽåïŒã¯ãäŸåæ§æ³šå ¥ãšåŒã°ããŸãã ãããããã®ãã³ãã¬ãŒãã«ã¯é·æãšçæã®äž¡æ¹ããããŸãã å¯äžã®è²¬ä»»ã®ååãé å®ããŠããéããã³ãŒãã¯éåžžã«èŠæ ãããããªããŸãã ãŸããã¯ã©ã€ã¢ã³ãã¯ã©ã¹ã®ã³ã³ãããåé€ããããããããã®ã³ãŒãã¯ããç解ãããããªããããã·ã³ãã«ã«ãªããŸããã å¿ èŠãªäŸåé¢ä¿ã眮ãæããããšã§ãã³ã³ãããŒã©ãŒãç°¡åã«ãã¹ãã§ããŸãã TDDãŸãã¯BDDã®ã¢ãããŒãã䜿çšããŠãä»ã®ã¯ã©ã¹ïŒã³ã³ãããŒã©ãŒã¯ã©ã¹ãå«ãïŒããç¬ç«ããŠåã¯ã©ã¹ãäœæããã³ãã¹ãã§ããŸãã ãã¹ããäœæãããšããã³ã³ããããæœè±¡åããåŸã§ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããå¿ èŠããããšãã«å®çŸ©ãè¿œå ã§ããŸãã ããã«ãããã³ãŒããããã·ã³ãã«ã§ãããããããªãããã¹ããããéæã«ãªããŸãã
ããããã³ã€ã³ã®è£åŽã«èšåããå¿ èŠããããŸãã å®éãã³ã³ãããŒã©ãŒã¯éåžžã«ç¹æ®ãªã¯ã©ã¹ã§ãã ãããããã³ã³ãããŒã©ãŒã«ã¯ååãšããŠäžé£ã®ã¢ã¯ã·ã§ã³ãå«ãŸããŠããŸããã€ãŸããã³ã³ãããŒã©ãŒã¯åç¬ã®è²¬ä»»ã®ååã«éåããŠããŸãã ãã®çµæãã³ã³ãããŒã©ãŒã¯ã©ã¹ã«ã¯ãç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããã«å¿ èŠãªãã®ãããå€ãã®äŸåé¢ä¿ãããå ŽåããããŸãã é 延åæåã®äœ¿çšïŒãªããžã§ã¯ãã¯æåã®äœ¿çšæã«ã€ã³ã¹ã¿ã³ã¹åããããã®åã«è»œéãããã·ã䜿çšãããŸãïŒã«ãããããã©ãŒãã³ã¹ã®åé¡ãããçšåºŠè§£æ±ºãããŸãã ããããã¢ãŒããã¯ãã£ãŒã®èŠ³ç¹ããèŠããšãã³ã³ãããŒã©ãŒã«å€ãã®äŸåé¢ä¿ãäœæããããšãå®å šã«ã¯æ£ãããããŸããã ããã«ãã³ã³ãããŒã©ãŒã®ãã¹ãã¯éåžžââãäžå¿ èŠãªæäœã§ãã ãã¡ããããã¹ãŠã¯ããã¹ããã¢ããªã±ãŒã·ã§ã³ã§ã©ã®ããã«æ§æãããŠãããããããŠããã«ã€ããŠããªãèªèº«ãã©ã®ããã«æãããã«äŸåããŸãã
åã®æ®µèœãããäŸåæ§æ³šå ¥ã䜿çšããŠãã¢ãŒããã¯ãã£ã®åé¡ãå®å šã«ãªããªãããã§ã¯ãªãããšã«æ°ä»ããŸããã ãããã£ãŠãã³ã³ãããŒãžã®ãªã³ã¯ãã³ã³ãããŒã©ãŒã«ä¿åãããã©ãããèããŠã¿ãŠãã ããã æ£ãã決å®ã¯ãããŸããã ã³ã³ãããŒã©ãŒã®ã³ãŒããåçŽãªãŸãŸã§ããéããã©ã¡ãã®ã¢ãããŒããåªããŠãããšæããŸãã ãã ããã³ã³ãããŒã©ãŒä»¥å€ã«Conatiner AwareãµãŒãã¹ãäœæããªãã§ãã ããã
çµè«
ããŠãä»ã¯èšãããããšãã¹ãŠãããã¯ã¢ãŠãããæã§ãã ãããŠãããã¯ããããèšãããŸãã... :)
ãããã£ãŠããªããžã§ã¯ãã®äœæäœæ¥ãæ§é åããã«ã¯ã次ã®ãã¿ãŒã³ã䜿çšã§ããŸãã
- ã¬ãžã¹ã㪠ïŒãã³ãã¬ãŒãã«ã¯æãããªæ¬ é¥ããããŸããæãåºæ¬çãªãã®ã¯ããªããžã§ã¯ããå ±éã®ã³ã³ããã«å ¥ããåã«äœæããå¿ èŠãããããšã§ãã æããã«ãããã䜿çšããå©ç¹ãããå€ãã®åé¡ãçºçããŸãã ããã¯æããã«ãã³ãã¬ãŒãã®æé©ãªäœ¿çšæ³ã§ã¯ãããŸããã
- Factory Method ïŒãã¿ãŒã³ã®äž»ãªå©ç¹ïŒãªããžã§ã¯ãã¯æ瀺çã«äœæãããŸãã äž»ãªæ¬ ç¹ïŒã³ã³ãããŒã©ãŒèªäœã¯ãããŒãã³ãŒãã¯ã©ã¹åã®åé¡ã解決ããªããã¡ã¯ããªãŒã®äœæãå¿é ããå¿ èŠããããŸãããŸãã¯ããã¬ãŒã ã¯ãŒã¯ã¯ãã³ã³ãããŒã©ãŒã«å¿ èŠãªãã¹ãŠã®ãã¡ã¯ããªãŒãæäŸãã責任ããããŸãã ãªããžã§ã¯ããäœæããããã»ã¹ãéäžç®¡çããããšã¯ã§ããŸããã
- Service Locator ïŒãªããžã§ã¯ãã®äœæãå¶åŸ¡ããããããé«åºŠãªãæ¹æ³ã è¿œå ã®æœè±¡åã¬ãã«ã䜿çšããŠããªããžã§ã¯ãã®äœææã«çºçããäžè¬çãªã¿ã¹ã¯ãèªååã§ããŸãã äŸïŒ
class ServiceContainer extends ArrayObject { public function get($key) { if (is_callable($this[$key])) { $obj = call_user_func($this[$key]); if ($obj instanceof RequestAwareInterface) { $obj->setRequest($this->get('request')); } return $obj; } throw new \RuntimeException("Can not find service definition under the key [ $key ]"); } }
Service Locatorã®æ¬ ç¹ã¯ãã¯ã©ã¹ã®ãããªãã¯APIãæ å ±æäŸãåæ¢ããããšã§ãã ã©ã®ãµãŒãã¹ã䜿çšãããŠããããç解ããã«ã¯ããã¹ãŠã®ã¯ã©ã¹ã³ãŒããèªãå¿ èŠããããŸãã ã³ã³ããåç §ãå«ãã¯ã©ã¹ã¯ãã¹ããå°é£ã§ãã - Dependency Injection : Service Container, . , . , API .
äŸåæ§æ³šå ¥ããã®ä»ã®ãã¿ââãŒã³ã¯ãäžè¬ã«ä¿¡ããããŠããã»ã©è€éã§ã¯ãªãããšã瀺ãããã£ãã®ã§ãã
äŸåæ§æ³šå ¥ã«ã€ããŠèª¬æããå Žåããã®ãã¿ãŒã³ã®KISSå®è£ ããããŸããããšãã°ãã³ã¡ã³ããšãšãã«æ°çŸè¡ãã䜿çšããªãPimpleãªã©ããããŸãããããŠãSymfony Dependency Injection Componentã®ãããªã¢ã³ã¹ã¿ãŒãããŸããåºæ¬çãªååã¯åãã§ãããæ©èœã®ã»ããã¯æ¯èŒã§ããŸããã
ããŠããããããããããŠãèšäºãèªãã®ã«æéãè²»ãããããšã¯ç¡é§ã§ã¯ãªãã£ããšæããŸãã
楜ããã§ãã ããïŒ
PSæéãå²ããŠç§ã®ãªã¯ãšã¹ãã«å¿ããŠãããçãããã©ããããããšããç§ã¯ããªãã®æèŠãç¥ãããšãéèŠã§ãã;ïŒ