Interview mit Andre Steingress

GContracts: Vertraglich korrektes Programmieren

GContracts ist eine in Java implementierte Bibliothek für die Erweiterung der Groovy-Programmiersprache um die Programmiertechnik „Design by Contract“ (DbC). Wir sprachen mit Projektentwickler Andre Steingress über die Vorteile von DbC, die Funktionsweise von GContracts und die neue Version 1.2.9.

Lesetipp

Interesse an GContracts und dem Prinzip des „Design by Contract“? Dann empfehlen wir den Artikel „Design by Contract mit Groovy„, in dem Andre Steingress die Funktionsweise von DbC und GContracts ausführlich vorstellt.

JAXenter: Was ist GContracts?

Andre Steingress: Bei GContracts handelt es sich um eine Bibliothek, die die Programmiersprache Groovy um das Konzept von „Design by Contract“ (DbC) erweitert.

Bei DbC können APIs mit Metainformationen ausgestattet werden, die den Vertrag zwischen Methoden und Klassen gegenüber Verwendern in Form boolscher Ausdrücke direkt im Code angeben.

JAXenter: Wie funktioniert die Arbeit mit GContracts?

Andre Steingress: GContracts stellt im Grunde drei Annotationen bereit: @Requires, @Ensures und @Invariant. Diese können für die Angabe von Vorbedingungen,
Nachbedingungen von Methoden und Klasseninvarianten benutzt werden.

Jede der drei Annotationen erwartet als einzigen Parameter eine
Closure. Innerhalb der Closure kann auf alle im aktuellen Kontext
verfügbaren Variablen zugegriffen werden.

So erwartet beispielsweise die Methode pop() der Klasse Stack, dass der Stack nicht bereits leer ist – es handelt sich dabei um eine Vorbedingung:

@Requires({ !isEmpty() })
def pop() { ... }

Die angegebenen Verträge werden zur Laufzeit auch evaluiert. Ist die Vorbedingung unserer pop()-Methode zur Laufzeit nicht erfüllt, wird ein PreconditionViolationError geworfen und somit eine fehlerhafte Benutzung des API aufgedeckt.

GContracts bindet die angegebenen API-Verträge während der
Kompilierung in den generierten JVM-Bytecode ein. Falls gewünscht, kann
die Überprüfung über VM-Parameter für einzelne Klassen, Packages oder
komplett deaktiviert werden.

JAXenter: Wie ist das Projekt entstanden?

Andre Steingress: Ich bin bereits länger begeisterter Verfechter von DbC. Als ich vermehrt in Groovy- und Grails-Projekten aktiv war, kam mir der Einfall,
über AST-Transformationen DbC abzubilden.

JAXenter: Aktuell erschienen ist Version 1.2.9. Was hat sich hier getan?

Andre Steingress: 1.2.9 stellt vor allem die Kompatibilität mit Groovy 2.0 her. Maßgebliches Feature von 2.0 ist die optionale Typüberprüfung und
statische Kompilierung. GContracts kann nun auch in statisch
typisiertem Groovy-Code, dessen Bytecode im Übrigen jenem von Java
basiertem Code entspricht, eingesetzt werden. Hierfür waren einige
Änderungen an den internen AST-Transformationen notwendig.

Des weiteren beinhaltet 1.2.9 Bugfixes und bietet ein besseres Zusammenspiel
mit Standard Groovy-AST-Transformationen wie bspw. @TupleConstructor.

JAXenter: Und was steht in den nächsten Versionen von GContracts an?

Andre Steingress: Die Bibliothek wird um neue Annotationen erweitert, und es wird in der kommenden Version auch in Richtung Ausführungsoptimierung von
Verträgen gehen.

JAXenter: Vielen Dank für dieses Interview!

Andre Steingress ist freiberuflicher Entwickler und beschäftigt sich in seinen Projekten mit domänengetriebener Entwicklung von Enterpriseanwendungen im JEE-Umfeld. Er ist Projektleiter von GContracts und beschäftigt sich in seinem Blog (blog.andresteingress.com) ausschließlich mit Thematiken rund um Groovy und Grails.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.