Avatar
johny
Neregistrovaný
Avatar
johny:

Dobrý den, potřeboval bych poradit s aplikací. Mám (Visual Studio) solution Aplikace, v ní dva projekty - Jádro a UI, v budoucnu přidám GUI. Snažím se během psaní oddělit UI od jádra, ale nevím, jestli to dělám správně. Je postup, že UI nástavba využívá metody tříd a vnořených tříd Jádra (např. Jadro.PoleCisel­.VypisSerazene()) správný? Jádro je statická třída. Nebo by bylo správnější to psát jinak? Díky za radu.

 
Odpovědět 5.11.2012 19:26
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na johny
Drahomír Hanák:

Přesně tenhle problém řeší MVC (Model View Controller). Je to architektura kódu, která ti rozdělí aplikaci do třech vrstev (Model - business logika, View - UI atd., Controller - obsluhuje různé události, je to takový prostředník mezi View a modelem). Víc najdeš v tomhle článku: http://www.itnetwork.cz/…avrhovy-vzor Co se C# týče, tak na tohle se celkem hodí WPF, které je implementováno jako MVVM, což je (jednodušší) odvozenina od MVC. Rozděluje ti View (XAML - UI aplikace) od obsluhování jednotlivých komponent a logiky ve tvé aplikaci.

Btw. statika je celkem zlo, když nevíš, kde a jak ji implementovat.

Editováno 5.11.2012 20:28
 
Nahoru Odpovědět 5.11.2012 20:25
Avatar
Doupak
Člen
Avatar
Odpovídá na johny
Doupak:

Souhlasím s Drahosem, jadro urcite udelej jako klasickou tridu.

 
Nahoru Odpovědět 5.11.2012 20:57
Avatar
johny
Neregistrovaný
Avatar
Odpovídá na Drahomír Hanák
johny:

Supr, to je přesně ono, díky. A s tou statikou - jádro aplikace jako takové si myslím statiku "zaslouží". Jednak bude vždy jen jedno, takže vytvářet instanci mi přišlo míň logické, než jej mít staticky. Ale hlubší význam to momentálně nemá. Ve chvíli kdy přístup z toho, že při implementaci UI používám hloubkově metody jádra, změním na model, kdy UI bude zasílat "jednoduché" zprávy jádru přes controller a nebude šahat do jádra, tak je statická třída, dle mého, vhodná a neškodná.

 
Nahoru Odpovědět 5.11.2012 21:12
Avatar
Kit
Redaktor
Avatar
Odpovídá na johny
Kit:

Používání statických tříd mi vždy smrdí Singletonem, což je antipattern, který by se neměl používat.

Nahoru Odpovědět 5.11.2012 21:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na johny
Drahomír Hanák:

Nepřijde mi to jako vhodné řešení. Na takové předávání závislostí se používá Dependency Injection http://www.itnetwork.cz/…avrhovy-vzor Nemusíš pak řešit, odkud si tu závislost předáš, o to se postará někdo jiný. Když pak potřebuješ tu instanci vytvořit jinak (případně použít jinou instanci, jinou implementaci rozhraní), změníš to jen v DI kontejneru a změna se projeví všude v aplikaci, což u statického přístupu může být problém. Nehledě na to, že statika (v tomhle případě) nemá daleko od globálních proměnných a funkcí. Jsou jen zasazeny do nějakého kontextu.

 
Nahoru Odpovědět 5.11.2012 21:21
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na johny
David Čápka:

Také zastávám názor, že statika v rozumné míře neškodí a když to má někde smysl, nebojím se ji použít. Tu systémovou třídu máme zde na devbooku napsanou podobně. Pokud začínáš s MVC, je to naprosto v pořádku. Nicméně pokud chceš být profík, tak se řiď radami Drahomír Hanáke, DI je určitě mnohem elegantnější řešení.

Nahoru Odpovědět 6.11.2012 12:47
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na David Čápka
Drahomír Hanák:

Statika je někdy dost užitečná. Používám ji na statické Utility, které mi shrnují práci s nějakými hodnotami (např. řetězci v kódování UTF-8), na Simple Factory methods a další. Se statikou pracuje celkem dost idiomů a návrhových vzorů. Pro menší projekty se dá určitě použít systémová třída, ale na větších projekty a projekty, které se mohou časem rozrůstat (což je mimochodem většina aplikací, protože klient většinou neví, co chce) se moc nehodí.

 
Nahoru Odpovědět 6.11.2012 13:09
Avatar
johny
Neregistrovaný
Avatar
johny:

Vzhledem k tomu, že MVC a DI jsou pro mě nyní relativně nové pojmy, tak se samozřejmě na začátku budu řídit radami. Tu statiku ještě důkladně zvážím, každopádně za ostatní rady velké díky.

 
Nahoru Odpovědět 6.11.2012 17:39
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na johny
David Čápka:

Si udělej nejdříve MVC se statikou a potom DI, ať se neučíš 2 věci najednou :) Je jen důležité, abys věděl, že to není stoprocentní řešení a že to někdy ještě vylepšíš.

Nahoru Odpovědět 6.11.2012 18:08
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Osobně jsem spíš pro to, aby nejprve zkusil DI, protože to použije skutečně všude. Vyhne se tak potřebě statických tříd, které silně svádí k tomu, aby se používaly jako náhražky globálních proměnných. Také tím zruší potřebu některých antipatternů, jako např. Singletonu.

MVC se na všechno nehodí a navíc je spousta různých názorů, jak má MVC vypadat.

Nahoru Odpovědět 6.11.2012 21:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Kit
Drahomír Hanák:

To je pravda :) Dva vývojáři, kteří vyvíjí různé MVC aplikace v různých jazycích mohou mít na něco rozdílné názory. U těch podstatnějších věcí je dobré se řídit někým nezávislým (např. Martin Fowler http://martinfowler.com/) Podle mě by se to mělo brát trošku s nadsázkou. Moc o tom nediskutovat a hlavně nelpět na detailech, protože to přináší zmatek, a začátečníkům by to mohlo dělat celkem potíže. Samozřejmě, jak jsi říkal, MVC se nemusí vždy vyplatit. Nicméně pokud chce dělat nějakou desktopovou aplikaci, bylo by dobré ho použít.

Jinak k tomu singletonu - může být i bez statiky. Třeba v DI kontejneru singleton celkem připomínají servisy, které mají taky jen jednu instanci pro celou aplikaci (pokud se správně dodržuje DI).

Editováno 6.11.2012 21:35
 
Nahoru Odpovědět 6.11.2012 21:32
Avatar
Kit
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Kit:

Přesně takovou náhradu Singletonu jsem měl na mysli. Navíc se tím elegantně vyřeší působnost např. přihlašovacích údajů k databázi. Není nutné je mít jako globální konstanty přes celou aplikaci.

Jen je dobré to spojit s línou inicializací, protože databáze (nebo jiná instance čehokoli, třeba modelu) nemusí být vždy potřebná.

Nahoru Odpovědět  +1 6.11.2012 21:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.