Model View Controller je v poslední době často zmiňovaný návrhový vzor. Jeho autorem je Trygve Reenskaug. Byl vyvinut okolo roku 1978 jako framework pro jazyk Smalltalk. Od této doby se aplikuje ve všemožných frameworcích, které mají co do činění s uživatelským rozhraním.

Jak to funguje

MVC se skládá ze 3 modulů. Model reprezentuje hlavní doménovou logiku aplikace. Je to její nevizuální část, která obsahuje data a chování celé aplikace, tedy kromě toho co se týká uživatelského rozhraní. O uživatelské rozhraní se totiž stará view. View tedy slouží (jen) k zobrazování dat z modelu uživateli. Manipulaci s daty pak obstarává controller. Ten přebírá informace od uživatele, nechá je zpracovat modelem a zařídí, aby se aktualizoval view. Z tohoto pohledu pak můžeme chápat uživatelské rozhraní jako kombinaci view a cotrolleru.

Toto oddělení modelu a prezentace je vhodné z několika důvodů

  • Člověk nemusí myslet na několik věcí zároveň. Pokud vytváří view, přemýšlí o tom jak udělat přívětivé uživatelské rozhraní. Pokud tvoří model, přemýšlí o aplikační logice, o práci s databázi a podobně. Důležité také je, že na každou tuto oblast se může specializovat jiný člověk.
  • Člověk může chtít dostat se ke stejným informacím různými cestami. Oddělení prezentace od modelu přináší možnost přistupovat k datům modelu různými způsoby (například pomocí webového prohlížeče, pomocí API webové služby, atd.).
  • Objekty modelu, které nejsou promíseny s prezentací, je možné snadno automaticky testovat.
  • Jednodušší zapracování změn, které se týkají uživatelského rozhraní.

Důležitou věcí jsou také závislosti mezi modelem a view. View závisí na modelu, ale model by měl být absolutně nezávislý. To znamená, že pokud změním view, nemělo by mně to nutit šáhnout na model.

Rozdělovat view a controller není obecně nutné v desktopových aplikacích. Ve webových aplikacích, je toto oddělení naopak důležité.

Shrnutí
MVC doporučuje oddělit aplikaci do tří částí, modelu, view a controlleru. Nic však už neříká o tom, jak by toto rozdělení mělo být provedeno a ani o tom, jak by následně měly tyto části mezi sebou komunikovat. Každou část tedy může tvořit třída, množina tříd, nebo jen množina metod.