4. Wzorce projektowe

4.2. MVC - Model View Controller

Model-View-Controller (MVC) to popularny wzorzec projektowy stosowany w budowie aplikacji internetowych, który ma na celu oddzielenie logiki biznesowej od logiki prezentacji i zarządzania interakcjami użytkownika. Wzorzec MVC dzieli kod źródłowy aplikacji na trzy zasadnicze warstwy: model (M - Model), widok (V - View), kontroler (C - Controller).

Model

Reprezentuje dane oraz logikę biznesową aplikacji. W ramach modelu implementowane są wszystkie operacje związane z danymi, takie jak ich tworzenie, odczytywanie, aktualizacja i usuwanie (tzw. operacje CRUD - Create, Read, Update, Delete), a także ich walidacja. Tym samym w ramach modelu implementuje się dostęp do bazy danych. Model powinien być niezależny od interfejsu użytkownika, tj. operować na danych w postaci kanonicznej (np. liczby, struktury, tablice), ale nie w postaci sformatowanej dla konkretnego sposobu wyświetlania (np. w postaci tagów języka HTML).

Widok

Jest odpowiedzialny za prezentację danych, czyli za to, co użytkownik widzi na ekranie. Widok generuje interfejs użytkownika i wyświetla dane dostarczane przez Model w sposób zrozumiały dla użytkownika, np. poprzez wygenerowanie odpowiednio sformatowanej strony w języku HTML bądź jej części w postaci poszczególnych komponentów (np. listy zalogowanych użytkowników). Jego rola nie obejmuje natomiast zarządzania logiką aplikacji ani operacjami na danych.

Kontroler

Funkcjonuje jako pośrednik między Modelem a Widokiem. Kontroler przyjmuje żądania przychodzące od przeglądarki internetowej, przekazuje je do odpowiedniego Modelu, a następnie wybiera odpowiedni Widok, aby zwrócić do przeglądarki odpowiednio sformatowane wyniki. Kontroler organizuje przepływ danych i sterowania między Modelem a Widokiem.

Przykład

  1. Klient (przeglądarka internetowa) wysyła do serwera żądanie (np. w wyniku kliknięcia w link lub przesłanie formularza) do serwera.
  2. Kontroler odbiera żądanie, interpretuje je i decyduje, jakie operacje muszą być wykonane, aby odpowiedzieć na żądanie użytkownika. Na przykład, jeśli użytkownik chce zobaczyć listę produktów, Kontroler wywoła na odpowiednim Modelu metodę, która zwróci niezbędne dane.
  3. Model pobiera dane z odpowiedniej tabeli z bazy, wykonuje operacje biznesowe (np. obliczenia, przetwarzanie danych, agregację z różnych tabel itp.). Alternatywnie, w przypadku zapisu, dostarczone dane weryfikuje (np. sprawdza, czy wartości mieszczą się w zakresie wynikającym z logiki aplikacji), a następnie zapisuje we właściwe miejsce w bazie. Operacje przetwarzania danych czasami bywają skomplikowane, ale nie mogą obejmować formatowania pod konkretny sposób prezentacji.
  4. Po poprawnym wykonaniu operacji, Model zwraca do Kontrolera pobrane dane. W przypadku wystąpienia błędu (np. żądanie nieistniejącego rekordu lub dostarczenie danych niespełniających kryteriów walidacji), model sygnalizuje błąd - np. poprzez wykorzystanie mechanizmu wyjątków (ang. Exceptions).
  5. Kontroler wybiera Widok, który pozwala wyświetlić dane (lub komunikat błędu), i przekazuje do niego dane przekazane przez Model.
  6. Widok renderuje dane dostarczone przez Kontroler, generując najczęściej kod HTML, który jest wyświetlany użytkownikowi w przeglądarce.

Zalety

  • Rozdzielenie odpowiedzialności. Dzięki MVC, kod aplikacji jest podzielony na trzy główne części, które są odpowiedzialne za różne aspekty działania aplikacji – Model za logikę i dane, View za prezentację, a Controller za obsługę interakcji. Dzięki temu każda z tych części może być rozwijana, testowana i utrzymywana niezależnie od siebie - przez różne zespoły programistów.
  • Dzięki wyraźnemu rozdzieleniu odpowiedzialności, aplikacja jest łatwiejsza w utrzymaniu - zmiany w jednym komponencie (np. w definicji wyglądu) nie wpływają bezpośrednio na inne części systemu (np. na logikę biznesową zaimplementowaną w Modelu).
  • Takie odseparowane komponenty aplikacji mogą być ponownie używane w innych częściach aplikacji lub nawet w innych projektach, co przyspiesza rozwój i zmniejsza wymagany nakład pracy.
  • Rozdzielenie logiki biznesowej od logiki prezentacji pozwala na dużo łatwiejsze testowanie Modelu i Kontrolera, np. bez konieczności uruchamiania interfejsu użytkownika.
  • MVC pozwala na łatwe skalowanie poprzez dodawanie nowych funkcjonalności bez konieczności analizowania i modyfikowania całego kodu źródłowego aplikacji.