MVC: Die Essenz des Model-View-Controller-Patterns und seine Implementierung

Autor: IT Sectr Veröffentlicht: 2026-02-16 Lesezeit: 9 Min.

MVC (Model-View-Controller) ist ein Architekturmuster, das eine Anwendung in drei Komponenten aufteilt: Model ist für Daten und Geschäftslogik verantwortlich, View für die Benutzeroberfläche, Controller für die Eingabeverarbeitung und Koordination von Model und View. In iOS wird MVC über UIViewController implementiert, in Android — über Activity und Fragment. MVC bleibt das grundlegende Muster, auf dem MVVM, MVP und Clean Architecture aufbauen. Erfahren Sie mehr auf MVC in Cocoa Core.

Wichtige Punkte

  • MVC — drei Komponenten: Model (Daten), View (Oberfläche), Controller (Logik)
  • UIViewController — Controller-Implementierung auf iOS, verantwortlich für den Bildschirmlebenszyklus
  • Activity/Fragment — Controller-Implementierung in Android mit ähnlichen Funktionen
  • Massive View Controller — Hauptproblem von MVC: Controller wächst auf Tausende Zeilen
  • Komponentenkommunikation — Controller aktualisiert View und Model, Model benachrichtigt Controller über Änderungen

Was ist MVC: Die Essenz des Model-View-Controller-Patterns

MVC (Model-View-Controller) ist ein Architekturmuster, das 1979 von Trygve Reenskaug für die Sprache Smalltalk-80 vorgeschlagen wurde. Das Muster teilt eine Anwendung in drei Schichten auf: Model enthält Daten und Geschäftslogik, View ist für die Anzeige zuständig, Controller verarbeitet Benutzereingaben und aktualisiert Model und View. Die Trennung der Verantwortlichkeiten ermöglicht es, jede Schicht unabhängig zu ändern — zum Beispiel View von UIKit zu SwiftUI zu wechseln, ohne die Geschäftslogik in Model zu ändern.

Komponenteninteraktion in MVC folgt einem Zyklus: Benutzer interagiert mit View → Controller empfängt das Ereignis → Controller aktualisiert Model → Model benachrichtigt Controller über Änderungen → Controller aktualisiert View. In der klassischen Implementierung verwendet Model das Observer-Muster: Wenn sich Daten ändern, sendet Model Benachrichtigungen, Controller abonniert und aktualisiert View. In Apples Implementierung übernehmen Key-Value Observing (KVO) oder NotificationCenter diese Rolle.

KomponenteVerantwortungBeispiel in iOSBeispiel in Android
ModelDaten, Geschäftslogik, NetzwerkStruct User, CoreDataData class, Repository
ViewUI-AnzeigeStoryboard, XIB, UIViewXML layout, Jetpack Compose
ControllerEingabeverarbeitung, KoordinationUIViewControllerActivity, Fragment

MVC in der modernen mobilen Entwicklung wird weniger genutzt als vor 10 Jahren, bleibt aber zum Verständnis essenziell. Apple empfiehlt MVC für einfache Bildschirme in UIKit-Anwendungen. Google empfiehlt reines MVC nicht für Android — die offizielle Dokumentation schlägt MVVM mit Jetpack vor. Dennoch sind MVC-Kenntnisse für die Arbeit mit Legacy-Projekten und zum Verständnis der Evolution von Architekturmustern erforderlich.

MVC in iOS: UIViewController und Storyboard

Apple MVC ist eine benutzerdefinierte Implementierung des Patterns, die in UIKit integriert ist. UIViewController fungiert als Controller: verwaltet den Bildschirmlebenszyklus (viewDidLoad, viewWillAppear, viewDidDisappear), behandelt Berührungen und Benutzeraktionen, aktualisiert View über IBOutlets. View wird im Interface Builder (Storyboard oder XIB) oder programmatisch erstellt. Model — beliebige Datenobjekte: Netzwerkdienste, CoreData-Stacks, Swift-Strukturen.

