Funktionale Architektur ist besser
Wittgenstein schrieb: „Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt.“
Moritz Nähr, Public domain, via Wikimedia Commons
Und funktionale Architektur funktioniert am besten mit funktionalen Programmiersprachen.
Funktionale Softwarearchitektur („FUNAR“) ist eins der fortgeschrittensten Curricula im iSAQB-Advanced-Kanon. Es geht um die besonderen Strukturierungs- und Modellierungstechniken der funktionalen Programmierung. Diese unterscheiden sich erheblich von den konventionellen Techniken aus der objektorientierten Architektur und führen zu deutlichen Verbesserungen bei wichtigen Architektureigenschaften: Kopplung und Komplexität sind geringer, die Modelle sind geschmeidiger und es ist einfacher, Korrektheit sicherzustellen.
Wie macht die funktionale Architektur das? Die drei wichtigsten Faktoren dafür sind:
- unveränderliche Daten
- mächtige Abstraktionen
- Algebra
Was bedeutet das im Einzelnen?
Unveränderliche Daten bedeutet, dass Objekte nach der Erzeugung nicht noch einmal verändert werden. Es gibt keine „Setter-Methoden“. Das klingt erst einmal nach einer schwerwiegenden Einschränkung gegenüber OO, weniger wie ein Feature: Die objektorientierten Programmierung hat die Veränderung von Objekten schließlich geradezu als Grundlage – und wie will man denn so Zustand modellieren?
Tatsächlich ist das ganz einfach: Wenn in einer funktionalen Architektur eine Zustandsänderung eintritt, wird nicht das „alte“ Zustandsobjekt verändert, sondern einfach ein neues erzeugt. Das alte bleibt, wie es ist – sozusagen als Erinnerung an die Vergangenheit. Objekte, die Zustand repräsentieren, sind in der funktionalen Programmierung also eine Art „Schnappschuss“.
Dass keine Objekte „in situ“ verändert werden, hat viele konkrete Vorteile:
- Die Ausgabe einer Funktion wird nur durch ihre Eingaben bestimmt: Das macht es leichter, ihr Verhalten zu beschreiben und verstärkt die Aussagekraft von Typsignaturen.
- Solche Funktionen sind viel leichter zu testen als Methoden, die Zustand ändern und womöglich „Setup“ und „Teardown“ benötigen.
- Implizite Abhängigkeiten durch globalen Zustand werden reduziert, was zur Reduktion von Kopplung um eine Größenordnung führt.
- Funktionen in der Software entsprechen den Funktionen in der Mathematik und sind damit mathematischen Schlussweisen zugänglich – dazu später noch mehr.
- In nebenläufigen Programmen muss der Zugriff auf Objekte nicht aufwendig koordiniert werden.
Wer das erstmal nicht intuitiv findet, ist schnell positiv überrascht, wie einfach das ist und wie viel mehr das der menschlichen Wahrnehmung entspricht, Schnappschüsse anzufertigen als durch Setter-Methoden die Vergangenheit zu zerstören.
(OO-Experten werden einwenden, dass auch dort bekannt ist, dass „value objects“ – unveränderliche Objekte – eine gute Idee seien. Eben!)
Mächtige Abstraktionen bedeutet, dass funktionale Programmierung höherstehende Abstraktionen erlaubt als in OO. Manche dieser Abstraktionen haben ihren Weg schon in OO-Sprachen geschafft, wie zum Beispiel die map
-Funktion auf Collections. Die sind aber nur die Spitze eines Eisbergs vielerlei Libraries mit abstrakten, aber nützlichen Ideen. Und obwohl OO-Sprachen so mache funktionale Features dazugewonnen haben („Lambda“), sind diese doch in der Verwendung gegenüber echten FP-Sprachen eingeschränkt oder umständlich, was dann auch solche Abstraktionen weniger nützlich macht.
Überhaupt wird in der funktionalen Architektur mehr abstrahiert, auch und gerade, wenn es um die Modellierung konkreter Domänen geht. Da funktionale Sprachen uniformer aufgebaut sind als ihre OO-Pendants, ist Abstraktion in funktionaler Architektur systematischer und geht nur selten schief.
Diese „systematische Abstraktion“ wird zusätzlich unterstützt durch die Zugänglichkeit mathematischer Konzepte, speziell aus der Algebra: Viele Domänenmodelle weisen Eigenschaften auf, die in der Algebra schon seit Jahrhunderten katalogisiert und untersucht sind. (Mancher scheut den Einsatz von Mathematik bei der Software-Entwicklung. Das ist einigermaßen schade, war es doch das Werkzeug der Menschheit zur formalen Modellierung unserer Umwelt, bevor es Computer gab, mit entsprechend viel Erfahrung und zahlreichen Erkenntnissen.) So liefern algebraische Konzepte wie „Monoid“ oder „Funktor“ häufig neue Domäneneinsichten. Die Grenze zu regelrechten domänenspezifischen Sprachen ist fließend.
Noch ein weiterer wesentlicher Unterschied: Funktionale Architektur ist Code; für ihre Konstruktion ist keine weitere Zwischennotation notwendig. Auch dies wird durch die verbesserte Ausdruckskraft funktionaler Sprachen ermöglicht, welche die „Vogelperspektive“ der Architektur direkt sichtbar macht.
Man merkt schon, das ist eine ganz andere Welt, und ziemlich anspruchsvoll für eine dreitägige Schulung. Man sollte (neben Neugier) deshalb schon Vorkenntnisse in funktionaler Programmierung mitbringen. Aber keine Sorge, offene FUNAR-Schulungen stellen meist einen eintägigen Schnell-Vorkurs zur Verfügung, der diese herstellt. Wer sich der Herausforderung stellt, kommt mit vielen Erkenntnissen zurück, von denen einige auch in der objektorientierten Architektur nützlich sind – zum Beispiel die Modellierung mit sogenannten combinators. Auch eine Brücke zum Domain-Driven Design wird geschlagen, was mit funktionaler Programmierung noch besser funktioniert als mit OO.
Als Belohnung gibt es 10 Credit Points im Kompetenzbereich Methodik und 20 Credit Points im Kompetenzbereich Technik. Wir freuen uns auf Sie!
Teilen Sie diesen Artikel:
Zum Thema passende Artikel
Über die Autor:innen