Szanowni profesjonaliści,
Proszę, w wolnej chwili, o przejrzenie kodu i udzielenie cennych wskazówek jak ten kod można ulepszyć.
Kod na Githubie
Plik READ ME.txt - tu jest opis co miało być zaimplementowane.
Instrukcja implementacji interfejsu
* add(CartItemInterface $cartItem) * remove(CartItemInterface $cartItem)
/** @return \CartItemInterface[] $items */ * getCartItems()
protected ProductInterface $product; protected int $quantity = 1;
class SomeService { /** * @ var LoggerInterface */ private $logger; public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } public function execute() { $this->logger->debug('hello'); } }
class SomeService { public function execute() { Logger::getLogger()->debug('hello'); } }
$di->get('Db\Adapter\Oracle');
$im = $di->instanceManager(); $im->addAlias('trolololo', 'Db\Adapter\Oracle');
/* @var $db Db\Adapter\Oracle */
/** * @ var LoggerInterface */ private $logger; public function setLogger(LoggerInterface $logger) { $this->logger = $logger; }
/** * @Inject * @var LoggerInterface */ protected $logger; /** * @Inject */ public function setLogger(LoggerInterface $logger) { }
Jest zły, niweczy większość, jak nie wszystkie z zalet DI, utrudnia testowanie aplikacji oraz może sprawiać jakieś problemy przy przejmowaniu po kimś kodu. Chcieliśmy tylko zwrócić Ci uwagę na to że pow. przykład kodu nie jest przykładem realizacji dependency injection.
$mailer = $this->someContainer->get('my.mailer.service'); $mailer->doSth();
Jest już kompletną*, nieakademicką implementacją IoC w formie DI (konkretnie zrealizowaną przez setter injection). I tego typu konstrukcje spotkamy w większości bibliotek i aplikacji - tych napisanych z zachowaniem minimum standardów jakości. Nie potrzebujemy tutaj żadnych kontenerów zależności by z tego kodu korzystać z pełnym wykorzystaniem zalet obiektówki i DI.
class SomeService { /** * @ var LoggerInterface */ private $logger; public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } public function execute() { $this->logger->debug('hello'); } }
$mailer = $this->someContainer->get('my.mailer.service'); $mailer->doSth();
1. Tutaj na dobrą sprawę w ogóle nie mamy właściwie DI. Co prawda sam kontener zależności jest przekazywany w sposób typowy dla DI, ale nie on nas tutaj interesuje.
class MyService { protected $container; public function __construct($container) { $htis->container = $container; } public function doSth() { ... $mailer = $this->container->get('my.mailer.service'); $mailer->doSth(); } public function doSthElse() { ... $repo = $this->container->get('my.repo'); $obj = $repo->create(..); ... $repo->save($obj); } }
Muszę robić jakieś cuda w postaci klonowania całego kontenera, ustawiania mu jednego innego serwisu i przekazywania dopiero tego do MyService. A i tak cholera wie czy to w ogóle dalej będzie działało.
$realService = new MyService($mailer, $repo); $dummyService = new MyService(new DummyMailer(), $repo);