SlideShare ist ein Scribd-Unternehmen logo
1 von 4
Downloaden Sie, um offline zu lesen
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
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
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
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

Weitere ähnliche Inhalte

Andere mochten auch

Red de Comunicadores de Maule
Red de Comunicadores de Maule Red de Comunicadores de Maule
Red de Comunicadores de Maule
ARSChile
 
Infocentros Comunitarios y Capital Social
Infocentros Comunitarios y Capital Social Infocentros Comunitarios y Capital Social
Infocentros Comunitarios y Capital Social
ARSChile
 
¿QUIERES UN PAIS MEJOR?
¿QUIERES UN PAIS MEJOR?¿QUIERES UN PAIS MEJOR?
¿QUIERES UN PAIS MEJOR?
Jorge_BR
 
Que proponen los candidatos a alcalde x santiago
Que proponen los candidatos a alcalde x santiagoQue proponen los candidatos a alcalde x santiago
Que proponen los candidatos a alcalde x santiago
CIPDEL
 
Presentacion personal para curso htas web 2.0
Presentacion personal para curso htas web 2.0Presentacion personal para curso htas web 2.0
Presentacion personal para curso htas web 2.0
Jairo Jose Castillo Ramos
 
Ein Diolog
Ein DiologEin Diolog
Ein Diolog
s ghani
 
La espiritualidad del_hombre_resumen_parte_ii
La espiritualidad del_hombre_resumen_parte_iiLa espiritualidad del_hombre_resumen_parte_ii
La espiritualidad del_hombre_resumen_parte_ii
estudia medicina
 

Andere mochten auch (20)

Chicaque erika
Chicaque erikaChicaque erika
Chicaque erika
 
JUGM 07 - AspectJ
JUGM 07 - AspectJJUGM 07 - AspectJ
JUGM 07 - AspectJ
 
Practica 3
Practica 3Practica 3
Practica 3
 
Red de Comunicadores de Maule
Red de Comunicadores de Maule Red de Comunicadores de Maule
Red de Comunicadores de Maule
 
Jefferson rubiano reyes
Jefferson rubiano reyesJefferson rubiano reyes
Jefferson rubiano reyes
 
Gestalt
GestaltGestalt
Gestalt
 
Infocentros Comunitarios y Capital Social
Infocentros Comunitarios y Capital Social Infocentros Comunitarios y Capital Social
Infocentros Comunitarios y Capital Social
 
Naren correa
Naren correaNaren correa
Naren correa
 
¿QUIERES UN PAIS MEJOR?
¿QUIERES UN PAIS MEJOR?¿QUIERES UN PAIS MEJOR?
¿QUIERES UN PAIS MEJOR?
 
Que proponen los candidatos a alcalde x santiago
Que proponen los candidatos a alcalde x santiagoQue proponen los candidatos a alcalde x santiago
Que proponen los candidatos a alcalde x santiago
 
Crash Audi
Crash AudiCrash Audi
Crash Audi
 
Liquid Democracy im Jugendverband
Liquid Democracy im JugendverbandLiquid Democracy im Jugendverband
Liquid Democracy im Jugendverband
 
Jugendmedienschutz-Staatsvertrag und die Jugendarbeit
Jugendmedienschutz-Staatsvertrag und die JugendarbeitJugendmedienschutz-Staatsvertrag und die Jugendarbeit
Jugendmedienschutz-Staatsvertrag und die Jugendarbeit
 
Presentacion personal para curso htas web 2.0
Presentacion personal para curso htas web 2.0Presentacion personal para curso htas web 2.0
Presentacion personal para curso htas web 2.0
 
Word
WordWord
Word
 
Ein Diolog
Ein DiologEin Diolog
Ein Diolog
 
La espiritualidad del_hombre_resumen_parte_ii
La espiritualidad del_hombre_resumen_parte_iiLa espiritualidad del_hombre_resumen_parte_ii
La espiritualidad del_hombre_resumen_parte_ii
 
