czwartek, 16 września 2010

Frustrujący MVVM

Od dawna nosiłem się z zamiarem poznania wzorca MVVM (Model-View-ViewModel), na którym opiera się WPF, jednak im głębiej go poznawałem tym bardziej wydawał mi się on irytujący. Problem z MVVM jest taki, że jest to tylko wzorzec, opisujący jedynie podstawy działania i przedstawiający założenia do ogólnej koncepcji jaką należy przyjąć w projekcie. W teorii wygląda to bardzo ładnie, oddzielenie interfejsu od logiki biznesowej miały pozwolić na rozdzielenie pracy programisty i designera. Zachowujemy porządek w projekcie, nie tworzymy żadnego kodu w tak zwanym Code Behind (to znaczy w plikach *.xaml.cs), który nie wykonuje się podczas edycji w Expression Blend.
Z drugiej strony spełnienie wszystkich wymagań dotyczących wzorca, implementowanie wymaganych składników jest niesłychanie nudne, wtórne i podatne na błędy. Gdy patrzyłem na te dziesiątki linii podobnego do siebie kodu zastanawiałem się, dlaczego tak utrudniono życie programistom? Przecież to niepodobne do twórców .NET Framework'a, do tej pory większość zmian ułatwiała życie i sprawiała, że kodowanie stawało się przyjemniejsze. Poza tym nie istnieją jednoznaczne wytyczne jak należy implementować poszczególne wymagania. Każdy programista udzielający porad w kwestiach MVVM ma swoje zdanie na ten temat, strasznie trudno znaleźć uniwersalne porady, które nie wymagałyby przepisania części naszej aplikacji w celu dostosowania do przykładów.
Dlatego też zacząłem przyglądać się różnym toolkitom (czy może po prostu narzędziom), które ponoć miały ułatwiać pracę z WPF i MVVM, jak sugerowano w tym temacie na StackOverflow. To co znalazłem zaczęło mnie przytłaczać natłokiem informacji koniecznych do przyswojenia przed rozpoczęciem pracy, ogromem możliwości, których pewnie i tak bym nie wykorzystał oraz przykładowymi aplikacjami, które zawierały całą masę funkcjonalności, jednak tak na prawdę nie pokazywały jak zacząć pracę z frameworkiem. Przypatrywałem się między innymi Prismowi, Cinchowi i MVVM Foundation.
Zainteresowałem się także MVVM Light Toolkit mając nadzieję, że nazwa nie jest bezpodstawna. Zacząłem od obejrzenia prezentacji autora z konferencji MIX10, przedstawiającej jego narzędzie. To co zobaczyłem całkowicie mnie przekonało. Dzięki niemu tworzenie aplikacji opartych o MVVM przestaje być monotonne (jak reklamuje sam autor "MVVM Light Toolkit is taking out some of the monotony of implementing MVVM"), a dodatkowo zyskujemy kilka możliwości trudno dostępnych z poziomu "gołego" wzorca (takich jak Messaging, czyli możliwość łatwego komunikowania między różnymi częściami aplikacji albo EventToCommand, pozwalającego na podpinanie dowolnych zdarzeń dostępnych w kontrolkach do obiektów typu Command). MVVM Toolkit skupia się także na tak zwanym Blendability, czyli możliwości łatwego tworzenia programu niezależnie przez programistę (na przykład w Visual Studio) oraz designera (oczywiście w Expression Blend).

Na chwilę obecną zdecydowałem się właśnie na MVVM Light Toolkit i zabieram się za dokładniejsze jego poznanie. Niedługo na pewno pojawi się notka z podstaw jego wykorzystania i wyjaśniająca niektóre z użytych w tym poście terminów.

6 komentarzy:

  1. Polecam http://davybrion.com/blog/category/mvp-in-silverlightwpf/ (dot. Silverlighta, ale WPF też)

    OdpowiedzUsuń
  2. Niestety muszę się z Tobą zgodzić. Sam w ramach ostatniego projektu zapragnąłem użyć MVVM. Materiałów bez liku co jest w sumie dobre, ale każdy robi to inaczej. Jedyne co uzyskałem tym sposobem to mętlik w głowie. W przeciwieństwie do Ciebie wybrałem MVVMF jako podstawę. Dopiero wtedy wszystko nabrało sensu i całe zagadnienie rozjaśniło się w głowie. I jak na razie nie widzę sensu używania innej metodyki dla WPF. MVVM jest po prostu wygodne i nad wyraz proste. Ale jak to z wszystkim bywa, trzeba zrozumieć o co chodzi...

    OdpowiedzUsuń
  3. programistom, nie: programistą.
    zanim znów usuniesz ten komentarz chociaż popraw swój wpis.

    OdpowiedzUsuń
  4. Dzięki za znalezienie literówki, już poprawiam, ale jednocześnie chciałem zaznaczyć, że jeszcze nigdy nie usunąłem niczyjego komentarza na tym blogu :)

    OdpowiedzUsuń
  5. Wybacz, pozwolę sobie wytknąć pewien błąd merytoryczny. Ale jeżeli to jednak ja się mylę to proszę o poprawienie mojej wypowiedzi :)
    Z Twojego wpisu odniosłem wrażenie, że potraktowałeś Prism jako toolkit usprawniający pracę zgodną ze wzorcem MVVM. Faktem jest, że Prism to zupełnie inna bajka. Jest to po prostu biblioteka pozwalająca na wprowadzenie modularności aplikacji. I można w ogóle nie używać wzorca MVVM wykorzystujac Prism. Twoja pomyłka w intepretacji przeznaczenia Prisma zapewne spowodowana była tym, iż niektóre z zawartych dem/przykładów w Prismie napisana została z użyciem MVVM.

    OdpowiedzUsuń
  6. W poszukiwaniach frameworka wspomagającego MVVM w większości oparłem się na tym temacie http://stackoverflow.com/questions/1409553/what-framework-for-mvvm-should-i-use (głównie na pierwszej wypowiedzi). Zasugerowano tam Prisma, dlatego zacząłem mu się bliżej przyglądać i faktycznie odstraszył mnie mnogością opcji i możliwości.
    Ale masz całkowitą rację, jeśli chodzi o główne przeznaczenie Prisma. Przede wszystkim ma on służyć do budowania modularnych aplikacji.
    Dziękuję za zwrócenie na to uwagi, chyba jednak nie zdawałem sobie z tego do końca sprawy.

    OdpowiedzUsuń