Blog

Blog

Neues aus unserem Blog

Modellbasierte Entwicklung mit Xtext

Haiko Strotbek Donnerstag, 07. Januar 2016 @ 09:16 geschrieben von Haiko Strotbek

Anwendungen sollen sich konsistent verhalten und auch Querschnittsthemen müssen oft in späteren Releases adressiert werden. Dies steht klassisch im Konflikt zum wachsenden Umfang der fachlichen Logik. Eine Möglichkeit, dies zu adressieren, ist die modellbasierte Entwicklung. Mit Xtext ist der dafür vorzusehende Aufwand deutlich geringer, als man erwartet.

Umfangreiche Datenmodelle führen zu einer umfangreichen Code-Basis: Die Entitäten selbst müssen definiert, DAOs für den Zugriff müssen implementiert werden – und für eine strikte Schichtentrennung will man oft auch Datentransferobjekte zur Kommunikation mit der UI. Der Anteil an fachlicher Logik ist in diesen Teilen naturgemäß gering. Stattdessen findet man Unmengen an Attributdefinitionen, Gettern, Settern und weiteren gleichartigen Code-Konstrukten, sogenanntem Boilerplate-Code.

Neben dem Schreibaufwand und dem dadurch verbundenen Fehlerpotential birgt dieser Code auch ein Wartungsrisiko: Querschnittliche Belange, wie Optimierungen und Technologie-Änderungen, lassen sich nur mit großen Aufwand umsetzen.

Weniger Boilerplate-Code, mehr Konsistenz

Mit einer Domain Specific Language (DSL) werden diese Themen adressiert: Eine eigene Sprache ermöglicht es, Domänenobjekte kompakt und aussagekräftig zu beschreiben. Idealerweise abstrahiert die Sprache vollständig von der eingesetzten Technologie und ermöglicht eine rein fachliche Modellierung. Die technischen Aspekte und Abbildungen ergänzt der Code-Generator zu diesen fachlichen Informationen.

 

Definition einer Regel mit Xtext

 

Die Definition der Sprache geht relativ leicht von der Hand: In (E)BNF-ähnlicher Notation werden die Regeln der Sprache definiert. Anhand dieser Regeln wird ein Parser und ein (EMF-)Objektmodell generiert. Ersteres spart einige Arbeit, wie man sie eventuell von XML-basierten Generierungslösungen kennt. Letzteres ist die Basis weiterer Verarbeitungsschritte wie Validierung, Einschränken von Gültigkeitsbereichen und natürlich der Generierung des Zielcodes. Damit eignet sich dieser Ansatz nicht nur für statische POJOs, sondern auch für die Abbildungslogik zwischen Entitäten und Datentransferobjekten und auch Datenbankabfragen.

 

Eine Entitätendefinition anhand obiger Regel

 

Ein Vorteil der "Technologie-Kapselung": Nicht alle Entwickler müssen detaillierte Kenntnisse über die eingesetzte Technologie haben. Da der Code-Generator das Know-How in sich trägt - und das Know-How so auch dokumentiert ist - ist es allen Mitgliedern des Teams möglich, die verschiedenen Teile der Funktionalitäten umzusetzen.

Optimale Einbettung in das Tooling

Um Medienbrüche bei der Programmierung zu vermeiden, muss die Code-Generierung in der Entwicklungsumgebung integriert sein. Xtext erzeugt beim Modellieren in der IDE automatisch die passenden Code-Artefakte. Syntax-Highlighting und Code-Completion minimieren den notwendigen Know-How-Transfer, um Entwickler mit der Modellierung vertraut zu machen.

Auch umfangreiche Sprachen können nicht die komplette Fachlichkeit abdecken. So besteht die Notwendigkeit, manuellen Code, z.B. für Datenvalidierungen, zu integrieren. Die Trennung des generierten Codes von manuellem Code wird durch den Einsatz von Vererbung erreicht: Der zu generierende Code wird in abstrakte Basisklassen generiert, während die Ableitungen manuellen Code enthalten können und vom Generator nicht überschrieben werden. Gegenüber dem konkurrierenden Ansatz "Protected Regions", bei dem Teile einer Datei durch den Generator überschrieben werden, ist dieser Ansatz robuster gegenüber invalider Änderungen. Offensichtlicher Nachteil ist, dass man sich an dieses Schema zunächst gewöhnen muss - was normalerweise innerhalb einer einzigen Klasse definiert wird, wird nun auf zwei aufgeteilt.

Ein weiterer nützlicher Aspekt ist auch, dass die Modelle parallel in eine grafische Darstellung, bspw. in PlantUML, übersetzt werden können. So lassen sich Datenmodelle oder Schnittstellen eines Moduls auch nachträglich leicht dokumentieren und sind garantiert konsistent zum Code.

 

Visualisierung des Modells mit Hilfe von PlantUML

 

Fazit

Der Einsatz einer DSL auf Basis von Xtext hält, was es verspricht: Boilerplate-Code wird weitgehend vermieden und querschnittliche Änderungen sind durch Anpassung des Code-Generators umsetzbar. Schleichen sich bei manuellem Schreiben (bzw. Copy & Paste) schnell Flüchtigkeitsfehler ein, ist diese Fehlerquelle beim Generieren ausgeschlossen.


zur Übersicht

Willkommen auf dem avono Blog

Hier auf dem avono Blog finden Sie in regelmäßigen Abständen sowohl technische Neuigkeiten aus unserer Partnerproduktwelt als auch nützliche Entwicklertipps.
Und jetzt kommt der obligatorische Disclaimer: Die Ausführungen der Blogeinträge spiegeln nicht die Meinung der avono AG sondern nur die Sicht der einzelnen Autoren wider.

Weitere Blogeinträge