Hlavní navigace

Názor ke článku PHP Jet - Dependency Injection, továrny a tak dále od BoneFlute - Píšete: "Když už si nějaká třída / entita...

  • 13. 2. 2023 19:40

    BoneFlute

    Píšete: "Když už si nějaká třída / entita řeší své závislosti, tak je rozhodně lepší, když si je řeší v momentě, kdy je opravdu potřebuje..."
    Tento problém se neděje. Například Neťácký DIC dodá závislosti (díky továrničkám) až když jsou potřeba.

    Píšete: "... a to jednoduše, transparentně, přímočaře a intuitivně."
    Vaše řešení toto IMHO nesplňuje.

    Píšete: "Kolega řeší adresář kam se bude logovat, mluví o konstantě, parametru konstruktoru … No jo, ale co když vůbec nechci logovat do souborů? " - To je z toho článku jasně patrné. Logger je vytvořen tak, aby logoval do souborů. Pokud chcete logovat do databáze, vytvoříte DatabaseLogger (jste-li pořádkumilovný původní přejmenujete na FilebasedLogger) a předáte tu závislost, kterou požadujete.
    Dokonce si můžete všimnout, že David přísně řeší rozdělení zodpovědnosti. Tedy, že když vytváříte NewsletterDis­tributor, nepředáváte LogDir, protože ten není jeho starost.

    Vy máte vytvořenou třídu Logger, "který je nutné "naplnit" a tedy předat backend". Což je sice formálně v pořádku, ale v přímém rozporu s vaší požadovanou jednoduchostí - protože je to zbytečné.

    Na každý způsob logování (ve vaší terminologii backend) stačí prostě jen vytvořit implementaci (hrajete-li na typy, tak použijete implementaci rozhraní) a instanci této implementace předat.

    I kdybyste z nějakého důvodu trval na svém řešení v podobě kontejneru tak nastavovat logger způsobem: Logger::setLogger( new Logger_Admin() ); je špatné, protože existuje okamžik, kdy je logger nejen v nepožadovaném, ale dokonce (pravděpodobně) v nevalidním stavu. Proto se u většiny moderních FW setkáte s doporučením nastavením pomocí konstruktoru. Nastavování pomocí setteru (či jeho ekvivalentu, jako je inject* v Nette) je považováno za úlitbu legaci kódu, nebo legaci vývojářům.