Proč vlastně používat container?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Donkeykong
Člen | 39
+
0
-

Ahoj,

omlouvam se za pravděpodobně stupidní dotaz, ale otázka zní, proč bych měl vlastně v nette používat container a služby a továrničky nějak do hloubky? Nějaký čas se nette učím a v podstatě část services jsem zatím použil pouze v případech kdy jsem si vytvořil nové repository jako: articleRepository: Article\ArticleRepository a podobně. Nicméně v manuálu je často container používany i k tvorbě tříd a podobně. Je to kvůli dependency injection nebo jsem úplně mimo? A v podstatě téměř vše co se pomalu definuje v containeru můžu definovat i přímo například v presenterech a modelech?

Jan Tvrdík
Nette guru | 2595
+
0
-

@Donkeykong: Container je nástroj, která pomáhá s používáním návrhového vzoru Dependency Injection. Nepoužíváš-li DI, tak v podstatě ani nepotřebuješ DI container.

Felix
Nette Core | 1247
+
0
-

Jak rika Honza Tvrdik, pokud nepouzivas DI tak container ani nepotrebujes. Na druhou stranu, nic ti nebrani pouzivat DI bez containeru, to vubec neni podminka.

Donkeykong
Člen | 39
+
0
-

Díky za odpovědi, pochopil jsem tedy správně. :). Časem se k DI snad dopracuju, protože jak jsem pochopil zde z fóra, udržuje to čistší a lépe testovatelný kód.

Šaman
Člen | 2666
+
0
-

Taky to přesouvá vytváření tříd na jedno místo. Pokud si budeš některé služby (profláklý je příklad s databází) vytvářet ručně, může se stát, že je vytvoříš pokaždé maličko jinak. Nebo když budeš chtít vytváření změnit (třeba jim hned něco setnout), tak to někde uděláš a někde na to zapomeneš.
Tohle můžeš řešit buď statickou factory method, nebo tím, že si službu vytvoříš jednou a všem kteří ji potřebují ji předáš.
Osobně bych doporučoval používat container i když nebudeš striktně dodržovat DI. Pak máš prostě v containeru (context) všechno možné a třída si vytáhne (nikoliv vytvoří) co potřebuje. Ideální je to ale dotáhnout do stavu container + DI, kde každá třída dostane co potřebuje.

Souvisí to i s kontrolou nad kódem.
Když si třída vytváří co chce, tak máš nad kódem jako celkem minimální kontrolu.
Když si vytáhne, co potřebuje, tak víš, že služba musí někde existovat, někde ji vytváříš.
Když si jen řekne o to, co potřebuje a někdo jí závislosti předá, tak máš krásně přehled o jejím API – jasné vstupy a jasné výstupy. Dobře se to kreslí, dobře se to testuje, dobře se nahrazuje jedna třída jinou třídou.

Editoval Šaman (13. 7. 2013 15:36)