# Model-view-controller

Een model-view-controller (vaak afgekort tot MVC) is een ontwerppatroon in het programmeren dat wordt gebruikt om de gebruikersinterface (view), businesslogica (model) en de applicatielogica (controller) van elkaar te scheiden. Door het ontwerp op te delen in drie aparte lagen kan bij complexe toepassingen de schaalbaarheid en efficiëntie worden bereikt. Wanneer na enige tijd bijvoorbeeld de user interface wijzigt, zal dit geen invloed uitoefen op de betrokken businesslogica en databaselogica.

## Doel

Elk laag heeft een specifieke doel en verantwoordelijkheid. In principe kan dit ondermijnd worden, maar dan wordt het ontwerppatroon geschonden waarvoor het is ontwikkeld. In dit geval kan dan geen absolute schaalbaarheid en beveiliging gegarandeerd worden.

### Controller

Dit heeft als doel rechtstreeks te communiceren met gebruikers die gegevens opvragen. De verantwoordelijkheid van deze laag is om het model te raadplegen en vervolgens via dit model acties uit voeren en resultaten op te halen. Hierbij is het van belang dat deze laag niet zelf de berekening doet, maar de acties coördineert. Wanneer deze laag rechtstreeks communiceert met een database wijst dit op een foutieve implementatie volgens de regels van de kunst. De controller geeft daarna een respons terug aan de gebruiker via een geselecteerde view.

### Model

Het model heeft als enig doel de bedrijfslogica in kaart te brengen. De verantwoordelijkheid van deze laag is het berekenen en verwerken van gegevens met behulp van een databaselaag. De databaselogica is meestal een aparte laag verbonden met het model. Dit kan een database, maar ook een simulatie-opslagplaats zijn. Het model vraagt via interface actie aan een databaselaag om gegevens op te halen en weg te schrijven. De datalaag is niet per definitie een onderdeel van het MVC-patroon.

### View

De view heeft als doel de businesslogica af te schermen van de buitenwereld en enkel publieke gegevens te tonen. Dit kan belangrijk zijn voor gegevensbescherming en beveiliging van de applicatie met API. De verantwoordelijkheid van deze laag is een HTML-component of een DTO-component (data transfer object) te selecteren en te mappen. De view kan tijdens het mappen ook gegevens omzetten naar een ander formaat.

## Werking
### API

Met een externe frontend via API bevat een view (DTO) het kopie van de class-model, maar dan zonder gevoelige informatie. Een voorbeeld is 'class User': dit heeft een e-mail, nickname en wachtwoord. Maar wanneer dit gemapt wordt naar 'class UserDTO', dan is het wachtwoord niet meer aanwezig. Classes van een model kunnen een voor een worden omgezet naar views in de code, maar kunnen ook op voorhand geregistreerd zijn om als dependency injection in te voegen. De gegevens worden via XML of JSON verstuurd door de backend naar de frontend, die vaak op een aparte server staat.

### HTML

Met een interne frontend via web gebruikersinterface worden componenten direct gecreëerd met HTML. De variabelen en de informatie worden in de HTML ingevoegd. Wanneer de opmaak is voltooid wordt deze daarna in zijn geheel naar de webbrowser teruggestuurd. De volledige actie vindt plaats op dezelfde server.

## Voordelen

* De views veranderen meestal sneller dan het businessmodel. Met MVC is een lay-out makkelijk te wijzigen zonder rekening te moeten houden met de rest.
* De overstap naar API en/of HTML is eenvoudig.
* Het model hoeft geen rekening te houden met views en controllers.
* Hoewel de view en controller het model raadplegen en moeten kennen, speelt de code binnenin het model geen enkele rol.
* Geen rekening te houden met een database.

## Implementaties

In 1994 was het reeds mogelijk om in Smalltalk te programmeren via een web-interface. Smalltalk implementeerde daartoe gewoon een HTML-view op zichzelf. Het resultaat was VisualWave, een webversie van VisualWorks (de naam van het Smalltalk-systeem). Dit was mogelijk door het feit dat de hele Smalltalk-ontwikkelingsomgeving volledig volgens het MVC-patroon was geschreven.
Voor Java bestaan veel MVC-frameworks. Bekende zijn Struts, JavaFX en Spring. Het MVC-framework voor Ruby is Ruby on Rails. Voor Python is Django het bekendste MVC-framework. Bekende MVC-frameworks voor PHP zijn Zend Framework, CodeIgniter, Kohana, Laravel, CakePHP en Phalcon. Voor Microsoft .NET zijn er MonoRail, Vici MVC en een native .NET-implementatie, genaamd Microsoft ASP.NET MVC. Voor Adobe ColdFusion zijn er onder andere Mach-II, Model-Glue en ColdBox. Voor Perl is er het framework Catalyst.