Hogyan válasszuk ki, hogy egy MVVM alkalmazásban ne használjunk keretrendszert (Caliburn.Micro stb.)?

Egyszer elindítottam egy MVVM / WPF projektet, amelyet végül felépítettek és telepítettek, és ehhez sokat tanulmányoztam a Caliburn.Micro MVVM Framework-ben. A helyzet az, hogy végül nem használtam a Caliburn.Micro-t, és végül magam hajtottam végre néhány MVVM-koncepciót (konkrétan csak a ViewModelBase és a RoutedCommand osztályok).

Most egy kissé nagyobb projektet kaptam, ugyanazon a vonalon: a ” Egyfelhasználós Rich Client Offline asztali alkalmazás “, mondhatni, és úgy döntöttem, hogy a Caliburn.Micro fájlt használom. És itt kezdődik a ” problémám “.

Olvastam a ez a híres blogbejegyzés , amelynek címe szerint ” Ha MVVM-et használ, akkor kell egy keretrendszer “, amely:

” Az MVVM-hez hasonló keretrendszer nélküli próbálkozás hatalmas munka. Rengeteg duplikált kód, a kerék újrafeltalálása és az emberek átképzése másképp gondolkodni .

Legalábbis egy keretrendszer, amely elkerüli a duplikált kódot, és remélhetőleg nem kell újból feltalálnia a kereket – így az emberek átképzésére koncentrálhat. Az átképzési rész általában elkerülhetetlen, de a keretrendszer vízvezeték kódot és szerkezetet biztosít, megkönnyítve ezzel a folyamatot.

Egyetértek az első olvasattal, de tényleges tapasztalataimat a Caliburn.Micro (CM) a tényleges alkalmazásomban a tanácstalanság és a dezorientáció áll. Vagyis a keretrendszer egyáltalán nem tette könnyebbé a folyamatot, éppen ellenkezőleg. Olvassa el Rob Eisenberg folytonosan ismétlődő példáit a meglehetősen (is) informális dokumentációban, és próbáljon következtetni a használati mintákra az összevissza nyújtott mintákból, és teljesen közvetett osztály- és interfészviszonyaik, ahol úgy tűnik, hogy a dolgokat úgy tervezték, hogy a mellékhatásokon alapuljanak mire gondolok).

Arról nem is beszélve, hogy bármelyik fölöttébb triviális forgatókönyv úgy tűnik, hogy IoC-tárolókat tartalmaz, amivel soha nem dolgoztam, és amelyek úgy tűnik megold egy olyan problémát, amellyel esetleg nem is rendelkezem . Nincs kedvem több projektórát eltölteni a dolgok megtanulásával, ahelyett, hogy a problémámra és az alkalmazási területekre gondolnék. Csak egy banánt akartam, de a CM adott nekem egy gorillát (IoC), amelyben egy kosár banán volt.

Most, hogy fontolóra veszem, hogy visszaköltöznék az otthoni MVVM keretrendszerembe – amely csak maroknyi MVVM-ből áll – meghatározott osztályok, amelyeket ténylegesen meg akarok valósítani – szeretnék legalább esélyt adni a CM-nek, hátha itt elveszítek valamit, vagy egyszerűen csak rosszul csinálok dolgokat ” ” puszta tapasztalatlanságból és tudatlanságból. Ezért a kérdés a következő:

Széles körű egyetértés van abban, hogy a ” keretrendszerek megkönnyítik és természetesebbé teszik a dolgokat “, de ha véletlenül épp az ellenkezőjét tapasztalom, ez azt jelenti, hogy nem szabad használni a keretrendszert, vagy rosszul próbálom megtanulni? nyom, hogy eleve nem is kellene keretet használnom? Vagy van valami ” jobb ” módszer arra, hogy kitaláljuk, hogyan használjuk a CM-t az egyszerű MVVM-fejlesztéshez?

