Návrhový vzor MVVM

jpu

Návrhový vzor MVVM
« kdy: 10. 01. 2018, 10:58:44 »
Verim, ze viaceri poznaju tento vzor. Chcel by som si len ujasnit nejake veci, resp. skor vypocut nazor. Ked je model, ktory obsahuje data (properties), tak vo ViewModely vytvorite kopiu tychto properties, ktore su nabindovane na View, alebo bindujete priamo na properties v Modely? To by znamenalo implementaciu INotifyPropertyChanged v modely. INotifyPropertyChanged je UI agnostic, ale na druhu stranu by sa tym porusila myslienka MVVM, ze View nevidi na Model. Cistejsi sposob by bolo vytvorit v podstate kopiu modelovych properties vo ViewModely, tym sa ale dostaneme k DRY. To je jedna vec, ktora by ma zaujimala.
Druha vec je, ako riesite nejaku business/service vrstvu? Ja to riesim tak, ze mam ViewModel---Service/BusinessLayer---Model. Do ViewModelu je cez konstruktor pomocou DI vlozeny konkretny servis s ktorym dany VM pracuje a VM obsahuje uz len logiku tykajucu sa zobrazenia dat na View.
« Poslední změna: 10. 01. 2018, 11:00:56 od Petr Krčmář »


jpu

Re:Návrhový vzor MVVM
« Odpověď #1 kdy: 10. 01. 2018, 21:49:29 »
Hm som si myslel, ze sa niekto podeli o nazor, nakolko sa nachadzam na fore vsade som bol, vsetko viem.

gll

Re:Návrhový vzor MVVM
« Odpověď #2 kdy: 10. 01. 2018, 22:03:25 »
Hm som si myslel, ze sa niekto podeli o nazor, nakolko sa nachadzam na fore vsade som bol, vsetko viem.

zkus se příště zeptat na microsoftím foru.

shojian

Re:Návrhový vzor MVVM
« Odpověď #3 kdy: 10. 01. 2018, 22:16:45 »
Hm som si myslel, ze sa niekto podeli o nazor, nakolko sa nachadzam na fore vsade som bol, vsetko viem.

Muzu te poprosit o zlepseni tvych pisemnych soft skills? Na twitteru maji nekteri z nas problem cist 280 znakovy blok textu, tak se nezlob, ze ti to nikdo nechce cist tady.

Re:Návrhový vzor MVVM
« Odpověď #4 kdy: 10. 01. 2018, 22:32:54 »
Verim, ze viaceri poznaju tento vzor. Chcel by som si len ujasnit nejake veci, resp. skor vypocut nazor. Ked je model, ktory obsahuje data (properties), tak vo ViewModely vytvorite kopiu tychto properties, ktore su nabindovane na View, alebo bindujete priamo na properties v Modely? To by znamenalo implementaciu INotifyPropertyChanged v modely. INotifyPropertyChanged je UI agnostic, ale na druhu stranu by sa tym porusila myslienka MVVM, ze View nevidi na Model. Cistejsi sposob by bolo vytvorit v podstate kopiu modelovych properties vo ViewModely, tym sa ale dostaneme k DRY. To je jedna vec, ktora by ma zaujimala.

Já chápu účel ViewModelu právě v tom, že odstíní View od Modelu a opačně, takže Model by neměl obsahovat nic navíc kvůli View. Ta „kopie“ properties Modelu ve ViewModelu je správně. Kdyby to byla jen čistá kopie, samozřejmě by to nebylo k ničemu dobré – ale ViewModel se přidává právě proto, že to není čistá kopie, přidáváte tam vlastnosti specifické pro View (třeba bufferování, UI validace, workflow UI). Pokud by vám ViewModel vyšel jako kopie Modelu, nepoužívejte MVVM ale obyčejné Model-View-něco.

Druha vec je, ako riesite nejaku business/service vrstvu? Ja to riesim tak, ze mam ViewModel---Service/BusinessLayer---Model. Do ViewModelu je cez konstruktor pomocou DI vlozeny konkretny servis s ktorym dany VM pracuje a VM obsahuje uz len logiku tykajucu sa zobrazenia dat na View.
Byznys vrstva má na jedné straně datové úložiště a na druhé straně Model. Takže ty vztahy by byly asi View---ViewModel---Model---Service/BusinessLayer---Repository---Database.

Ale píšu o tom obecně jako o vzoru MVVM, je možné, že nějaký framework to má navržené jinak.


jpu

Re:Návrhový vzor MVVM
« Odpověď #5 kdy: 10. 01. 2018, 23:00:50 »
Hm som si myslel, ze sa niekto podeli o nazor, nakolko sa nachadzam na fore vsade som bol, vsetko viem.

zkus se příště zeptat na microsoftím foru.
Odkedy sa da mvvm aplikovat len na ms technologie?

koalix

Re:Návrhový vzor MVVM
« Odpověď #6 kdy: 11. 01. 2018, 08:12:46 »
Několik let jsem ve WPF programoval. Mým názor je, že MVVM je MVC svázané s MS technologií. Model jsou data. View pouze reprezentace (proto lze psát deklarativně v XAML) bez jakéhokoliv code behind, který se kompletně odehrává ve ViewModelu a vše spojuje přes data binding.

Re:Návrhový vzor MVVM
« Odpověď #7 kdy: 11. 01. 2018, 09:01:20 »
Mým názor je, že MVVM je MVC svázané s MS technologií.
Nikoli, MVVM a MVC jsou dva různé ale příbuzné návrhové vzory. S MS technologií to svázané není. Pouze framework Microsoftu je postavený zrovna nad MVVM.

Matheo

Re:Návrhový vzor MVVM
« Odpověď #8 kdy: 12. 01. 2018, 15:54:13 »
Tím tohle vlákno přece neskončí, že ne? Odpovědi na dotazy, které tady zazněly, by mě osobně taky zajímaly. Bohužel uvažuji stejně jako 'jpu' a ani jeden způsob provedení se mi nezdá správný. Pozorovat změnu v datech z VM nemůže být jediný správný přístup stejně jako všechny property duplikovat ve VM a datech. Nebo je něco z toho běžná praxe, protože to prostě líp nejde? Jak potom postupovat u větších projektů?

jpu

Re:Návrhový vzor MVVM
« Odpověď #9 kdy: 12. 01. 2018, 16:13:41 »
tiez som cakal vacsiu diskusiu, viac nazorov. Ale zrejme, ked sa tema nevenuje lopatam, VS, pracovnym navykom, tak je to pre miestny plebs nezaujimave.

gll

Re:Návrhový vzor MVVM
« Odpověď #10 kdy: 12. 01. 2018, 16:39:24 »
tiez som cakal vacsiu diskusiu, viac nazorov. Ale zrejme, ked sa tema nevenuje lopatam, VS, pracovnym navykom, tak je to pre miestny plebs nezaujimave.

Protože jsi uvedl příklad z nějakého MS frameworku, se kterým na linuxovém serveru logicky nemá moc lidí zkušenosti.

pilifs

Re:Návrhový vzor MVVM
« Odpověď #11 kdy: 12. 01. 2018, 17:41:35 »
Zdravím,
ve zkratce to u nás řešíme takto:
1. DTO objekty jsou naplněné daty z databáze
2. tyto DTO objekty probublají přes reozitáře, logiku, webapi,... až do ViewModelu
3. samotný ViewModel je předhodí do View - přímo ta DTO, ViewModel tedy pracuje nad DTO
4. pokud je potřeba aby DTO v rámci bindingu měli "INotifyPropertyChanged", tak uděláme:
  a) buď kopii, která implementuje toto rozhraní a případně přidáva nějaké dodatečné property
  b) anebo využijeme techniku "Dynamic proxy", kdy DTO do ní "zabalíme" a ona zajistí příslušné notifikace

jpu

Re:Návrhový vzor MVVM
« Odpověď #12 kdy: 12. 01. 2018, 18:47:53 »
tiez som cakal vacsiu diskusiu, viac nazorov. Ale zrejme, ked sa tema nevenuje lopatam, VS, pracovnym navykom, tak je to pre miestny plebs nezaujimave.

Protože jsi uvedl příklad z nějakého MS frameworku, se kterým na linuxovém serveru logicky nemá moc lidí zkušenosti.
Tak ja mam dojem, ze tu su odbornici na pravo, psychologiu, ekonomiu, medicinu, tak preco nepoznat MVVM? Apropo, vychadza sa z MVC, takze nie je to uzko spojene s MS. A predpokladam, ze tu chodia aj C#/.NET vyvojari.

Tomáš Roll

Re:Návrhový vzor MVVM
« Odpověď #13 kdy: 12. 01. 2018, 19:22:39 »
Na wug.cz je spousta videi na toto tema.

polygon

Re:Návrhový vzor MVVM
« Odpověď #14 kdy: 13. 01. 2018, 10:47:13 »
Dotazy tohoto typu jen ukazují jak je MVVM ve WPF blbě vymyšlené. Když máte něco jiného než zcela triviální formulář, tak skončíte nevyhnutelně s:
1. kódem v xaml. Xaml měl obsahovat definice zobrazení (tj. strukturu jako html) a binding. Jenže místo toho se stal komplikovaným deklarativním programem. To v tom lepším případě. V horším případě programátor neví jak něco zapsat a část chování je v code behind.
2. kódem ve VM. VM tu je od toho aby oddělil definici dat pro db, externí systém, atp. od dat pro zobrazení. Místo toho je zde kód pro notifikaci, validaci, datové konverze, někdy i načítání z databáze, ...
3. Kódem v code behind. Ten měl přestat existovat, ale protože některé věci by bylo natolik komplikované nebo přímo nemožné zapsat v xaml a do VM se nehodily tak veškerý kód co se tam už nevešel je zde. Napojení na data, event handlery pro které se vám nechtělo aplikovat ten idiotsky komplikovaný deklarativní postup, atd.

Takže celý ten paskvil pak spíše připomíná MVC, kde ani jedna část M, V a C neplní tak docela svou funkci. Upřímně lituju každého, kdo s tím musí pracovat.