PROGRAMA RECREATIVO VACACIONAL 2009
PROGRAMA RECREATIVO VACACIONAL 2009PROGRAMA RECREATIVO VACACIONAL 2009
PROGRAMA RECREATIVO VACACIONAL 2009
 
JavaSPEKTRUM - Scala 1
JavaSPEKTRUM - Scala 1JavaSPEKTRUM - Scala 1
JavaSPEKTRUM - Scala 1
 
Abschluss sek 4c
Abschluss sek 4cAbschluss sek 4c
Abschluss sek 4c
 

Mehr von Heiko Seeberger

Eclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiEclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der Drei
Heiko Seeberger
 
Eclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingEclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance Logging
Heiko Seeberger
 
Eclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxEclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on Equinox
Heiko Seeberger
 
EclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPEclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCP
Heiko Seeberger
 
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCPW-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
Heiko Seeberger
 

Mehr von Heiko Seeberger (20)

Scaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of ScalazScaladays 2011 - The Ease of Scalaz
Scaladays 2011 - The Ease of Scalaz
 
Java Magazin - Lift
Java Magazin - LiftJava Magazin - Lift
Java Magazin - Lift
 
JavaSPEKTRUM - Scala 3
JavaSPEKTRUM - Scala 3JavaSPEKTRUM - Scala 3
JavaSPEKTRUM - Scala 3
 
JavaSPEKTRUM - Scala 2
JavaSPEKTRUM - Scala 2JavaSPEKTRUM - Scala 2
JavaSPEKTRUM - Scala 2
 
RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?RheinJUG 2010 - Sprechen Sie Scala?
RheinJUG 2010 - Sprechen Sie Scala?
 
Objektforum 2010 - Sprechen Sie Scala?
Objektforum 2010 - Sprechen Sie Scala?Objektforum 2010 - Sprechen Sie Scala?
Objektforum 2010 - Sprechen Sie Scala?
 
W-JAX 09 - ScalaModules
W-JAX 09 - ScalaModulesW-JAX 09 - ScalaModules
W-JAX 09 - ScalaModules
 
W-JAX 09 - Lift
W-JAX 09 - LiftW-JAX 09 - Lift
W-JAX 09 - Lift
 
JM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala ReviewJM 08/09 - Beginning Scala Review
JM 08/09 - Beginning Scala Review
 
JM 08/09 - ScalaModules
JM 08/09 - ScalaModulesJM 08/09 - ScalaModules
JM 08/09 - ScalaModules
 
OSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on ScalaOSGi DevCon Europe 09 - OSGi on Scala
OSGi DevCon Europe 09 - OSGi on Scala
 
JAX 09 - OSGi on Scala
JAX 09 - OSGi on ScalaJAX 09 - OSGi on Scala
JAX 09 - OSGi on Scala
 
JAX 09 - OSGi Service Components Models
JAX 09 - OSGi Service Components ModelsJAX 09 - OSGi Service Components Models
JAX 09 - OSGi Service Components Models
 
JAX 08 - Agile RCP
JAX 08 - Agile RCPJAX 08 - Agile RCP
JAX 08 - Agile RCP
 
Eclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der DreiEclipse Magazin 16 - Die Stärke der Drei
Eclipse Magazin 16 - Die Stärke der Drei
 
Eclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance LoggingEclipse Magazin15 - Performance Logging
Eclipse Magazin15 - Performance Logging
 
Eclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on EquinoxEclipse Magazin 14 - Getting hooked on Equinox
Eclipse Magazin 14 - Getting hooked on Equinox
 
EclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCPEclipseCon 08 - Agile RCP
EclipseCon 08 - Agile RCP
 
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCPW-JAX 07 - AOP im Einsatz mit OSGi und RCP
W-JAX 07 - AOP im Einsatz mit OSGi und RCP
 
W-JAX 08 - Declarative Services versus Spring Dynamic Modules
W-JAX 08 - Declarative Services versus Spring Dynamic ModulesW-JAX 08 - Declarative Services versus Spring Dynamic Modules
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