21. Mai 2019 Börse Dresden

japkit - Eine Chance für Codegenerierung in agilen Java-Projekten?

Trotz willkommener Weiterentwicklung von Frameworks und Sprache (Java 8) sind wir als Java-Entwickler in unserem Projektalltag nicht selten damit beschäftigt, auf sehr mechanische Weise immer wieder ähnliche Codefragmente zu erzeugen, oft nach dem Schema "Copy, Paste and Change".
Bei Anwendung von Domain Driven Design gibt es z.B. Value Objects und ihre Builder, bei deren Entwicklung allerlei Zeremonie einzuhalten ist (siehe u.a. "Effective Java" von J. Bloch). Command- und Event-Objekte sind weitere Exemplare, bei denen mechanische Programmiertätigkeiten gefragt sind.
Andere Programmiersprachen wie Scala bieten Sprachfeatures, die solche sich wiederholenden Codemuster in bestimmten Fällen vermeiden helfen (z.B. Case Classes für Value Objects). Ein Wechsel der Programmiersprache kommt jedoch meist nicht infrage.
Eine andere Lösungsmöglichkeit ist der Einsatz von Codegenerierung. Eine Recherche zu diesem Thema bringt schnell viele Ansätze mit dem Präfix "modellgetrieben" zu Tage, die vor einigen Jahren noch als heiliger Gral der Softwareentwicklung galten. Diese sind jedoch selbst in ihren praxisnäheren Varianten in der Regel viel zu weit weg von unserem agilen Projektalltag: Der Source Code ist für uns die einzige Quelle der Wahrheit und niemand will einen "Modellierungsexperten" als Bottleneck in seinem SCRUM-Team installieren. Themen wie Versionierung oder Refactoring, die für Code gut verstanden und gelöst sind, werfen bei Koexistenz von Modell und Code wieder komplett neue Fragen auf.
Abhilfe schafft der Ansatz, dass Java Code selbst als Modell für die Codegenerierung verwendet wird. Dafür wird er mit Annotationen angereichert. Neu ist das nicht, verschiedene Open Source Projekte setzen auf ein derartiges Vorgehen - meist basierend auf Annotation Processing. Beispiele sind Googles FreeBuilder für Value Objects und Builder, MapStruct für Bean-Mapping oder Spring Roo für komplette Spring-Applikationen. Auch der JPA Static Metamodel Generator und der JAX-WS Annotation Processor basieren auf diesem Prinzip.
Die Verwendung von vorgefertigten Generatoren geht so lange gut, bis man spezifische Anforderungen an den generierten Code hat. Dieser Punkt ist meist schnell erreicht, da jedes Projekt "anders" ist. Zunächst geht man im Projekt dann Kompromisse ein, bald wird die Verwendung des Generators generell infrage gestellt und der Code wird wieder manuell geschrieben.
Was tun? Die Entwicklung eigener projektspezifischer Codegeneratoren bzw. Annotation Processors und deren Wartung erscheint viel zu aufwändig. FreeBuilder hat z. B. über 50.000 Lines of Code! Was wäre, wenn wir einen Generator mit ähnlichem Funktionsumfang in weniger als 500 LoC bauen könnten? Hätte dann nicht Codegenerierung in agilen Java-Projekten eine echte Chance?
In der Session soll anhand von https://github.com/stefanocke/japkit gezeigt werden, dass dies möglich ist und dass über Value Objects hinaus auch weitaus komplexere Generatoren mit moderatem Aufwand entwickelt werden können.

Wollen Sie Sponsoringpartner werden? Schauen Sie sich unsere Sponsoring Optionen an.

Jetzt Sponsor werden