Megjegyzések

  • Személy szerint az egyes keretek közül elemeket választok, és használok az adott viselkedéshez, a többit pedig figyelmen kívül hagyom. Szeretem például használni a Microsoft PRISM ‘ s EventAggregator üzenetküldéshez, és NotificationObject a ViewModelBase és az MVVM Light ‘ s RelayCommand parancsokhoz. A legfontosabb annak meghatározása, hogy a keretrendszer milyen problémákat fog megoldani az Ön számára, és csak ezeket a megoldásokat használja. Ne ‘ ne érezze úgy, hogy ‘ kénytelen lenne használni a teljes kerettárat.
  • @Rachel terveztem hogy ezt a megközelítést használja a Caliburn.Micro-val, de nem sikerült ‘ nem találni egy RelayCommand megvalósítást (mivel ” a (z) ” szöveget közvetlenül egyezményekhez köti, ahelyett, hogy az ICommand tulajdonságaihoz kötődne).
  • I ‘ soha nem használtam a Caliburn keretrendszert, mert nem tetszett ‘ nem tetszett, milyen szorosnak tűnik a Nézetek összekapcsolása a Model / ViewModel réteggel.A te esetedben nem látok okot arra, hogy miért nem használhat ‘ RelayCommand egy másik könyvtárból, ha a Caliburn Micro által használt könyvtár nem működik az Ön számára.
  • @Rachel a ” tekintetében, hogy a [caliburn] milyen szorosan köti a nézetet a MVM réteg “, pontosan mire gondolsz? Mi lenne a ” nem kaliburn ” módja annak, hogy ezeket a rétegeket jobb, több MVVM módon kösse össze? (Őszintén kérdezem, mert jelenleg nem tudom, hogy ‘ nem tudom).
  • Őszintén szólva még soha nem használtam Caliburn Micro-t , ezért úgy érzem, hogy rosszul ítélem meg a keretet. Emlékszem, hogy az a benyomásom támadt, hogy először a Nézetet hozták létre, és ő volt a felelős a kód mögötti objektumok eldöntéséért, ami az egyik szempont, ami nem tetszett, mivel nem szeretem a

-t, mint a View-First fejlődés. A másik az automagikus összerendelés volt, amely az XAML-összetevők megnevezésére támaszkodott, mivel úgy gondoltam, hogy ez túlságosan lekötötte a felhasználói felületet az üzleti rétegre. Pedig jó dolgokat hallottam a keretrendszerről, és csak véleményem alapján nem javasolnám annak elkerülését. Próbáld ki magad, és nézd meg, tetszik-e 🙂

Válasz

Kipróbáltam a CaliburnMicro és az MVVMLight programokat és amikor a Caliburn-t használom, valóban érzem azt, amit érzel, és biztosan varázslatosnak tűnik, hogy a Name = ” PropertyName ” a régi Text = ” {Bind PropertyName} ” helyett, de végül Caliburn túlzásba esik, hogy ezt a varázslatos dolgot elvégezze . Ha valami elromlik, akkor nagyon nehéz hibakeresést végezni, és még rosszabbá tenni a helyzetet, nagyon sok módjuk van egy dolog elvégzésére.

Ezzel szemben az MVVMLight nagyon vékony. Amikor használja, akkor valószínűleg rájön, hogy majdnem 100% -osan hasonlít az MVVM Framework-hez, és van benne néhány funkció.

Tudom, hogy ez nem “válaszol a kérdésére ” Hogyan NEM használható a keretrendszer “, de őszintén szólva nem tudom javasolni, hogy haladjon ezen az úton. Azt hiszem, csak azért veszettél el, mert egy teljes funkcionalitású keretrendszert használtál, ahelyett, hogy először egy egyszerűt használtál volna.

Megjegyzések

  • Akkor szerinted hogy legalább meg kell próbálnom használni az MVVMLight-ot a ” gyógyítás ” egyik sorosaként a ” Caliburn.Mikro dezorientáció “? Biztosan megnézném, ha ez a helyzet.
  • @heltonbiker Határozottan, engedje meg. Sokkal egyszerűbb, ha legalább jó alapot ad az MVVM Framework-hez.
  • Egyetértek azzal, hogy túl sok varázslat folyik. Feltételezem, hogy c és szerelési háttérből származik. E valami nem fog működni ‘ csak azért, hogy megtalálja a háttérben lévő varázslat miatt. Lehetetlen hibakeresés, és amikor teljesítményproblémái vannak, gyakran nem sokat tehet róla.

Válasz

Fontos felismerni, hogy mi az MVVM. Ez nem egy megosztott funkcionalitás, amelyet nem kell újratelepíteni (JPEG fájl elemzése vagy csatlakozás egy adott SQL adatbázis-kiszolgálóhoz), hanem egy minta – egy minta arra, hogy miként választhat gazdag GUI megvalósításához. Tehát, ha a minta megvalósítása egyszerű és egyértelmű, nem hiszem, hogy szégyent kellene éreznie a keretrendszer helyett.

Valójában úgy gondolom, hogy a minták mint keretek teljes ötlete túl messzire ment. Ahhoz, hogy bármi minta legyen, a megoldások osztályának általános alakjának kell lennie. Mivel ez így van, várható, hogy a mintákat az őket használó rendszerekhez kell igazítani, és ezt nem teheti meg, ha megpróbál egy mindenki számára megfelelő mintát használni. Sokkal konstruktívabb lenne, ha a minta megvalósítását az alkalmazás tervezőjére bíznák, és az architektúra helyett a funkcionalitást befogadó könyvtárakat biztosítanának.