swift
final class UserViewController: UIViewController {
    // View (über Storyboard Outlet)
    @IBOutlet private var nameLabel: UILabel!
    @IBOutlet private var emailLabel: UILabel!

    // Model
    private let userService = UserService()

    override func viewDidLoad() {
        super.viewDidLoad()
        loadUser()
    }

    private func loadUser() {
        userService.fetchUser { [weak self] user in
            // Controller aktualisiert View
            self?.nameLabel.text = user.name
            self?.emailLabel.text = user.email
        }
    }
}

Das Problem von Apple MVC — View und Controller sind stark gekoppelt. UIViewController verwaltet gleichzeitig View und Logik. Storyboard speichert View in XML, aber der Controller hat direkte Referenzen auf UI-Elemente über IBOutlets. Dies verstößt gegen das Prinzip der einzigen Verantwortung: Der Controller ist für Lebenszyklus, Delegaten, Datenquelle, target-action und Animationen verantwortlich. Dadurch enthält ein Standard-iOS-App-Bildschirm 200–500 Zeilen im Controller.

ViewController-Lebenszyklus — Apple bietet 6 Lebenszyklusmethoden: loadView (manuelle View-Erstellung), viewDidLoad (nach dem Laden von View in den Speicher), viewWillAppear (vor dem Erscheinen auf dem Bildschirm), viewDidAppear (nach der Animation), viewWillDisappear (vor dem Verlassen des Bildschirms), viewDidDisappear (nach dem Verlassen). Jede Methode ist ein Ort für Logik in MVC. Die Verwendung dieser Methoden für Geschäftslogik beschleunigt das Wachstum des Controllers.

MVC in Android: Activity, Fragment und XML Layout

Android MVC — Activity und Fragment fungieren als Controller, XML-Layout-Dateien als View, jede POJO-Klasse mit Daten als Model. Activity verwaltet den Bildschirmlebenszyklus: onCreate, onStart, onResume, onPause, onStop, onDestroy. Fragment ist ein Unterbildschirm innerhalb von Activity mit eigenem Lebenszyklus. View (XML) ist von Controller getrennt und wird über setContentView oder LayoutInflater geladen. Model — Repositories, Datenbanken, Netzwerkaufrufe.

kotlin
class UserActivity : AppCompatActivity() {
    // View über XML Layout
    private lateinit var binding: ActivityUserBinding

    // Model
    private val userRepository = UserRepository()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        loadUser()
    }

    private fun loadUser() {
        userRepository.getUser { user ->
            runOnUiThread {
                binding.nameText.text = user.name
                binding.emailText.text = user.email
            }
        }
    }
}

Android ViewBinding und DataBinding — moderne Werkzeuge, die die Kopplung zwischen Controller und View reduzieren. ViewBinding generiert eine Klasse mit direkten Referenzen auf Views aus XML und macht findViewById überflüssig. DataBinding fügt die Möglichkeit hinzu, Daten in XML-Markup über @{user.name} an die UI zu binden. DataBinding ist ein Schritt in Richtung MVVM, da es ermöglicht, Daten von Model zu View ohne Code in Activity zu übergeben. Google empfiehlt DataBinding für alle neuen Projekte.

Android-Lebenszyklus ist komplexer als iOS: Activity kann bei Bildschirmdrehung, Speichermangel oder Konfigurationsänderung zerstört und neu erstellt werden. In reinem MVC enthält der Controller (Activity) Logik, die bei Zerstörung verloren geht. Dies erfordert das Speichern des Zustands über onSaveInstanceState oder ViewModel von Jetpack, was über reines MVC hinausgeht und die Architektur MVVM näher bringt.

Massive View Controller und Einschränkungen von MVC

Massive View Controller ist ein Begriff, der das Hauptproblem von MVC in der mobilen Entwicklung beschreibt. Der Controller in iOS und Android übernimmt zu viele Verantwortlichkeiten: Eingabeverarbeitung, Datenvalidierung, Netzwerkinteraktion, Navigation, Caching, Animationen, Lebenszyklusverwaltung. Dadurch wächst der Controller auf 500–2000 Zeilen Code und wird schwer lesbar, testbar und wartbar.

