Na navigaci | Klávesové zkratky

Komentáře

  1. Jan Tichý #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 12 lety | reagoval [2] David Grudl
  2. David Grudl #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 12 lety | reagoval [3] Jan Tichý
  3. Jan Tichý #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 12 lety | reagoval [4] David Grudl [9] Václav Dedík
  4. David Grudl #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 12 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 12 lety | reagoval [6] David Grudl
  6. David Grudl #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 12 lety | reagoval [7] Jan Tichý
  7. Jan Tichý #7

    avatar

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

    před 12 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 12 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 12 lety | reagoval [10] David Grudl
  10. David Grudl #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 12 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.