Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Diskuse ke článku o Dependency Injection

Pod článkem Dependency Injection není žádná věda se vyrojilo několik komentářů, které neměly dle mého přínos k diskusi, ale spíš byly zdrojem nepochopení a špičkování se. Aby neubližovaly samotnému článku určenému pro začátečníky, přenesl jsem je pod tento spot.

Komentáře

  1. Jan Tichý http://www.medio.cz #1

    avatar

    Ahoj Davide, asi budu zase za kverulanta…

    Samotné dependency injection jako takové je tu pěkně ukázané. Zároveň si ale myslím, že ukázka s článkem není úplně nejčistší. Z mnoha důvodů si myslím, že je špatně injectovat persistenční vrstvu (Connection) do entity (Article):

    • Zvyšuje to zbytečně komplexitu aplikace, není žádný důvod, aby byla Article závislá na Connection.
    • Co když budu chtít článek uložit opravdu na disk, jak v článku sám píšeš, a ne do databáze? Definuju si vlastní connection, které bude emulovat příkazy table a insert?
    • Co když budu chtít s jedním Article pracovat nad více různými uložišti? Nemám žádnou šanci toho dosáhnout.
    • Co když budu chtít pracovat s článkem, ale nebudu při tom potřebovat vůbec žádnou persistenci? Nejde, musím mu tam nějaký connection instancovat a podvrhnout, i když ho vůbec nepotřebuju a nevyužiju.

    Prostě zvolený příklad považuji za dost nešťastný, protože sice ukazuje principy DI, ale zároveň IMHO učí nováčky bad practice. Mnohem hezčí mi přijde Vrtákovo příklad s mobilem a zejména ukázky ve skvělém Vaškově seriálu na zdrojáku

    před 5 lety | reagoval [2] David Grudl
  2. David Grudl http://davidgrudl.com #2

    avatar

    #1 Jane Tichý, tolik článků existuje a stejně na každém školení zjišťuju, že lidi DI nerozumí a hledají neexistující složitosti. Přitom úvodní příklad s $article->save() je každému jasný. Osvědčilo se mi vycházet z jasného a postupně kód refaktorovat.

    Pokud bych přidal dalších několik vrstev nebo věc demonstroval na zcela abstraktních věcech, zabil bych to.

    Snažím se prodat jedinou myšlenku, a sice, že každá třída se ke svým závislostem otevřeně hlásí v inicializačních metodách. Rozhodně nehledám nejčistší implementaci entit a persistenční vrsty, protože to s DI nesouvisí a nechci dělat dojem na experty, nýbrž se pokouším mluvit jazykem DI nováčků.

    před 5 lety | reagoval [3] Jan Tichý
  3. Jan Tichý http://www.medio.cz #3

    avatar

    #2 Davide Grudle, OK, je to Tvoje volba. Jsem přesvědčený, že stejně jednoduše a pochopitelně se to dá ukázat i na jiném příkladu, aniž bych zároveň ve jménu dobré věci učil začátečníky chybné postupy.

    před 5 lety | reagoval [4] David Grudl [9] Václav Dedík
  4. David Grudl http://davidgrudl.com #4

    avatar

    #3 Jane Tichý, článků o DI není nikdy dost, bude super, pokud tento vylepšíš a vydáš.

    ps. doplnil jsem tam větu, že další vhodný refaktoring je nad rámec článku.

    před 5 lety
  5. Jakub Tesárek #5

    avatar

    Mluvím ze své zkušenosti když tvrdím, že programátoři tam hledají zbytečné složitosti protože existuje velmi málo dostatečně náročných ale přitom správných příkladů. Všechno je to buď ve stylu „potřebuju tam cache, tak si ji tam strčim“ nebo autor dělá zbytečné zmatky (viz například poslední pražská poslední sobota a přednáška o DI která se zvrhla v přednášku o service lokátoru /nic proti klukům co to přednášeli/).

    A když se podívám na tenhle článek, je to přesně ten příklad zmatkářství. Cituji „Metoda save() nám článek uloží. Kam? Asi do databázové tabulky. Skutečně? Co když ho uloží do souboru na disk? “

    Automaticky jsem tedy čekal, že se dozvím, jak to udělat abych teda mohl změnit persistenční vrstvu a že to bude z článku zřejmé. Nakonec se ale dovídám, že mám někam strkat Nette\Database\Connection. Kdyby mi DI nebylo jasný, začal bych dumat, jak to teda udělám, aby se mi to ukládalo na disk. Očekával bych, že to bude z článku jasný a já to jen nechápu. No, a tak začnu vymýšlet složitosti.

    Jinak ale můj článek by byl 100× horší – to jen na okraj. Rozhodně ho neshazuju, jen postřeh člověka, co si tím nedávno prošel.

    před 5 lety | reagoval [6] David Grudl
  6. David Grudl http://davidgrudl.com #6

    avatar

    #5 Jakube Tesárku, Jakube, nejspíš máte s Honzou problém pochopit psaný text (sorry…). Pokud z otázky „nevím, kam se článek ukládá?“ vyjadřující skutečnost, že z původního API nelze vůbec nic odvodit, si dedukujete očekávání, že budu chtít článek uložit na disk, tak jsme se prostě asi minuli.

    před 5 lety | reagoval [7] Jan Tichý
  7. Jan Tichý http://www.medio.cz #7

    avatar

    #6 Davide Grudle, A tohle je zase která figura ze skupiny argumentum ad hominem? :)

    před 5 lety
  8. Jakub Tesárek #8

    avatar

    Ok, potřebuju se vyspat. Jen jsem ti chtěl nastínit, jak přemýšlí člověk, který s DI začíná nebo mu neni jasný. Nehodlám se přít o článku, který jsem si konec konců přečetl jen proto, že jsem čekal na tvůj komentář u jiného článku.

    před 5 lety
  9. Václav Dedík #9

    avatar

    #3 Jane Tichý,
    Souhlasim.
    Oduvodneni jako „pro zacatecniky to bude jednodussi pochopit“ vubec neberu. Vysvetlovat nejakou konstrukci na chybnem prikladu je fail at je oduvodneni jakekoli.

    A k čemu je to dobré? Díky tomu se kód snáze programuje a lépe chápe.

    To neni pravda. Snizeni zavislosti komponent slouzi k jejich znovupouzitelnosti a lepsi testovatelnosti.

    před 5 lety | reagoval [10] David Grudl
  10. David Grudl http://davidgrudl.com #10

    avatar

    #9 Václave Dedíku, tady žádný chybný příklad není. Nelze se vůbec bavit o správném a špatném návrhu, pokud není jasné, co je cílem toho návrhu (stejně jako případ metody resize u obrázku). Takže zatímco Article ukládající se do databáze je výborné řešení všude, kde je výborné řešení Active Record (léta na tom stály celé Rails), je to zároveň mizerné řešení všude, kde mi jde o víc než mapování na databázovou tabulku.

    V případě tohoto článku šlo o Dependency Injection.

    před 5 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.