Ursachen von Massive View Controller — die Architektur von UIKit und Android Framework fördert das Platzieren von Logik im Controller. Netzwerkaufrufe, JSON-Verarbeitung, Navigation — all das landet natürlicherweise in Activity oder UIViewController, weil sie Zugriff auf Lebenszyklus und UI haben. Der Entwickler muss bewusst Logik in separate Klassen (Service, Manager, Interactor) auslagern, was Disziplin und Verständnis von Architekturprinzipien erfordert.

MVC-ProblemBeschreibungLösung
Starke KopplungController kennt View und ModelMVVM — ViewModel kennt View nicht
TestkomplexitätController hängt von UIKit/Android abLogik in Dienste auslagern
LebenszyklusZustand geht bei Drehung verlorenViewModel von Jetpack/SwiftUI
Fehlende NavigationController verwaltet ÜbergängeCoordinator-Muster, Router

MVC testen — Model wird isoliert mit Unit-Tests getestet. Controller ist aufgrund der Abhängigkeit von UIKit/UIFoundation schwer zu testen. XCTest erlaubt nicht, UIViewController ohne ein View-Fenster zu erstellen. Für Android lösen ActivityTestRule und Robolectric das Problem teilweise, aber die Tests sind langsam. View wird normalerweise nicht mit Unit-Tests getestet — für UI werden Screenshot- und UI-Tests (XCUITest, Espresso) verwendet.

Wann MVC gerechtfertigt ist — einfache Bildschirme mit ein oder zwei Elementen (Login-Bildschirm, Profil, Einstellungen). Prototypen und MVP zur Hypothesenvalidierung — MVC ist ohne zusätzliche Schichten schneller zu schreiben. Projekte mit kleiner Codebasis von bis zu 10–15 Bildschirmen. In komplexen Projekten führt MVC zur Anhäufung technischer Schulden und erfordert alle 6–12 Monate eine Refaktorisierung.

Vergleich von MVC mit MVVM, MVP und Clean Architecture

MVC vs MVVM — der Hauptunterschied: in MVVM wird der Controller durch ViewModel ersetzt, das keine Referenz auf View hat. Daten werden über Observable (SwiftUI), LiveData/StateFlow (Android) oder Combine/RxSwift übergeben. ViewModel ist mit Unit-Tests ohne UI-Abhängigkeiten testbar. Apple empfiehlt MVVM mit SwiftUI seit 2019, Google — MVVM mit LiveData/Flow als offizielle Android-Architektur. MVVM erfordert mehr Code für die Bindung, verbessert aber die Testbarkeit erheblich.

MVC vs MVP — in MVP (Model-View-Presenter) ist Presenter eine testbare Schicht, die View über eine Schnittstelle erhält. Im Gegensatz zu MVC, wo Controller View direkt über UIKit verwaltet, ist Presenter nicht vom Framework abhängig — er arbeitet über die ViewInterface-Abstraktion. MVP war in der Android-Entwicklung vor Jetpack beliebt und wird in Legacy-Projekten verwendet. Presenter überlebt Activity und bewahrt den Zustand bei Bildschirmdrehung.

MVC vs Clean Architecture — Clean Architecture fügt Schichten hinzu: Use Cases (Interactors), Entities, Gateways und Repository. MVC bleibt in der Presentation-Schicht, aber die Geschäftslogik wird mit Use Cases in die Domain-Schicht verschoben. Clean Architecture löst das Massive-View-Controller-Problem radikal — der Controller enthält nur Use-Case-Aufrufe und View-Updates. Der Nachteil ist eine deutliche Zunahme der Klassen- und Dateianzahl, was bei Projekten mit 50+ Bildschirmen gerechtfertigt ist.

swift
// MVC in iOS: Controller enthält alles
class OrderViewController: UIViewController {
    func placeOrder() {
        // Validierung + Netzwerk + UI-Aktualisierung
        guard Validation.isValid(total) else { return }
        NetworkService.shared.submit(order) { [weak self] result in
            self?.handleResult(result)
        }
    }
}

