Katalog
concept#Architektur#Software-Engineering#Plattform

Model-View-Controller (MVC)

Architekturmuster zur Trennung von Datenmodell, Darstellung und Steuerung, um Wartbarkeit und Testbarkeit von UI-nahen Systemen zu verbessern.

Das Model-View-Controller (MVC)-Muster trennt Anwendungen in Model, View und Controller, um Daten, Darstellung und Benutzereingaben zu entkoppeln.
Etabliert
Mittel

Klassifikation

  • Mittel
  • Technisch
  • Architektur
  • Fortgeschritten

Technischer Kontext

ORMs und PersistenzbibliothekenFrontend-Templating-Engines oder KomponentenbibliothekenRouting- und Middleware-Schichten

Prinzipien & Ziele

Trennung von Anliegen (Separation of Concerns)Klare Verantwortlichkeiten für Model, View und ControllerKohärente Schnittstellen und geringe Kopplung zwischen Schichten
Umsetzung
Domäne, Team

Use Cases & Szenarien

Kompromisse

  • Unklare Abgrenzung führt zu vermischter Logik
  • Controller als Dumping-Ground für Geschäftslogik
  • Fehlende Disziplin beim Schichten-Design erhöht Wartungskosten
  • Halte Controller dünn; Geschäftliche Logik im Model
  • Definiere explizite Contracts für View-Daten
  • Nutze Automatisierte Tests zur Absicherung der Trennung

I/O & Ressourcen

  • Domänenmodell und Geschäftsregeln
  • UI-Designs oder Templates
  • Event- und Routing-Spezifikationen
  • Getrennte Schichten (Model/View/Controller)
  • Verbesserte Testabdeckung und modularisierte Komponenten
  • Dokumentierte Schnittstellen und Contracts

Beschreibung

Das Model-View-Controller (MVC)-Muster trennt Anwendungen in Model, View und Controller, um Daten, Darstellung und Benutzereingaben zu entkoppeln. Es steigert Wartbarkeit, Testbarkeit und parallele Entwicklung in Web- und Desktopanwendungen durch klare Verantwortlichkeiten. Gleichzeitig erhöht MVC die Architekturkomplexität, erfordert Disziplin und kann zu Controller-Bloat führen.

  • Verbesserte Wartbarkeit durch klar definierte Schichten
  • Bessere Testbarkeit der Geschäftslogik getrennt von der UI
  • Erleichtert parallele Entwicklung von UI und Backend

  • Erhöhter Architektur- und Koordinationsaufwand
  • Nicht optimal für sehr dynamische komponentenbasierte UIs
  • Kann zu übergroßen Controllern (Controller-Bloat) führen

  • Anteil unit-getesteter Geschäftslogik

    Misst den Prozentsatz der Domänenlogik, der durch Unit-Tests abgedeckt ist.

  • Durchschnittliche Controller-Größe

    Metrik zur Erkennung von Controller-Bloat anhand LOC oder Anzahl von Methoden.

  • Time-to-Change für UI-Anpassungen

    Zeit vom Änderungswunsch bis zur produktiven Bereitstellung einer UI-Änderung.

Ruby on Rails

Rails implementiert MVC als zentrales Architekturprinzip mit klaren Konventionen für Models, Views und Controller.

ASP.NET MVC

Microsofts Framework bietet eine strukturierte MVC-Implementierung für Webanwendungen mit Routing und Controller-Lifecycle.

Desktop-Anwendungen (z. B. Java Swing Varianten)

MVC-Konzepte finden sich in vielen Desktop-UI-Frameworks, um Darstellung und Logik zu trennen.

1

Analysiere bestehende Codepfade und identifiziere Verantwortlichkeiten

2

Extrahiere das Domänenmodell aus UI-Logik

3

Implementiere Views getrennt von Controller-Logik

4

Ergänze Tests für Model- und Controller-Schichten

⚠️ Technische Schulden & Engpässe

  • Historisch gewachsene Controller mit gemischter Logik
  • Ungetestete Model-Funktionen im Code-Stamm
  • Fehlende Schnittstellendefinitionen zwischen Views und Controllern
Controller-BloatDatenkopplungRendering-Performance
  • Verlagerung komplexer Validierungen in Controller statt Model
  • Verwendung von MVC als Boilerplate ohne echte Schichttrennung
  • Übermäßige Nutzung von globalen Zuständen zwischen Schichten
  • Unzureichende Tests für Controller-Interaktionen
  • Fehlende Dokumentation der Contracts zwischen Schichten
  • Inkonsistente Benennung und Verantwortungszuweisung
Software-Architektur und SchichtentwurfErfahrung mit Test-Driven DevelopmentKenntnisse des eingesetzten Frameworks (z. B. Rails, ASP.NET)
Wartbarkeit der UI-LogikTestbarkeit und AutomatisierungNotwendigkeit paralleler Entwicklung
  • Erfordert klare Schnittstellendefinitionen
  • Nicht ideal für rein komponentenbasierte Frameworks ohne zentrale Controller
  • Einarbeitungszeit für Entwickler zur korrekten Schichttrennung