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 NewsletterDistributor, 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.
Přečteno 20 189×
Přečteno 18 062×
Přečteno 17 490×
Přečteno 17 033×
Přečteno 15 693×