// MVVM: Logik in ViewModel
class OrderViewModel: ObservableObject {
    @Published var state: OrderState = .idle
    func placeOrder() { /* Geschäftslogik */ }
}

Architekturwahl hängt von Teamgröße, Projektumfang und erforderlicher Testbarkeit ab. Für ein Team von 1–2 Entwicklern und ein Projekt mit bis zu 20 Bildschirmen eignet sich MVVM gut. Für ein großes Team von 5+ Entwicklern und ein Projekt mit 50+ Bildschirmen — Clean Architecture mit modularer Struktur. MVC bleibt relevant zum Verständnis der Architekturevolution, zur Wartung von Legacy-Projekten und für einfache UIKit-Bildschirme ohne komplexe Geschäftslogik.

Häufig gestellte Fragen

Was ist das Hauptproblem von MVC in der mobilen Entwicklung?

Das Hauptproblem ist der Massive View Controller. In iOS übernimmt UIViewController alles: Eingabeverarbeitung, View-Updates, Netzwerk, Navigation und Lebenszyklus. In Android übernimmt Activity/Fragment ähnliche Funktionen. Dadurch wächst der Controller auf Tausende von Codezeilen, wird schwer zu testen und zu warten und verletzt das Prinzip der einzigen Verantwortung.

Wie unterscheidet sich MVC von MVVM?

In MVC aktualisiert der Controller direkt View und verarbeitet Benutzereingaben. In MVVM wird die Controller-Rolle von ViewModel übernommen, das keine Referenz auf View hat — Daten werden durch Bindungsmechanismen übergeben. MVVM ist einfacher zu testen, da ViewModel nicht von UIKit oder Android Framework abhängt. Apple empfiehlt MVVM mit SwiftUI, Google empfiehlt MVVM mit Jetpack Compose.

Kann MVC in modernen Projekten verwendet werden?

Ja, MVC bleibt ein funktionierendes Muster für einfache Bildschirme und Prototypen. Apple empfiehlt MVC für UIKit-Anwendungen mit einfachen Bildschirmen. Für komplexe Projekte mit vielen Bildschirmen, Netzwerkanfragen und Caching ist es besser, MVVM, VIPER oder Clean Architecture zu wählen. Anfängern wird empfohlen, MVC zu beherrschen, bevor sie komplexere Muster lernen.

Wie testet man eine MVC-Anwendung?

Model wird isoliert getestet — das sind normale Datenobjekte und Geschäftslogik. Controller ist aufgrund der Abhängigkeit von UIKit oder Android Framework schwer zu testen. Es wird empfohlen, die Geschäftslogik aus dem Controller in separate Dienste oder Interactors auszulagern, die mit Unit-Tests getestet werden. View wird normalerweise nicht mit Unit-Tests getestet — dafür werden UI-Tests und Screenshot-Tests verwendet.

Welches Muster nach MVC wählen?

Auf iOS — MVVM mit SwiftUI und Combine, Apples Standard seit 2019. Auf Android — MVVM mit LiveData oder StateFlow, offiziell von Google empfohlen. Für große Projekte mit Teams von 5+ Entwicklern — Clean Architecture mit VIPER auf iOS oder Clean Architecture auf Android mit feature-basierter Modultrennung. Für Legacy-Projekte mit MVC — schrittweise Refaktorisierung mit Auslagerung der Logik in separate Dienste.

Zusammenfassung

  • MVC — Architekturmuster mit Trennung in Model, View und Controller
  • iOS MVC — UIViewController + Storyboard + Datendienste
  • Android MVC — Activity/Fragment + XML Layout + Repositories
  • Massive View Controller — Hauptproblem durch Vermischung von Verantwortlichkeiten
  • Testen — Model ist einfach zu testen, Controller erfordert Logikauslagerung
  • Evolution — MVC → MVVM → Clean Architecture für wachsende Projekte
  • Kompatibilität — Muster können im selben Projekt kombiniert werden

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch