MVVM – Wzorzec czy żarcik?

MVVM w pełnej pisowni Model-View-ViewModel jest to kolejny, podstawowy wzorzec projektowy, który bardzo dobrze przyjął się wśród programistów WPF i Silverlight ze względu na prostotę zastosowania. Czym dokładnie charakteryzuje się ten wzorzec? W porównaniu do wcześniej omawianego MVC można od razu zauważyć że zniknął nam gdzieś kontroler, odpowiedzialny za przetwarzanie danych oraz obsługę modelu. No właśnie, w tym wzorcu nie ma potrzeby posługiwania się kontrolerem ponieważ wszystkie elementy którymi się on zajmował odbywają się bezpośrednio w widoku. Jak to działa?

MVVM

Dla przykłady, naszym Modelem jest obsługa bazy danych przechowująca dane takie jak firstName, lastName, gender i agreed. Po stronie widoku renderujemy formularz z odpowiednią ilością inputów oraz rozpoczynamy zarządzanie ViewModelem. Na jakiej podstawie to robimy? To proste. W zależności od dokonywanych przez użytkownika interakcji aktualizujemy np.: string json/xml przechowujący zaznaczone/wpisane dane w formie tekstu. Po operacjach dokonany przez użytkownika może posiadać następują formę:

{ firstName: John, lastName: Doe, gender: Male, agreed: false }

Po zakończeniu przez użytkownika modyfikacji elementów w formie następuje przekazanie ciągu znaków do modelu i bezpośredni zapis do bazy danych.

Jakie są główne wady i zalety tego rozwiązania? W przypadku programistów WPF i Silverlight jedna osoba może siedzieć i pisać model w Visual Studio, kolejna za to układać ładne elementy graficzne i animacje w Blendzie które posłużą do zbierania informacji. Aplikacja, ze względu na sposób komunikacji warstwy prezentacji z modelem w WPF/Silverlight jest w miarę bezpieczna. Spójrzmy jednak na zastosowanie tego modelu w PHP. Zaletą jest to że oddzielamy całkowicie widok od modelu, i raz zaprogramowany back-end służy nam do wielu rzeczy – możemy na nim zastosować wiele widoków. Minusem jest potrzeba naprawdę nieziemskiego zabezpieczenia aplikacji. Pomiędzy przeglądarką (view) a serwerem (model) przesyłany jest, w większości przypadków niezakodowany tekst (viewModel jako json/xml) który przekazuje dane i ew. instrukcje dla modelu. W jaki sposób się zabezpieczyć? Jak uniknąć ataków które będą spamowały nasz model ogromną ilością zapytań? To jest realny problem który częściowo można rozwiązać poprzez zastosowanie SSL, crypto.js, systemu kluczy prywatnych i publicznych oraz innych elementów (o czym później napiszę). Niewątpliwie zaletą MVVM w programowaniu dla przeglądarki jest mnogość interakcji które możemy udostępnić użytkownikowi operując na viewModelu. Posiadając przekazane od użytkownika dane w pamięci przeglądarki – viewModel (a nie domyślnie w bazie danych) jesteśmy w stanie przekazywać i aktualizować widoki bez nawiązywania połączenia z serwerem. Dzięki czemu niwelujemy efekt ‚przeładowywanego okna’. Przykład zastosowania modelu MVVM w praktyce możecie znaleźć tutaj: Knockout.

Kasztelan Paweł

Programista samouk, zakochany w ZF i Laravel, szerzący opinię że PHP + JS + HTML + CSS to są języki w których może zostać stworzona aplikacja równie dobra, a nawet lepsza od twardego klienta.