MVC (Model-View-Controller) to wzorzec projektowy, którego autorstwo jest przypisywane Trygveowi Reensceidowi, norweskiemu informatykowi, który stworzył ten wzorzec w latach 70. XX wieku podczas pracy nad językiem programowania Smalltalk. MVC został stworzony w celu rozdzielenia interfejsu użytkownika od reszty aplikacji, co pozwoliło na łatwiejsze tworzenie, modyfikowanie i testowanie kodu.
Później wzorzec MVC stał się popularny wśród programistów, szczególnie w tworzeniu aplikacji webowych. Obecnie MVC jest szeroko stosowany w wielu językach programowania i platformach aplikacyjnych, a także istnieją liczne implementacje tego wzorca w różnych kontekstach.
Dzięki temu podziałowi na trzy elementy, aplikacja staje się bardziej modularna i łatwiejsza w utrzymaniu. Wzorzec MVC jest bardzo popularny i szeroko stosowany w tworzeniu aplikacji webowych oraz desktopowych.
Poniżej przykład implementacji MVC w PHP:
Model odpowiada za przechowywanie danych i operacje na nich, takie jak pobieranie, zapisywanie i aktualizowanie. Model jest niezależny od widoku i kontrolera, co pozwala na łatwe modyfikacje danych bez wpływu na pozostałe części aplikacji.
Przykładem zastosowania modelu w architekturze MVC może być prosta aplikacja do zarządzania zadaniami. Model może odpowiadać za przechowywanie informacji o zadaniach, takich jak ich nazwy, opisy, daty wygaśnięcia, statusy i wiele innych.
Kiedy użytkownik dodaje nowe zadanie, kontroler przekazuje dane do modelu, który tworzy nowy obiekt zadania i dodaje go do listy zadań. W modelu można również definiować różne operacje, takie jak sortowanie zadań według daty wygaśnięcia lub wyszukiwanie zadań po określonym kryterium.
Następnie widok może wyświetlić listę zadań użytkownikowi, wraz z ich szczegółowymi informacjami. Widok może również umożliwiać użytkownikowi edycję istniejących zadań lub usuwanie ich z listy.
Dzięki temu model odpowiada za przechowywanie danych o zadaniach i umożliwia kontrolerowi i widokowi dostęp do tych danych. Model może również zawierać logikę biznesową, taką jak sprawdzanie daty wygaśnięcia zadania i automatyczne zmienianie jego statusu na „zakończone”, gdy ta data zostanie przekroczona.
Poniżej przykład w czystym php modelu:
class Model { // pobieranie danych z bazy danych lub innych źródeł public function getData(): array { return array('John', 'Doe', '[email protected]'); } }
Natomiast View odpowiada za wyświetlanie danych użytkownikowi. Widok pobiera dane z modelu i prezentuje je w formie łatwej do odczytu przez użytkownika. Widok nie ma bezpośredniego dostępu do modelu, a jedynie otrzymuje od kontrolera odpowiednie dane, które ma wyświetlić.
class View { public function __construct( private $model, private $controller ) { } public function render(): string { $data = $this->model->get_data(); return "<p>Name: " . $data[0] . "</p>". "<p>Last Name: " . $data[1] . "</p>". "<p>Email: " . $data[2] . "</p>"; } }
Controller odpowiada za logikę biznesową aplikacji i kontroluje interakcje między modelem a widokiem. Kontroler otrzymuje żądania od użytkownika poprzez interfejs użytkownika (np. przyciski, formularze itp.), a następnie przetwarza żądania, w zależności od kontekstu, wywołując odpowiednie metody w modelu i widoku.
Przykładem zastosowania kontrolera w architekturze MVC może być prosty system rezerwacji sal konferencyjnych. W takim systemie kontroler mógłby odpowiadać za obsługę żądań użytkowników, takich jak dodawanie, edytowanie lub usuwanie rezerwacji.
Kontroler otrzymuje żądania od użytkownika, przetwarza je i wywołuje odpowiednie metody w modelu, aby zaktualizować stan danych. Następnie kontroler wybiera odpowiedni widok, który ma zostać wyświetlony użytkownikowi, i przekazuje mu odpowiednie dane.
Na przykład, użytkownik może chcieć dodać nową rezerwację sali konferencyjnej na określoną datę i godzinę. W tym przypadku kontroler otrzymuje żądanie, pobiera dane od użytkownika i przekazuje je do modelu, aby utworzyć nową rezerwację. Następnie kontroler wybiera odpowiedni widok, który może wyświetlić potwierdzenie rezerwacji lub informację o błędzie, jeśli rezerwacja nie może zostać utworzona.
W ten sposób kontroler odpowiada za obsługę żądań użytkownika i kontrolowanie logiki biznesowej, podczas gdy model odpowiada za przechowywanie danych i operacje na nich, a widok za wyświetlanie tych danych użytkownikowi.
class Controller { public function __construct( private $model ) { } public function updateData() { // aktualizowanie danych w modelu } }
Na koniec prosty plik index.php, który inicjuje cały wzorzec MVC z wydzielonym widokiem, modelem i kontrolerem:
include 'model.php'; include 'view.php'; include 'controller.php'; $model = new Model(); $controller = new Controller($model); $view = new View($model, $controller); $view->render();
O ile MVC jest już tak popularnym i znanym wzorcem, przyjrzyjmy się również jego wadom:
- Złożoność: Implementacja wzorca MVC może być złożona, szczególnie dla początkujących programistów. Wymaga to od programisty wykorzystania trzech oddzielnych warstw – modelu, widoku i kontrolera – co może być trudne do zrozumienia i utrzymania.
- Nadmiar kodu: W porównaniu do innych wzorców, takich jak Model-View lub Model-View-Presenter, implementacja MVC może wymagać większej ilości kodu. Powodem tego jest konieczność tworzenia oddzielnych klas dla każdej z trzech warstw.
- Nadmiar plików: Implementacja wzorca MVC może prowadzić do nadmiaru plików i klas, co może być problematyczne dla dużych projektów. Każda z trzech warstw wymaga oddzielnej klasy i pliku, co prowadzi do zwiększonej liczby plików w projekcie.
- Zbyt duża zależność między warstwami: W niektórych przypadkach, szczególnie gdy aplikacja jest prostsza, stosowanie wzorca MVC może prowadzić do zbyt dużej zależności między warstwami. To oznacza, że zmiana jednej warstwy może wpłynąć na inne, co może prowadzić do błędów.
- Zbyt duże obciążenie kontrolera: W niektórych przypadkach kontroler może stać się zbyt obciążony, ponieważ kontroluje on całą logikę biznesową aplikacji. To może prowadzić do trudności w utrzymaniu kodu, a także do trudności w testowaniu i debugowaniu.
Pamiętaj, żeby zawsze rozważać zastosowanie wzorca MVC w kontekście konkretnego projektu, aby ocenić, czy spełni on jego potrzeby.
Daj znać w komentarzu czy chciałbyś obszerniejszy przykład zastosowania MVC w repozytorium 🙋♂️
[…] kontrolera w koncepcji GRASP może odnosić się do jego roli w architekturze MVC, gdzie odseparowanie logiki biznesowej od warstwy prezentacji jest kluczowe dla utrzymania […]