MVC (programowanie)
MVC (z ang. Model‑View‑Controller) – architektoniczny wzorzec projektowy stosowany w tworzeniu aplikacji programistycznych, który rozdziela logikę aplikacji na trzy odrębne komponenty: Model, View (widok) oraz Controller (sterownik). Dzięki takiej separacji uzyskuje się lepszą modularność, możliwość ponownego użycia kodu oraz ułatwione testowanie jednostkowe.
Historia
Wzorzec MVC został po raz pierwszy opisany w 1979 roku przez Trygve Reenskaug w ramach prac nad językiem Smalltalk w Xerox PARC. Początkowo używany był w systemach graficznych, ale już w 1994 roku pojawiły się pierwsze implementacje w środowiskach webowych. Od 2000 roku MVC stał się podstawą wielu popularnych frameworków, m.in. ASP.NET MVC, Spring MVC, Ruby on Rails i Django (który wykorzystuje wariant MTV).
Podstawowe komponenty
- Model – warstwa przechowująca dane oraz logikę biznesową. Odpowiada za dostęp do bazy danych, walidację danych i operacje na nich. Przykładowo, w Javie model może być reprezentowany przez klasy POJO z adnotacjami JPA.
- View – warstwa prezentacji, której zadaniem jest wyświetlanie danych użytkownikowi.
Może to być szablon HTML, interfejs graficzny (GUI) lub inny format wyjściowy. W
ASP.NET widoki są najczęściej plikami
.cshtmlz użyciem silnika Razor. - Controller – pośrednik przyjmujący żądania od użytkownika,
wywołujący odpowiednie metody modelu i wybierający widok do renderowania.
W Rails kontrolery dziedziczą po
ApplicationController.
Przepływ działania
Typowy scenariusz w architekturze MVC wygląda następująco:
- Użytkownik wysyła żądanie HTTP do aplikacji.
- Router (część frameworka) przekierowuje żądanie do odpowiedniego Controllera.
- Controller przetwarza żądanie, odwołuje się do Modelu w celu pobrania lub modyfikacji danych.
- Na podstawie wyniku operacji wybierany jest View, który renderuje odpowiedź (np. HTML).
- Odpowiedź jest zwracana do przeglądarki użytkownika.
Zastosowania
MVC jest wykorzystywane w różnych typach aplikacji:
- Strony internetowe i aplikacje webowe (Spring MVC, ASP.NET MVC).
- Aplikacje desktopowe (frameworki .NET, Qt).
- Systemy mobilne (np. Android przy użyciu architektury MVVM, będącej ewolucją MVC).
- Systemy oparte na mikroserwisach, gdzie każdy serwis może implementować własny wariant MVC.
Popularne implementacje i frameworki
| Framework | Język | Rok pierwszej wersji | Link wewnętrzny |
|---|---|---|---|
| ASP.NET MVC | C# | 2009 | ASP.NET MVC |
| Spring MVC | Java | 2003 | Spring MVC |
| Ruby on Rails | Ruby | 2005 | Ruby on Rails |
| Django (MTV) | Python | 2005 | Django |
Zalety i wady
Zalety
- Silna separacja warstw ułatwia utrzymanie i rozwój projektu.
- Umożliwia równoległą pracę zespołów (frontend vs. backend).
- Ułatwia testowanie jednostkowe komponentów Modelu i Controllera bez zależności od UI.
- Wspiera ponowne użycie kodu i dziedziczenie komponentów.
Wady
- Wprowadza dodatkową warstwę abstrakcji, co może zwiększyć złożoność projektu.
- Nie zawsze jest optymalne dla bardzo małych, jednofunkcyjnych aplikacji.
- Niektóre frameworki narzucają konwencje, które mogą ograniczać swobodę projektową.
Przykładowy kod (ASP.NET MVC, C#)
using System.Web.Mvc;
using MyApp.Models;
public class ProduktyController : Controller
{
// GET: /Produkty/
public ActionResult Index()
{
var produkty = ProduktyRepository.PobierzWszystkie(); // Model
return View(produkty); // View
}
// POST: /Produkty/Dodaj
[HttpPost]
public ActionResult Dodaj(Produkt nowyProdukt)
{
if (ModelState.IsValid)
{
ProduktyRepository.Dodaj(nowyProdukt); // Model
return RedirectToAction("Index");
}
return View(nowyProdukt); // View z błędami walidacji
}
}
Powiązane pojęcia
Wzorzec projektowy, architektura oprogramowania, separacja kodu, Inwersja zależności (IoC), testowanie jednostkowe.
Bibliografia
- Reenskaug, T. „Model-View-Controller”. Smalltalk 1979.
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison‑Wesley, 1994.
- Microsoft Docs. ASP.NET MVC. 2009.
- Rod Johnson. Spring MVC. SpringSource, 2003.
- David Heinemeier Hansson. Ruby on Rails. 2005.