Your SlideShare is downloading. ×
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by Contract
Eclipse Magazin 12 - Design by Contract
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Eclipse Magazin 12 - Design by Contract

1,021

Published on

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,021
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
23
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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

×