Model-View-Controller (MVC)

Aus dev.kaibel.net
Zur Navigation springen Zur Suche springen

Model-View-Controller (MVC) Entwurfsmuster

Das Model-View-Controller-Muster (kurz: MVC) ist ein grundlegendes Architekturmuster der Softwareentwicklung, das zur **Trennung von Daten, Darstellung und Logik** dient. Es sorgt für eine klare Struktur, bessere Wartbarkeit und Wiederverwendbarkeit von Code, insbesondere in GUI- und Webanwendungen.

Grundidee

Das MVC-Muster teilt eine Anwendung in drei klar getrennte Komponenten:

Komponente Aufgabe
Model Enthält die Anwendungslogik, Datenstrukturen und Regeln.

Verwaltet den Zustand der Anwendung unabhängig von der Benutzeroberfläche.

View Präsentiert die Daten des Models dem Benutzer (z. B. GUI, Webseite, Konsole).

Reagiert auf Änderungen im Model.

Controller Nimmt Benutzereingaben entgegen, interpretiert sie und ändert Model oder View entsprechend.
+--------------+        +--------------+        +--------------+
|    View      | <----> |  Controller  | <----> |    Model     |
| (Anzeige)    |        | (Steuerung)  |        | (Daten)      |
+--------------+        +--------------+        +--------------+

Ablauf

1. **Benutzeraktion:** Der Benutzer interagiert mit der View (z. B. klickt einen Button). 2. **Steuerung:** Der Controller empfängt das Ereignis und ändert den Zustand des Models. 3. **Datenänderung:** Das Model aktualisiert seine Daten und informiert die View. 4. **Anzeige:** Die View aktualisiert die Darstellung gemäß den neuen Modeldaten.

Beispiel (C++ mit Pseudocode)

#include <iostream>
#include <string>

// MODEL
class Model {
    std::string text = "Hello";
public:
    std::string getText() const { return text; }
    void setText(const std::string& t) { text = t; }
};

// VIEW
class View {
public:
    void display(const std::string& data) {
        std::cout << "Anzeige: " << data << std::endl;
    }
};

// CONTROLLER
class Controller {
    Model& model;
    View& view;
public:
    Controller(Model& m, View& v) : model(m), view(v) {}
    void onUserInput(const std::string& input) {
        model.setText(input);
        view.display(model.getText());
    }
};

int main() {
    Model model;
    View view;
    Controller controller(model, view);

    controller.onUserInput("Hallo MVC!");
}
    • Ergebnis:**
Anzeige: Hallo MVC!

Vorteile

  • **Klare Trennung von Logik, Daten und Darstellung**
  • **Einfachere Wartung und Testbarkeit**
  • **Mehrfachverwendung des Models mit unterschiedlichen Views**
  • **Unabhängige Entwicklung von Frontend und Backend**

Nachteile

  • Zusätzlicher Strukturierungsaufwand
  • Höhere Komplexität bei kleinen Projekten
  • Kommunikation zwischen Komponenten kann aufwendig werden

Varianten

Das MVC-Muster wurde in vielen Frameworks weiterentwickelt oder angepasst:

Variante Beschreibung
MVP (Model-View-Presenter) Der Presenter übernimmt mehr Logik und kommuniziert direkter mit der View.
MVVM (Model-View-ViewModel) Typisch für GUI-Frameworks (z. B. WPF, MAUI). Datenbindung zwischen View und ViewModel.
HMVC Hierarchisches MVC für modulare Anwendungen mit verschachtelten Controllern.

MVC in Webanwendungen

In modernen Webframeworks wird MVC weit verbreitet eingesetzt:

  • **Model:** Daten und Geschäftslogik (z. B. Datenbankmodelle)
  • **View:** HTML-/Template-Dateien
  • **Controller:** Vermittelt zwischen HTTP-Anfragen und Modellen

Beispiel in Frameworks:

  • **Laravel (PHP)**
  • **Django (Python)**
  • **ASP.NET MVC (C#)**
  • **Spring MVC (Java)**
  • **Ruby on Rails**

Beispiel einer Webstruktur

/app
 ├── models/
 │   └── user.php
 ├── views/
 │   └── userView.html
 └── controllers/
     └── userController.php

Vergleich mit ähnlichen Mustern

Muster Fokus Besonderheit
MVP (Model-View-Presenter) GUI-Architektur Presenter kontrolliert die View direkt
MVVM (Model-View-ViewModel) Datenbindung ViewModel abstrahiert View komplett
PAC (Presentation-Abstraction-Control) Interaktive Systeme Hierarchisch strukturierte Variante von MVC

Einsatzgebiete

  • Benutzeroberflächen (Desktop, Web, Mobile)
  • GUI-Frameworks (Qt, JavaFX, WPF)
  • Webframeworks (Laravel, Django, Spring, Rails)
  • Software mit klarer Trennung von Logik und Darstellung

Siehe auch

Quellen