© Maisei Raman/Shutterstock.com
Entwickler Magazin
Entwurf einer funktionalen Softwarearchitektur

Hearts ist Trumpf!

Der Entwurf von nachhaltigen Softwarearchitekturen ist eine Herausforderung: Mit der Größe steigt in vielen klassisch objektorientierten Softwareprojekten die Komplexität überproportional an. Durch viel Disziplin und regelmäßige Refaktorisierungen lässt sich das Problem eine Weile in Schach halten, aber die wechselseitigen Abhängigkeiten und komplexen Abläufe von Zustandsveränderungen nehmen mit der Zeit trotzdem zu. Die funktionale Softwarearchitektur geht an die Strukturierung großer Systeme anders heran als objektorientierte Ansätze und vermeidet so viele Quellen von Komplexität und Wechselwirkungen im System.

Peter Thiemann, Michael Sperber


Funktionale Softwarearchitektur steht für das Ergebnis eines Softwareentwurfs mit den Mitteln der funktionalen Programmierung. Sie zeichnet sich unter anderem durch folgende Aspekte aus:

An die Stelle des Objekts mit gekapseltem Zustand tritt die Funktion, die auf unveränderlichen Daten arbeitet. Funktionale Sprachen (ob statisch oder dynamisch) erlauben ein von Typen getriebenes, systematisches Design von Datenmodellen und Funktionen. Statt starrer hierarchischer Strukturen entstehen flexible, in die funktionale Programmiersprache eingebettete domänenspezifische Sprachen.

Wir konzentrieren uns in diesem Artikel auf den ersten Punkt, also den Umgang mit Funktionen und unveränderlichen Daten. Dabei werden wir auch die Rolle von Typen beleuchten. Der Code zu diesem Artikel findet sich auf GitHub [1].

Funktionale Programmiersprachen

Funktionale Softwarearchitektur ist in (fast) jeder Programmiersprache möglich, aber in einer funktionalen Sprache wie Haskell, OCaml, Clojure, Scala, Elixir, Erlang, F# oder Swift ist diese Herangehensweise besonders natürlich. Funktionale Softwarearchitektur wird in der Regel als Code ausgedrückt, also nicht in Form von Diagrammen. Entsprechend benutzen wir für die Beispiele in diesem Artikel die funktionale Sprache Haskell [2], die besonders kurze und elegante Programme ermöglicht. Keine Sorge: Wir erläutern den Code, sodass er auch ohne Vorkenntnisse in Haskell lesbar ist. Wer dadurch auf Haskell neugierig geworden ist, kann sich eine Einführung in funktionale Programmierung [3], ein Buch zu Haskell [4] oder einen Onlinekurs [5] zu Gemüte führen.

Überblick

Wir erklären den Entwurf einer funktionalen Softwarearchitektur anhand des Kartenspiel Hearts [6], von dem wir nur die wichtigsten Teile umsetzen.

Hearts wird zu viert gespielt. In jeder Runde eröffnet eine Spielerin, indem sie eine Karte ausspielt (zu Beginn des Spiels muss das die Kreuz-Zwei sein.) Die nächste Spielerin muss, wenn möglich, eine Karte mit der gleichen Farbe wie die Eröffnungskarte ausspielen. Andernfalls darf sie eine beliebige Karte abwerfen. Haben alle Spielerinnen eine Karte ausgespielt, muss die Spielerin den Stich einziehen, deren Karte die gleiche Farbe wie die Eröffnungskarte sowie den höchsten Wert hat. Ziel ist, mit den eingezogenen Karten einen möglichst geringen Punktestand zu erreichen. Dabei zählt die Pik-Dame 13 Punkte und jede Herzkarte einen Punkt, alle weiteren Karten null Punkte.

Abb. 1: Spielablauf durch Commands und Events

Modellierung des Sp...

Entwickler Magazin
Entwurf einer funktionalen Softwarearchitektur

Hearts ist Trumpf!

Der Entwurf von nachhaltigen Softwarearchitekturen ist eine Herausforderung: Mit der Größe steigt in vielen klassisch objektorientierten Softwareprojekten die Komplexität überproportional an. Durch viel Disziplin und regelmäßige Refaktorisierungen lässt sich das Problem eine Weile in Schach halten, aber die wechselseitigen Abhängigkeiten und komplexen Abläufe von Zustandsveränderungen nehmen mit der Zeit trotzdem zu. Die funktionale Softwarearchitektur geht an die Strukturierung großer Systeme anders heran als objektorientierte Ansätze und vermeidet so viele Quellen von Komplexität und Wechselwirkungen im System.

Peter Thiemann, Michael Sperber


Funktionale Softwarearchitektur steht für das Ergebnis eines Softwareentwurfs mit den Mitteln der funktionalen Programmierung. Sie zeichnet sich unter anderem durch folgende Aspekte aus:

An die Stelle des Objekts mit gekapseltem Zustand tritt die Funktion, die auf unveränderlichen Daten arbeitet. Funktionale Sprachen (ob statisch oder dynamisch) erlauben ein von Typen getriebenes, systematisches Design von Datenmodellen und Funktionen. Statt starrer hierarchischer Strukturen entstehen flexible, in die funktionale Programmiersprache eingebettete domänenspezifische Sprachen.

Wir konzentrieren uns in diesem Artikel auf den ersten Punkt, also den Umgang mit Funktionen und unveränderlichen Daten. Dabei werden wir auch die Rolle von Typen beleuchten. Der Code zu diesem Artikel findet sich auf GitHub [1].

Funktionale Programmiersprachen

Funktionale Softwarearchitektur ist in (fast) jeder Programmiersprache möglich, aber in einer funktionalen Sprache wie Haskell, OCaml, Clojure, Scala, Elixir, Erlang, F# oder Swift ist diese Herangehensweise besonders natürlich. Funktionale Softwarearchitektur wird in der Regel als Code ausgedrückt, also nicht in Form von Diagrammen. Entsprechend benutzen wir für die Beispiele in diesem Artikel die funktionale Sprache Haskell [2], die besonders kurze und elegante Programme ermöglicht. Keine Sorge: Wir erläutern den Code, sodass er auch ohne Vorkenntnisse in Haskell lesbar ist. Wer dadurch auf Haskell neugierig geworden ist, kann sich eine Einführung in funktionale Programmierung [3], ein Buch zu Haskell [4] oder einen Onlinekurs [5] zu Gemüte führen.

Überblick

Wir erklären den Entwurf einer funktionalen Softwarearchitektur anhand des Kartenspiel Hearts [6], von dem wir nur die wichtigsten Teile umsetzen.

Hearts wird zu viert gespielt. In jeder Runde eröffnet eine Spielerin, indem sie eine Karte ausspielt (zu Beginn des Spiels muss das die Kreuz-Zwei sein.) Die nächste Spielerin muss, wenn möglich, eine Karte mit der gleichen Farbe wie die Eröffnungskarte ausspielen. Andernfalls darf sie eine beliebige Karte abwerfen. Haben alle Spielerinnen eine Karte ausgespielt, muss die Spielerin den Stich einziehen, deren Karte die gleiche Farbe wie die Eröffnungskarte sowie den höchsten Wert hat. Ziel ist, mit den eingezogenen Karten einen möglichst geringen Punktestand zu erreichen. Dabei zählt die Pik-Dame 13 Punkte und jede Herzkarte einen Punkt, alle weiteren Karten null Punkte.

Abb. 1: Spielablauf durch Commands und Events

Modellierung des Sp...

Neugierig geworden?


   
Loading...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang