nette/nette — pull request #643 by VasekPurchart (2012-05-06 18:03:30+00:00)
Title: PresenterDependencies

Ahoj,

PresenterDependencies je koncept, který jsme vymysleli s Davidem jako pravděpodobně nejlepší střední cestu mezi teoretickou čistotou a praktickým využitím v rámci frameworku.

Tahle změna by měla být prvním krokem ke dvěma věcem:
1) Sjednocení závislostí presenteru z hlediska Nette vs uživatel
2) Odstranění používání "contextu" v Presenterech

Diskuze okolo závislostí presenteru probíhala na fóru: http://forum.nette.org/cs/9342-predavani-sluzeb-do-presenteru-pomoci-di . PresenterDependencies výhodou PresenterDependencies jako takových je především dobrá potencionální future-compatibility, protože by měla odstínit uživatele frameworku od všech interních změn závislostí Presenterů. Presentery a jejich podoba je jednou z nejstaršíc částí frameworku, takže jejich refaktoring je momentálně celkem aktuální a potřebný.

Oproti současnému stavu, kdy jsou přes konstruktor předávány (volitelně) uživatelské závislosti a přes setter injektován Context/Container (systémová záležitost). Vidím především v tom, že všechny závislosti budou na jednom místě. To bude jednak mnohem přehlednější a za druhé se to bude daleko lépe testovat (mockovat). Tenhle přístup samozřejmě není úplně čistý, protože nevidíme přímé závislosti Presenteru, nicméně to je daň za lepší future-compatibility a menší otravnost s miliony parametrů, které by jinak měly být explicitně vyjmenovány.

Zároveň odpadne situace, kdy člověk může zavolat jisté metody presenteru už v konstrukoru - např. getUser - a aplikace zhavaruje, protože tuto závislost ještě nikdo nenastavil (ano, vím, v konstuktoru nic nevoláme, ale vysvětlujte toto wtf nováčkům) - tzn. presenter má v tom momentě jen část svých závislostí.

Díky tomuto také zmizela většina použití Contextu v Presenteru. Cílem je, aby tam do budoucna pro účely frameworku nebyl vůbec, ale k jeho odstranění bych přistupoval klasicky postupně - deprecated warning a zrušit teprve až v nějaké větší verzi (2.1?).
Momentálně zbývá používání Contextu ještě v Control - pro vytváření šablon a věcí okolo, které by se teď v dohledné době ale také měly refaktorovat. K tomuto refaktoringu by už ale bylo docela vhodné mít PresenterDependecies, takže trochu začarovaný kruh :).

Současná podoba tedy není definitivní, měly by proběhnout cca ještě tyhle kroky:
1) Zbavit se veškerého používání Context v presenteru ze strany Nette
2) Doplnit deprecated warning do metod jako getContext, getUser, getHttpContext - pokud uživatel tyhle záležitosti potřebuje, měl by si je klasicky vyžádat v konstruktoru - to opět zvýší future-compatibility
3) Výše zmíněné metody změnit na private, set/getContext zrušit úplně