Komponenten-Orientierte Softwareentwicklung mit JavaBeans Birngruber Dietrich Inhalt • Einführung zum Thema Software Komponenten – – – – Komponenten - Wozu? Schlagwörter Geschichtlicher Hintergrund Wiederverwendung • Java Komponentenmodell: JavaBeans Software Komponenten - Wozu? • „Software Crises“ (Ende 60er) – Ist sie bereits überwunden? • Wiederverwendung (Reuse) – Qualitätsverbesserung – Reduced time to market • Objekt-Orientierung hat sich etabliert - Brauchen wir mehr? • Software Komponenten sind “trendy” • Alternativen zu Komponenten: GEP, AOP, ... Komponenten - Schlagwörter • componentware, • software components, • component based programming, • component oriented programming, • Lego for software engineers, • reuse, • Java, JavaBeans, • DCOM, VBX, ActiveX, • CORBA, CORBA-Beans... Abstraktionsmechanismen Evolution oder Revolution? Data Control 40's - 50's Registers OP Codes 50's - 60's Predefined Types Predefined Operations 60's - 70's User Defined Types User Defined Operations 70's - 80's (Simula 67) 90's - ? Classes Components ????? Erhoffte Vorteile durch OOP • Wiederverwendung von Code durch Vererbung (inheritance) • Flexibilität durch Polymorphismus • Modellieren der realen Welt (object identity) • Erhöhung der Produktivität und Qualität • Und trotzdem: Software Krise nicht überwunden! • Warum? Fragile Base Class Problem • beschreibt Probleme durch Vertragsbruch zwischen Unterund Überklasse • Unterklasse hält sich an den Vertrag • Überklasse wird später geändert und bricht den Vertrag – Ersetzbarkeit ist nicht mehr garantiert! • syntactic: Modifizieren der Schnittstelle der Überklasse – z.B.: Ändern von Methodennamen, Parameterliste, .... • semantic: Verhalten der Überklasse ändert sich OOP Problem: Vererbung • „Inheritance breaks information hiding“ • Schnittstelle zwischen Klienten / Objekt, Klasse ermöglicht Information Hiding A A C B B C • Schnittstelle zwischen Unterklasse und Superklasse kann Information Hiding verletzten, indem auf Instanzvariable der Superklasse direkt zugegriffen wird Beispiel: OO Framework für Editoren • OO-Editor-Framework erlaubt schnelle Anpassung :-))) • Framework wird für zwei OS bereitgestellt – zwei verschiedene Versionen – mehr Aufwand für Framework Hersteller • Kunde braucht oft nicht ganze Funktionalität – Framework kann schwer „zerlegt“ werden – „einzelnes Objekt“ kann nicht ausgeliefert werden • Kunde will Framework auch in Sprache X – weil er auch ein Framework zur Rechtschreibprüfung, geschrieben in der Sprache X, verwendet – Integration Beispiel: Framework (2) Lösungen • Auslieferung von Quellcode – um Framework in Anwendungen verwenden zu können – Framework Code in jeder Anwendung (Speicherverschwendung) – Preisgabe von Know How Application A Editor V1.0 Application B Editor V1.0 • neue Framework Version – betrifft viele Anwendungen – jede Anwendung muss neu übersetzt werden • .... ? Erwartete Vorteile durch COP • Qualitätssteigerung – Komponenten werden mehrmals wiederverwendet und Fehler werden sukzessiv beseitigt • Senkung der Herstellungskosten – Kürze Software-Entwicklungszeit indem, komplexe Komponenten wiederverwendet werden. • Wurde das nicht schon mit OOP versprochen? Lösungsansätze • Plattformunabhängigkeit – keine teueren parallelen Entwicklungen für jedes OS extra • Sprachunabhängigkeit – verwenden von Komponenten, programmiert in verschiedenen Sprachen • Komponenten als unabhängige Einheiten – Ausliefern von dem, was wirklich benötigt wird – Markt für verschiedene Implementierungen Lösungsansätze • Zugriff nur über Schnittstelle – kein teilweises Information Hiding, sondern vollständiges! • blackbox reuse – kein Auslieferen von Quellcode - sondern binäres Format – kein Fragile Base Class Problem • Dynamisches Laden von Komponenten – weniger Speicherverschwendung – Verhalten kann zur Laufzeit verändert werden • .... • Viele dieser Lösungsansätze auch mit OO möglich!!! Wiederverwendung (reuse) • whitebox reuse – Schnittstelle gegeben, aber voller Zugriff auf die Implementierung – Anwender muß fremden Code verstehen und lernen – Entwickler gibt sein Know How preis – z.B.: durch „implementation inheritance“ • Gewünscht: blackbox reuse – Zugriff nur über wohl definierte Schnittstelle – Design by Contract – Anwender braucht gute Dokumentation - muß aber Code nicht lernen – Möglichkeit von „try and buy“ – z.B.: Application Programming Interface (API) Wiederverwendung Objekt - Orientiert: Komponenten - Orientiert • Whitebox Reuse durch Vererbung • Blackbox Reuse durch Assoziation, Aggregation • Anwender braucht gute Dokumentation und muß fremden Code verstehen • Anwender braucht gute Dokumentation • Entwickler gibt sein Know How preis • Zugriff nur über Schnittstellen, Design by Contract • Möglichkeit von „Try & Buy“ JavaBeans Grundlagen Ziele • Verstehen der grundlegenden JavaBean Technologie • Wissen, wie man eine JavaBean baut • Wissen, wie man eine JavaBean verwendet • Spaß an der Arbeit • Als Anfänger beginnen und als Bean ... als ein JavaBean Experte enden JavaBeans - Grundlagen ¼ JavaBeans Einführung und Definition Events – über den grundlegenden Kommunikationsmechanismus Properties – über virtuelle Variable Serialization – über Zustand und Persistenz Packaging – über das Verpacken von JavaBeans JavaBeans Einführung • Einfache Konzepte • Einfache Programmierschnittstelle • Plattformneutrales Komponentenmodel • Verbindungen zu anderen Komponenten- und Verteilungsmodellen wie DCOM oder CORBA • In plattformabhängigen Behältern (containern) einbettbar z.B.: MS Excel, Word etc. JavaBeans Definition „A Java Bean is a reusable software component that can be manipulated visually in a builder tool“ (JavaBeans Spezification) JavaBeans Definition • Beispiele: GUI widgets, Spreadsheet, HTML-Browser • Keine genaue Angabe darüber, was eine "software component" ist. • Die Granularität von JavaBeans reicht von einer Klasse bis zur ganzen Applikation. Die meisten sind jedoch "middle grained" - was immer das heißen mag! • Eine oder mehrere Klassen realisieren eine Komponente • Eine oder mehrere Komponenten realisieren eine komplexere Komponente oder eine Applikation JavaBeans Definition • Explizite Unterstützung von visueller Programmierung • Design Time versus Run Time • Visible versus Unvisible Beans • Erforderliche Features oder Eigenschaften: – – – – – – properties events methods persistence customization introspection JavaBeans Definition • Beans wurden für ein lokales Laufzeitmodell im gleichem Adreßraum konzeptioniert. • Beans können jedoch über verschiedene Mechanismen auf entfernte Ressourcen zugreifen. • Wozu noch Klassenbibliotheken? Beispiel einer Montageumgebung: VisualAge JavaBeans - Grundlagen ; JavaBeans Einführung und Definition ¼ Events – über den grundlegenden Kommunikationsmechanismus Properties – über virtuelle Variable Serialization – über Zustand und Persistenz Packaging – über das Verpacken von JavaBeans Ereignisse (Events) • Allgemeiner Kommunikationsmechanismus • Erlaubt „loosley coupled communication“ • Beans werden über Ereignisse zusammengesteckt • Idee von Ereignissen: Die Änderung eines Zustandes soll allen, die sich dafür interessieren, mitgeteilt werden. • Ziele: – Ein allgemeines Rahmenwerk, das erweitert werden kann und für verschiedene Anwendungsdomänen geeignet ist – Ereignisse müssen auch in anderen Programmierumgebungen (v.a. scripting environments) behandelt werden können – Unterstützung durch Werkzeuge Event Delegation Mechanismus • Technische Realisierung in Java (seit JDK 1.1) mit drei Beteiligten: • Quelle (event source) – Auslöser der Ereignisse (WO ist etwas passiert?) – Sie benachrichtigt alle, die sich dafür interessieren • Interessierter mit Ereignis Definition (event listener) – reagiert auf Ereignisse (WAS ist passiert?) – wird bei der Quelle registriert und deregistriert • Ereignis Objekt (event) – ist Information über Zustandsänderung Zusammenspiel zwischen Quelle, Interessierter und Ereignis Event Source Objekt X void addFooListener (FooListener l) 1 2 FooListener (Interface) void fooBarHappened (FooEvent e1) Objekt X 3 void removeFooListener (FooListener l) Referenz auf Interface l Status geändert! - Erzeuge FooEvent e1 - Ereignis "fooBarHappened" auslösen Bean Design Pattern für Ereignis Objekte (Events) • erweitern java.util.EventObject • Klassenname endet mit „Event“ z.B.: FooEvent, MouseEvent etc. • Instanzvariable sind „immutabel“ d.h. nicht veränderbar – Der Zugriff auf Instanzvariable erfolgt nur über öffentliche Zugriffsmethoden – Die Zugriffsmethoden unterliegen den Design-Pattern für Properties • Ereignis Beispiel: public class AlarmEvent extends java.util.EventObject { private long t; public AlarmEvent(Object source, long ms) {super(source);t=ms;} public long getTime() {return t;} } Beispiel - SimpleAlarmBean Beschreibung • Alle x Millisekunden wird ein Alarm ausgelöst • Sehr einfaches Bean: • AlarmEvent – Enthält die Entstehungszeit des Alarms in Millisekunden. • AlarmEventListener – Behandelt Ereignis „alarmOccured“ • SimpleTimerBean – Event Source – löst alle x Millisekunden den Alarm aus und benachrichtigt die registrierten AlarmEventListner Beispiel - SimpleAlarmBean AlarmEvent & AlarmListener public class AlarmEvent extends java.util.EventObject { private long time; public AlarmEvent(Object source, long ms) { super(source); time=ms; } public long getTime() {return time;} } /* ---------------------------------------------------- */ public interface AlarmListener extends java.util.EventListener { // alarmOccured event void alarmOccured(AlarmEvent ev); } Beispiel - SimpleAlarmBean (1) (Ereignisquelle) public class SimpleAlarmBean implements Runnable { Thread t; static final int WAIT_MS = 10000; //alarm occures all 10 sec. Vector listeners; //registered listeners //default constructor public SimpleTimerBean() { listeners = new java.util.Vector(); t = new java.lang.Thread (this); t.start(); } //registration and deregistration of the listeners public synchronized void addAlarmListener(AlarmListener l) { this.listeners.addElement(l); } public synchronized void removeAlarmListener(AlarmListener l) { this.listeners.removeElement(l); } //... Beispiel - SimpleAlarmBean (2) //... protected void fireAlarmEvent() { if (listeners == null) return; Vector targets=(Vector)listeners.clone(); AlarmEvent ev=new AlarmEvent(this,System.currentTimeMillis()); for (int i =0; i < targets.size(); i++) { AlarmListener target=(AlarmListener)targets.elementAt(i); target.alarmOccured(ev); } } public void run() { while (t != null ) { try { t.sleep(WAIT_MS); fireAlarmEvent(); } catch (Exception ex) { ex.printStackTrace(); } } } } //end of class SimpleAlarmBean JavaBeans - Grundlagen ; JavaBeans Einführung und Definition ; Events – über den grundlegenden Kommunikationsmechanismus ¼ Properties – über virtuelle Variable Serialization – über Zustand und Persistenz Packaging – über das Verpacken von JavaBeans Eigenschaften (Properties) • Properties oder Eigenschaften sind diskrete, benannte Attribute eines JavaBeans, welche das Aussehen oder das Verhalten eines Beans verändern können. • Beispiel: „label“ Property eines GUI Knopfes, welches die Beschriftung darstellt • Auf Properties wird immer über Methoden zugegriffen • Meistens werden Properties auch gespeichert • Properties können zur Run Time und zur Design Time gesetzt werden Simple Properties Bean Design Pattern • Grundlegende Signatur von read / write Properties: – public void set<Name> ( <Type> value ); //simple setter – public <Type> get<Name> (); //simple getter • z.B.: Simple Property „label“ vom Typ String – public void setLabel (String aLabel); – public String getLabel (); //simple setter //simple getter JavaBeans - Grundlagen ; JavaBeans Einführung und Definition ; Events – über den grundlegenden Kommunikationsmechanismus ; Properties – über virtuelle Variable ¼ Serialization – über Zustand und Persistenz Packaging – über das Verpacken von JavaBeans Serialization (1) • Mechanismus zum Speichern (=Serialisieren) und zum Laden (=Deserialisieren) von Java Objekten • Es werden Typinformation und Zustand eines Objektes auf einen beliebigen Ausgabestrom gespeichert • API ist zu finden im Package java.io • Serialisierbare Klassen implementieren java.io.Serializable – Unabhängig welcher Serialisierungsmechanismus benutzt wird • java.io.Serializable enthält keine Methoden – Ist nur Typ zum Erkennen „ja ich möchte serialisiert werden“ Serialization (2) • Gespeichert werden nur Instanzvariable – Nicht gespeichert werden: transient und Klassenvaraible (static) • Ganzer Objektgraph wird gespeichert • Wichtige Stream Klassen zum Serialisieren von Objekten – java.io.ObjectInputStream – java.io.ObjectOutputStream • Fast alle Klassen des JDK implementieren Serializable – Ausnahmen: java.lang.Object, java.lang.Thread, etc. JavaBeans - Grundlagen ; JavaBeans Einführung und Definition ; Events – über den grundlegenden Kommunikationsmechanismus ; Properties – über virtuelle Variable ; Serialization – über Zustand und Persistenz ¼ Packaging – über das Verpacken von JavaBeans Packaging • Problem: Ein JavaBean besteht in der Regel aus vielen Dateien • Lösung: archivieren als JAR - Java Archive • Anwendungsszenario – – – – Bean Entwickler packt die notwendigen Dateien in ein JAR Kunde kauft JAR (übers Netz) und importiert es in sein Builder Tool Builder Tool erkennt automatisch alle Beans und ändert die Palette Kunde verwendet die neuen Beans in seinem Builder Tool • JAR Tool ist im JDK enthalten – Beispiel: Zwei Dateien werden in das Archiv „classes.jar“ gepackt jar cvfm Beans.jar manifest.mf Foo.class B.class Inhalt eines JAR • .class Dateien: Beans, Unterstützende Klassen etc. • .html Dateien: Dokumentation • .avi, .au etc: sonstige Ressourcen, Videos, Bilder etc. • Manifest.mf Datei – Beschreibt welche Klassen ein Bean ist und welche nicht – Beispiel: Manifest-Version: 1.0 Name: com/ibm/led/LEDClock.class Java-Bean: True Digest-Algorithms: SHA MD5 SHA-Digest: XspvM2DfvGR7uap4+U7mpgY0p/o= MD5-Digest: jLabnolaISRcY9VBa80A0w== Name: com/ibm/led/AlarmEvent.class Digest-Algorithms: SHA MD5 JavaBeans - Grundlagen FRAGEN? Wir sehen uns im WS00/01