Megjegyzések

  • Hozzáadva hogy a Microsoft által kínált MVVM (dobozon kívül, WPF) nagyon hiányzik. Nagyon frusztráló azoknak a programozóknak is, akik tapasztalt fejlesztőként gondolják magukat (és helyesen). Varázslatos húrok, homályos kivételek a futás közben, a legalapvetőbb dolgok, például egy rádiógombok csoportjának az enumhoz való kötése úgy néz ki, mint stackoverflow.com/q/397556/168719 képesek-e a keretek? Vagy vissza kell adniuk ezt a bonyolultsági szintet, vagy meg kell próbálniuk egy igazán vastag absztrakciót biztosítani
  • @KonradMorawski A WPF önmagában nem MVVM; kódot tehet a WPF segítségével, de ez ‘ nem MVVM. Tehát, ha WPF-et és MVVM-et szeretne csinálni, akkor ‘ használnia kell egy MVVM keretrendszert, vagy saját maga kell megvalósítania.
  • Természetesen @Andy, de ‘ nyugodtan kijelenthetjük, hogy a WPF az MMVM számára készült.

m utalok a WPF-be beépített MVVM-funkcionalitásra. Tudom, hogy továbbra is megteheti a kódot

  • @KonradMorawski Használhatja a WPF-et az MVVM-mel, és ezt a lehetőséget szem előtt tartva hozták létre, de a WPF-be nincs beépítve MVVM-specifikus funkció. Csakúgy, mint az MVP-t a WinForms-szal, de a WinForms sem kínál semmit kifejezetten ennek a mintának a használatára, csak rajtad múlik.
  • @Andy talán ‘ vitatkozunk meghatározások most. Arra gondolok, hogy az összes ” ragasztó “, amely lehetővé teszi az MVVM-et, már megvan – adatkötések az XAML-ben, DataContext stb.
  • Válasz

    A WPF-el kapcsolatos első tapasztalatom a Caliburn használata volt. Micro, így ez valószínűleg meglehetősen eltér a legtöbb fejlesztőtől. Mind a WPF-et, mind a Caliburn.Micro-t meglehetősen meredek tanulási görbének találtam, amely a WinForms-ból származik, azonban mindkettővel szerzett tapasztalataim után azt tapasztaltam, hogy örömmel használom őket párként. Jelenleg egy másik szervezetben dolgozom, ahol a Caliburn.Micro nincs használatban. Megállapítom, hogy SOK duplikált vízvezeték-kód létezik, ami a kódbázist meglehetősen duzzadtá és szükségtelenül bonyolulttá teszi. a Caliburn.Micro-val, ami bonyolíthatja a hibakeresést, azonban miután egyszer megtapasztalták, sokkal kevésbé valószínű, hogy újra fájdalmat okoz. A megnövekedett fejlesztési sebesség, a tisztább és karcsúbb kód, valamint a jobb MVVM-t ösztönző általános keret több mint megéri nekem.

    A Caliburn.Micro szintén nem érvényteleníti a részvény WPF-t – csak a tetejére épít, ami azt jelenti, hogy továbbra is használhatja a WPF funkcióit, ha úgy tetszik, és a Caliburn-t néhány darabra, ha úgy tetszik. Ez hasonlít arra, ahogyan a TypeScript és a JavaScript együtt élnek a fejemben.

    A Caliburn.Micro-t minden bizonnyal minden új WPF-projektben használnám, amelyen a jövőben dolgozom, ha alkalom nyílik rá.

    Megjegyzések

    • Köszönjük válaszát. Két évvel később sokkal könnyebben ” elfogadtam ezeket a kereteket, miután megértettem a Függőségi Injekciós Konténerek fogalmát, amelyet a kiváló Mark Seeman ‘ s ” DI a .NET ” könyvben.

    Válasz

    Bárki, aki a Caliburn.Micro csalódottsága miatt érkezik ide, nézze meg ezt a keretrendszert: Stylet

    A Caliburn.Micro ihlette, azzal a különbséggel, hogy eltávolítja azt a varázslatot, amely elzárkózik attól, ami történik. Ezenkívül a dokumentációt egyszerűbb nyelven írják, anélkül, hogy feltételeznénk, hogy át akarsz lépni a szakzsargonban. Sokkal jobb kezdőknek.

    A Stylet szintén ViewModel-First megközelítést alkalmaz. Caliburn.Micro és sok más keretrendszer a View-First megközelítést alkalmazza, ami kínos problémákkal jár. Ha már nagyon ért a SOLID elvekhez és a mintás kódhoz, akkor valószínűleg természetesebbnek találja a ViewModel-First megközelítést, mivel abból a szempontból veszi figyelembe, hogy a logikának kell vezérelnie a rendszert – nem a nézetnek.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük