Portál AbcLinuxu, 12. května 2025 15:20

Dotaz: PHP a Dependency Injection

12.10.2020 21:49 Fanda
PHP a Dependency Injection
Přečteno: 264×
Odpovědět | Admin
Zdravim,

potreboval bych si, s vasi laskavou pomoci, ujasnit jeste nektere "best practices". Za kazdou nasledujici vetou si prosim domyslete otaznik

Dependency injection je, kdyz... predam tride jeji zavislosti pres konstruktor. Zavislostmi myslim instance jinych trid, ktere dotycna trida potrebuje. A kdyz je tech zavislosti hodne, a potrebuji casto vytvaret instanci te tridy, tak si na to udelam Factory

Chapu to treba u databaze. Kdy tride, ktera potrebuje pristupovat k databazi, predam nejaky databazovy adapter, ktery muzu pozdeji predelat treba z MySQL na Postgres a nebudu muset danou tridu prepisovat. Prepisu jenom ten adapter

Ale ma smysl predavat pres konstruktor i takove tridy jako DateTime, DateInterval, DatePeriod?

Jako mam takove simrani, ze to smysl ma. Pak preci staci kouknout na konstruktor te tridy, a vyctu odtama vsechny jeji zavislosti. Nemusim prohlizet tridu celou

A ma smysl si ke vsem zavislostem vytvaret vlastni "adaptery"?

Jo treba tridy MyDateTime, MyDateInterval, ... kde sice nebudu dedit z DateTime, DateInterval, abych nemusel resit argumenty jejich konstruktoru, ale kde si v konstruktoru udelam instanci te DateTime, a nadefinuju si vlastni metody, takze kdyby mi v budoucnu preskocilo, a chtel bych misto DateTime pouzit jinou tridu, tak mi staci prepsat jen ten adapter

Neni to uz trochu overkill? Kdyz se vlastne jedna o "nativni" PHP tridy?

Kde je ta hranice, kdy ma smysl delat adaptery/interfejsy, a kde uz je to zbytecny?

Diky

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

12.10.2020 21:58 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP a Dependency Injection
Odpovědět | | Sbalit | Link | Blokovat | Admin
Adaptér (návrhový vzor)
debian.plus@protonmail.com
12.10.2020 23:10 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: PHP a Dependency Injection
Odpovědět | | Sbalit | Link | Blokovat | Admin
Není to tak složité, jak to vypadá. Představ si, že máš třídu Item s položkou ceníku, u které chceš prezentovat částku ve více měnách. Některá má "Kč" za částkou, jiná "$" před částkou, některá s desetinnou tečkou, jiná s čárkou. Počet desetinných míst může být také různý. Tentýž problém můžeš řešit na mnoha místech programu a proto se vyplatí mít na to samostatnou třídu, resp. sadu tříd.

Vytvoříš si objekt, který bude specifický pro každou měnu. Ten objekt bude mít metodu format(), která bude umět převést částku na string.
$currency = new Dollar();
echo $item->formatPrice($currency);
Té metodě předáš v parametru objekt, který umí zformátovat částku metodou format(). Metoda formatPrice() bude tedy obsahovat:
return $currency->format($this->price);
Když změníš měnu, tak nemusíš měnit třídu Item, ale do $currency vložíš instanci jiné třídy, například Euro. Může to umět třeba i kurzový přepočet. Ta třída může obsahovat více metod, třeba pro výstup URL s obrázkem měny.

Totéž můžeš udělat i s kostruktorem, ale dá se to použít u jakékoli metody.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.