Strukturmuster

Facade

Ein Subsystem besteht aus einem Dutzend Klassen, die in einer bestimmten Reihenfolge zusammenspielen. Jeder Aufrufer, der dieses Zusammenspiel kennen muss, ist an alle zwölf gekoppelt. Die Facade bietet stattdessen eine kleine Schnittstelle für den Anwendungsfall und hält die Innereien innen.

Struktur

Die Facade kennt die Teile, die Teile kennen die Facade nicht. Sie fügt keine Fachlogik hinzu, sie ordnet nur den Ablauf.

final class Rechnungsversand
{
    public function __construct(
        private readonly RechnungRenderer $renderer,
        private readonly PdfArchiv $archiv,
        private readonly Mailer $mailer,
    ) {}

    public function versenden(Rechnung $rechnung): void
    {
        $pdf = $this->renderer->rendern($rechnung);
        $this->archiv->ablegen($rechnung->nummer(), $pdf);
        $this->mailer->senden($rechnung->empfaenger(), $pdf);
    }
}

Die Abgrenzung zum Adapter: Der Adapter übersetzt eine fremde Schnittstelle in eine erwartete. Die Facade vereinfacht den Zugriff auf viele eigene Teile. Beides sind Grenzen, aber mit unterschiedlichem Zweck.

Praxisnotiz

Als Modulgrenze ist die Facade eines der wirksamsten Mittel, die ich kenne — vor allem in Systemen, die noch keine sauberen Schnitte haben. Man kann sie nachträglich vor ein gewachsenes Subsystem setzen, ohne es anzufassen, und ab diesem Moment über eine definierte Naht reden. Umbauten dahinter werden lokal. Das ist oft der erste Schritt, bevor sich überhaupt beurteilen lässt, ob ein Modul herauslösbar ist.

Der wiederkehrende Fehlschlag: Die Facade wächst mit. Was als drei Methoden beginnt, hat nach zwei Jahren vierzig — für jeden Aufrufer eine, teils mit Parametern, die nur ein einziger Aufrufer setzt. Dann ist die Grenze wieder so breit wie das Subsystem selbst, und niemand hat gewonnen. Die Breite der Facade ist die eigentliche Metrik, nicht ihre Existenz.

Zweiter Punkt: Eine Facade darf nicht die einzige Tür sein, wenn sie es nicht sein kann. Wenn Aufrufer weiterhin an den Klassen dahinter vorbeigreifen, ist sie Dekoration. Entweder man setzt die Grenze technisch durch (Sichtbarkeit, Modulgrenze, Paketstruktur) oder man weiß, dass sie nur ein Vorschlag ist.

Wann es nicht passt

  • Wenn das Subsystem klein und verständlich ist. Dann ist die Facade eine Schicht ohne Nutzen.

  • Wenn Fachlogik in sie hineinwandert — dann entsteht die klassische Service-Gottklasse, die alles koordiniert und alles kennt.

  • Wenn die Aufrufer sehr unterschiedliche Ausschnitte brauchen. Mehrere schmale, zweckgebundene Schnittstellen sind dann besser als eine breite.

Alle Design-Patterns