UI sollte nicht über Validierung nachdenken
27. Februar 20264 Min. LesezeitAktualisiert 27. Februar 2026
Kürzlich habe ich daran gearbeitet, den Präsentations-Layer vom UI-Layer zu abstrahieren. Im Idealfall sollte der UI-Layer in Bezug auf jegliche Nicht-UI-Logik so "dumm" wie möglich sein. Allerdings leidet der Präsentations-Layer oft unter einem grundlegenden Architekturfehler: Er versucht zu entscheiden, was die UI tun soll.
Dies geschieht entweder direkt (durch Übergabe eines bestimmten Fehler-
Strings zur Anzeige) oder indirekt (durch Übergabe eines Int-Identifiers für eine String-Ressource). Letzteres erzeugt ein falsches Gefühl der Entkopplung (Decoupling) – der Präsentations-Layer diktiert immer noch die genaue Bildschirmausgabe.Dieser Ansatz bricht das Prinzip der Separation of Concerns (SoC). Die Lösung besteht darin, genügend Kontextinformationen bereitzustellen, damit die UI selbst entscheiden kann, wie der Fehler angezeigt werden soll, ohne Präsentations- oder Domänenlogik preiszugeben.
Mein spezifisches Problemgebiet war die Validierung von Formulareingaben. Ich musste UI-Formatierungsfehler (z. B. Längenbeschränkungen) anzeigen und gleichzeitig die Eingabevalidierung streng von den Domänen-Invarianten getrennt halten – eine Unterscheidung, die viele Entwickler übersehen.
Die anfängliche Lösung in meinem Kopf war einfach: Warum nicht einfach Enums bereitstellen?
kotlin
Wobei
Input wie folgt aussieht:kotlin
Es sieht sauber aus, aber bei der weiteren Ausarbeitung zeigte sich ein Problem: Wenn ein Enum einfach
TOO_LONG sagt, muss die UI immer noch die Eingabegröße berechnen oder die maximale Länge aus der Domäne abrufen, um eine sinnvolle Fehlermeldung anzuzeigen. Das ist nicht so "dumm", wie ich es gerne hätte.Enums waren nicht die Lösung. Stattdessen bin ich zu sealed Strukturen gewechselt, um Validierungsfehler darzustellen. Diese datenreichen Issues geben der UI genug Kontext, um den Fehler zu rendern, ohne sie zum Nachdenken oder Rechnen zu zwingen:
kotlin
Jetzt erhält die UI jedes Detail, das sie benötigt. Ich habe die "Jagd nach dem Entscheidungskontext" (decision context hunt) im UI-Layer eliminiert, da er die Implementierungsdetails des Präsentations-Layers oder die Domänen-Constraints nicht mehr kennen muss.
Ein weiterer Vorteil dieses Ansatzes ist die Komposition von Validatoren. Ich kann gemeinsame Validatoren (common validators) über verschiedene Screens hinweg verwenden oder sie mit screen-spezifischen benutzerdefinierten Validatoren kombinieren, wenn die Geschäftslogik variiert. Manche mögen argumentieren, dass dies Code-Duplizierung mit sich bringt, aber striktes SoC (sowohl auf Layer-Ebene als auch lokal) ist diesen Kompromiss immer wert. Außerdem denke ich nicht, dass dies in der KI-Ära ein großer Bottleneck ist (aber ehrlich gesagt dauert es auch ohne KI nicht allzu lange).