W-JAX 08 - Declarative Services versus Spring Dynamic Modules
Eclipse Magazin 12 - Design by Contract
1. Praxis
ContractJ
Implementierung von DbC mit Java 5 Annotations, AspectJ und Eclipse
Design by Contract
>> heiko seeberger und andreas wagner
dante Codefragmente erzeugt. Eine im-
mer wieder auftauchende Precondition
Sie kennen Design by Contract (DbC)? Dann sind Sie bestimmt zumindest
ist z.B. die oben schon erwähnte Not-
in der Theorie davon überzeugt. Aber setzen Sie DbC in der Praxis ein? Null-Precondition. Diese wird immer
Möglicherweise nicht oder nicht konsequent, da Sie die Umsetzung zu auf dieselbe Weise implementiert, wobei
sich allenfalls die Message der IllegalAr-
mühsam finden. Dieser Artikel beleuchtet einen einfachen Ansatz zur gumentException ändert:
Implementierung von DbC. Beschrieben wird zudem eine Anwendung von
public void findPerson(String name) {
Java 5 Annotations, AspectJ und Eclipse Plug-ins im gemeinsamen Konzert. if (name == null) {
throw new IllegalArgumentException(...) ;
...
C ontractJ ist eine Implementierung von Bertrand Meyer im Rahmen des
von Design by Contract auf Basis Designs der Programmiersprache Eiffel Neben dieser praktischen Betrachtung
von Java 5 Annotationen, AspectJ und eingeführt [1], [2]. hat dieser Ansatz weitere Nachteile. Ers-
Eclipse Plug-ins. Design by Contract Auch Sun orientiert sich in den Hin- tens geht es bei DbC darum, Contracts
ist eine Methodik, in der öffentliche weisen zu den im JDK 1.4 eingeführten auf Basis von APIs zu definieren und
Schnittstellen, d.h. APIs, in Form von Assertions für Java teilweise an DbC. nicht innerhalb der Implementierung.
Contracts klare Vorgaben machen, was So wird z.B. empfohlen, eine IllegalAr- Im obigen Beispiel ist die Precondition
sie erwarten und was sie liefern. Pre- gumentException zu werfen, wenn ein jedoch in der Implementierung „vergra-
conditions definieren die Erwartungs- Argument eines Methodenaufrufes un- ben“. Zweitens lebt DbC von der klaren
haltung und Postconditions beschrei- erlaubterweise null ist [4]. Kommunikation der Contracts: Nur
ben die Liefergarantien. Dazu gibt es Soweit die Theorie. In der Praxis wenn die Nutzer von APIs die Contracts
als unveränderlichen Zustand von stellt sich jedoch schnell heraus, dass die- kennen und verstehen, können sie diese
Objekten noch Invariants. DbC wurde ser Ansatz mühsam ist und stark redun- korrekt anwenden. Daher spielt die Do-
91
www.eclipse-magazin.de eclipse magazin Vol. 12
2. Praxis ContractJ
Abb. 1: Zusam-
menspiel der
wesentlichen
Klassen für die
ContractJ Para-
meter Precondi-
tions
kumentation der Contracts eine wich- werten, wozu die verwendeten Annota- AspectJ ist eine sehr mächtige AOP-Spra-
tige Rolle. Im obigen Beispiel könnte tions jedoch selbst mit @Retention(Ret che für Java. Grundsätzlich erweitert As-
z.B. mittels JavaDoc der Parameter na- entionPolicy.RUNTIME) annotiert sein pectJ den Java-Sprachumfang um einige
me entsprechend dokumentiert werden. müssen, damit sie es bis in die Java Virtu- AOP-Konstrukte, z.B. aspect, pointcut
al Machine „schaffen“. Ausführlichere etc. Seit Version 5 bietet AspectJ, die Ver-
Informationen können der JDK-Doku- wendung von Java 5 vorausgesetzt, auch
/**
* @param name The person’s name. Must not be null! mentation entnommen werden. die Möglichkeit, ohne Spracherweite-
*/
rungen und ausschließlich mit Annota-
AspectJ
public void findPerson(String name) {
tions auszukommen. In diesem Kontext
if (name == null) {
Aspektorientierung ist eine Methodik ist hervorzuheben, dass AspectJ seit Ver-
throw new IllegalArgumentException(...) ;
zur Modularisierung so genannter Cross sion 5 die Möglichkeit bietet, Pointcuts
...
Cutting Concerns. Letztere sind Belange für Methodensignaturen unter Verwen-
eines Systems, die sich nicht im Objekt- dung von Annotations zu definieren.
Allerdings birgt diese Aufspaltung des modell modularisieren lassen, typische Z.B. kann der Aufruf der Methode
Contract in Dokumentation und Imple- Beispiele sind Autorisierung, Transak-
mentierung die Gefahr von Inkonsistenz: tionen, Logging, Exception Handling @Test
public void test() { ... }
Die Dokumentation könnte gänzlich etc. Die Objektorientierung kennt mit
vergessen oder bei Refactorings nicht dem Objektmodell nur eine Ebene der
mit dem folgenden Pointcut adressiert
nachgezogen werden. Modularisierung, sodass zumindest die
werden:
Im Folgenden wird mit ContractJ ein Aufrufe dieser Querschnittsfunktionen
Ansatz vorgestellt, der all die aufgeführ- über die Klassen verteilt sind. Genau hier
pointcut test(): call (call(@Test * *(..)));
ten Nachteile beseitigt, d.h. sowohl ein- greift die Aspektorientierung, indem sie
fach zu implementieren ist, als auch auf Objektorientierung ergänzt und über
die APIs ausgerichtet ist und Dokumen- Aspekte eine Möglichkeit bietet, diese AspectJ ist seit geraumer Zeit ein Eclip-
tation und Implementierung vereinigt. Cross Cutting Concerns zu modularisie- se-Projekt [5] und erfreut sich daher mit
Doch zunächst werden kurz die dazu ren. AJDT [6] einer hervorragenden Integra-
eingesetzten Technologien beleuchtet. Aus der Helikopterperspektive be- tion in die Eclipse-Entwicklungsumge-
steht AOP aus folgenden Bestandteilen: bung [7].
Java 5 Annotations
Eclipse Plug-ins
Mit den in Version 5 eingeführten An- • Advices, die den modularisierten Cross
notations steht ein Sprachmerkmal zur Cutting Concern darstellen, also den Anwendungen auf Basis der Eclipse-Archi-
Verfügung, um Metadaten zu definie- Code, der an bestimmten Stellen mit den tektur bestehen aus Modulen, so genann-
ren und auf Java-Sprachelemente wie Klassen zusammengefügt werden soll, ten Plug-ins. Plug-ins können als Enabler
z.B. Klassen, Methoden oder Parameter • Join Points, welche die möglichen Stel- auftreten und Extension Points definieren,
anzuwenden. Der Nutzen von Annota- len für das Weaving darstellen, welche durch andere Plug-ins (Extender)
tions gegenüber Kommentaren, XML- • Pointcuts, die Mengen von Join Points erweitert werden. Neben deklarativen
Dateien etc. ergibt sich daraus, dass sie selektieren und Informationen können Extension Points
selbst auch Java-Sprachelemente sind. • Weaving, dem Prozess der Zusammen- auch Interfaces oder Klassen enthalten,
Dadurch ist es u.a. möglich, Annotations führung von Advices und „normalen“ welche vom Extender implementiert oder
mittels Reflection zur Laufzeit auszu- Klassen. erweitert werden müssen. Der Enabler
92 eclipse magazin Vol. 12 www.eclipse-magazin.de
3. Praxis
ContractJ
Beste Bücher
für besten Code!
bietet die Erweiterung seines eigenen Ver- • @NotNull
haltens an, indem er alle Extender sucht, • @NotNegative
deren deklarative Informationen nutzt • @Positive
und, falls eine programmatische Erweite-
rung vorgesehen ist, deren Klassen an den Wie sieht es hier mit unseren Anforde-
entsprechenden Stellen ruft. Diese Archi- rungen aus? Einfach ist das bloße Vo-
tektur schafft die Basis für modulare und ranstellen von Annotations allemal, aus-
erweiterbare Anwendungen. drucksstark und selbsterklärend auch,
und durch die Verwendung des Call-
NEU
ContractJ Postconditions JoinPoints wirken die Advices auf Inter-
Wie bringt ContractJ nun diese Techno- faces bzw. Typ, der den Contract mittels
logien zu einer anwenderfreundlichen Annotations deklariert.
DbC-Implementierung zusammen?
ContractJ Preconditions
Rekapitulieren wir kurz die Anforde-
rungen: einfach anzuwenden, an den Was oben für Postconditions geschildert
APIs ausgerichtet und die Dokumentati- wurde, gilt prinzipiell analog für Pre-
on gratis dazu. conditions. Allerdings ist es aktuell mit
Zunächst einmal kommt AspectJ als AspectJ nicht möglich, Pointcuts auf Ba-
„Wunderwaffe“ für Contracts ins Spiel. sis von annotierten Parametern zu defi-
Immer dann, wenn Contracts generisch nieren. Daher kann dieses Design nicht
sind, sodass sie an mehreren Stellen vor- direkt auf Parameter Preconditions, d.h.
kommen, ist es nützlich und sinnvoll, den Preconditions, die sich auf einzelne Me-
Contract in einen Aspekt auszulagern. So thodenparameter beziehen, angewendet
Georg Pietrek,
muss der Contract nur einmal geschrie- werden. Für den folgenden Code kann
Jens Trompeter (Hrsg.)
ben werden und kann mittels geeignetem mit AspectJ kein Pointcut auf Basis der
Pointcut an allen nötigen Stellen einge- @NotNull Annotation definiert wer-
Modellgetriebene
woben werden. Eine Not-Null-Postcon- den:
dition könnte z.B. durch folgenden Ad-
Softwareentwicklung
vice implementiert werden: public void test(@NotNull Integer i) { ... }
MDA und MDSD in der Praxis
Daher erweitert ContractJ für Parameter
after() returning(Object o): notNullPostcondition() {
256 Seiten, Hardcover, CD, 39,90 €
if (o == null) { Preconditions den Ansatz: Die Annota-
ISBN 978-3-939084-11-2
throw new IllegalArgumentException(...);
tion @ParamPreconditions identifiziert
...
diejenigen Methoden, die Parameter
Preconditions enthalten. Der Aspekt
Der aufmerksame Leser ahnt schon, dass ParamPreconditionsGuard definiert
Annotations ein heißer Kandidat für die Pointcuts für Methoden und Kons- • Etablierung von MDSD in der Soft-
Definition der Pointcuts sind. Der fol- truktoren, die mit @ParamPrecondi- wareentwicklung
gende Pointcut adressiert alle Methoden tions annotiert sind, und wertet in den • MDSD im objektorientierten
mit Rückgabe, die mit @NotNull anno- verknüpften Advices zur Laufzeit die Entwicklungsprozess
tiert sind: Annotations der Parameter aus. Zu
• Vorgehensmodelle
jeder Parameter Annotation wird im
• Modellierung
IParamPreconditionHandlerReposi-
pointcut notNullPostcondition(): call(@NotNull !void
• Abstraktion
*(..)); tory ein IParamPreconditionHandler
• Agile Modellierung
gesucht und dessen handle()-Methode
• Modellierungssprachen
Somit würde z.B. die folgende Methode aufgerufen, welche die zur Annotation
• Metamodellierung
mit der Not-Null-Postcondition advised gehörende Precondition implementiert.
werden: Im folgenden Codefragment wird somit • Domänenspezifische Modellierung
die zur Annotation @NotNull gehörende
Parameter Precondition geprüft.
@NotNull
public String info() { ... }
@ParamPreconditions
Dieses Design ist schon ein Paradebei- public void test(@NotNull Integer i) { ... }
spiel für AspectJ, wobei die Verwendung
von Annotations natürlich erst seit Java Gesucht und gefunden werden diese
5 und AspectJ 5 möglich ist. ContractJ IParamPreconditionHandler prinzi-
greift dieses Design auf und liefert in piell in einem beliebigen IParamPre-
der Version 2.0 die folgenden „ready to conditionHandlerRepository, wobei
Weitere Informationen und Bestellmöglich-
use“-Postconditions mit: ContractJ mit dem EclipseParamPre-
keiten finden Sie unter www.entwickler-press.de.
Unsere Bücher erhalten Sie auch in jeder
gut sortierten Buchhandlung.
www.eclipse-magazin.de
305
4. Praxis ContractJ
conditionHandlerRepository eine Im- Notwendigkeit zur Verwendung von Re- Danach gilt es noch, den Aspect Path in
plementierung auf Basis von Eclipse flection zur Ermittlung der annotierten den Project Properties um die Classpath-
Plug-ins mitliefert. Über den Extension Parameter könnte ein negativer Effekt Variable CONTRACTJ_LIB zu erwei-
Point paramPreconditions können An- auf die Laufzeitperformance entstehen. tern und schon kann es losgehen.
notations mit zugehörigen Handlern Während statische AOP im Wesentlichen
Fazit und Ausblick
registriert werden. Natürlich liefert Con- nicht mehr kostet, als die entsprechende
tractJ einige „ready to use”-Parameter Funktionalität direkt im Code einzu- ContractJ kann den Einsatz von DbC
Preconditions, welche dieselben Anno- bauen, muss hier das Laufzeitverhalten soweit erleichtern, dass diese Methodik
tations nutzen wie die Postconditions: untersucht werden, am besten mittels Akzeptanz findet und so konsequent ein-
Profiling. gesetzt werden kann. ContractJ erweist
• @NotNull sich als echter Enabler für DbC. Es be-
ContractJ Architektur
• @NotNegative steht Grund zur Hoffnung, dass AspectJ
• @Positive ContractJ kann prinzipiell in jeder be- zukünftig auch Pointcut Matching auf
liebigen Java Anwendung verwendet Basis von Parameter Annotations bie-
Durch die Verwendung der Eclipse-Plug- werden, es ist jedoch stark auf die Ec- tet. Dann könnte man auch die Para-
in-Architektur ist ContractJ für Erwei- lipse-Plug-in-Architektur ausgerichtet. meter Preconditions direkt mit AspectJ
terungen offen: Um eigene Parameter Pointcuts „fassen“. Damit wäre leider
Preconditions zu implementieren, muss auch ein bedeutender Teil von ContractJ
ContractJ erleichtert
im eigenen Plug-in nur der genannte Ex- obsolet, aber solch weitreichenden Ver-
tension Point erweitert werden. Die neu- einfachungen soll natürlich nichts im
den Einsatz von DbC
en Parameter Annotations müssen selbst Wege stehen. Eine andere Idee, um den
mit @ParamPrecondition annotiert wer- oben beschriebenen Nachteil möglicher
den, damit die Pointcuts des ParamPre- Performanceverschlechterung zu umge-
conditionsGuard „ziehen“: Das zentrale Plug-in org.contractj.core hen, ist die Verwendung von Annotation
enthält obige Pre- und Postconditions. Processing, um spezifische Aspekte zu
Da Plug-ins zunächst einmal normale generieren. Unterstützung aus der Com-
@ParamPrecondition
@Retention(RUNTIME) JAR-Archive darstellen, kann ContractJ munity ist hierbei natürlich höchst will-
@Target( { METHOD, PARAMETER })
auch ohne Eclipse verwendet werden, kommen.
public @interface MyParameterAnnotation { ... }
wobei das Parameter-Preconditions-
Framework um eine andere konkrete
Heiko Seeberger leitet die Market
Die eigenen IParamPreconditionHand- Implementierung des IPrecondition-
Unit Enterprise Architecture der me-
lers signalisieren den Verstoß gegen den HandlerRepositorys erweitert werden
tafinanz GmbH (www.metafinanz.de).
Contract der Precondition, indem sie muss. Er erstellt seit etwa zehn Jahren En-
eine ParamPreconditionViolationEx- Für die Integration von ContractJ terprise Applications mit Java, wo-
ception werfen, die als Wrapper für die in die Eclipse Entwicklungsumgebung bei sein aktueller Fokus auf Eclipse und AspectJ
eigentliche Exception, meist wohl eine stehen weitere Plug-ins zur Verfügung, liegt. Kontakt: heiko.seeberger@metafinanz.de
Andreas Wagner arbeitet als And-
IllegalArgumentException, dient: z.B. um im JDT eine ClasspathVariable
vanced Consultant für die metafi-
mit dem Pfad zur ContractJ-Installation
nanz GmbH. Seine Interessen sind
zu initialisieren und JavaDoc und Source
public void handle(final IParamPreconditionContext pa-
unter anderem Eclipse-Plug-in-Ent-
ramPreconditionContext) Locations zu spezifizieren. wicklung und hier im Speziellen die
throws ParamPreconditionViolationException {
Rich Client Platform. Kontakt: andreas.wagner@
Installation und Verwendung von metafinanz.de
ContractJ
if (...) {
throw new ParamPreconditionViolationException(
ContractJ ist ein Open-Source-Projekt,
new IllegalArgumentException(...));
>>Links & Literatur
das bei SourceForge.net [8] gehosted
...
wird. Das aktuelle Release kann als ZIP- [ 1 ] Design by Contract: Eiffel Software:
Archiv heruntergeladen und manuell in- www.eiffel.com
Wie steht es nun um unsere Anforde- stalliert werden, indem der Inhalt in das [2] se.ethz.ch/~meyer/publications/computer/
rungen? Was oben für reine AspectJ Installationsverzeichnis von Eclipse ent- contract.pdf
Contracts gesagt wurde, gilt weiterhin, packt wird. Zusätzlich steht als komfor- [3] archive.eiffel.com/doc/manuals/
obwohl als kleiner Wermutstropfen hin- tablere Lösung eine Update Site [9] zur technology/contract
zu kommt, dass die Methode, welche Pa- Verfügung, sodass die Installation direkt [4] java.sun.com/javase/6/docs/technotes/
guides/language/assert.html
rameter Preconditions enthält, selbst mit aus Eclipse heraus über den Update Ma-
@ParamPreconditions annotiert werden nager erfolgen kann. [5] www.eclipse.org/aspectj
muss. Aber das ist nur ein verhältnismä- Um ContractJ einzusetzen, benötigt [6] www.Eclipse.org/ajdt
ßig kleiner Aufwand im Vergleich zum man zunächst ein Plug-in-Projekt mit [7] Oliver Böhm: Aspektorientierte Program-
erzielten Nutzen. AspectJ Nature. Dann muss das Plug-in mierung mit AspectJ 5, dpunkt.verlag
Ein möglicher Nachteil dieses An- org.contractj.core in die Liste der abhän- [8] sourceforge.net/projects/contractj
satzes sei nicht verschwiegen: Durch die gigen Plug-ins aufgenommen werden. [9] contractj.sourceforge.net/updatesite
94 eclipse magazin Vol. 12 www.eclipse-magazin.de