EINFÜHRUNG, ALGORITHMEN UND DATENSTRUKTUREN

51. Lehrhilfe zur Vorlesung: Komponentenbasierte Programmierung

R. Dumke, Otto-von-Guericke-Universität Magdeburg, Fakultät für Informatik
Institut für Verteilte Systeme, AG Softwaretechnik



Objekte und Komponenten

Bisher haben wir die Funktionalität einer Anwendung jeweils in Objekte bzw. Klassen aufgeteilt bzw. haben auch derartige vordefinierte Objekte wiederverwendet. Aus fachlicher Sicht kann diese Zusammenfassung aber ungeeignet erscheinen. Andererseits existiert ja bereits eine umfangreiche Menge von Software-Lösungen, die als Programmeinheit weder aus Objekten besteht bzw. selbst ein Klassenexemplar darstellt. Das führt uns zu einer neuen "Software-Enheit", der Komponente.


Begriff: Komponente


Eine Komponente ist eine software-basierte, fachbezogene Zusammenfassung von Funktionalität, die nach technologischen Aspekten, wie der einfachen Integrierbarkeit und jeweils nur über eine eindeutige Schnittstelle zu ihrer Anwendung nutzbar zu sein, konzipiert wurde.

Unsere Klassendefinitionen haben wir zumeist so ausgerichtet, daß sie eine themenbezogene Funktionalität darstellten. So zum Beispiel in der folgenden Form aus unserem Bank-Account-Beispiel:

Komponenten könnten natürlich auch mehrere Objekte bzw. Klassen beinhalten, so daß eine komponentenbasierte Lösung unseres Account-Beispiels auch lauten könnte:

Wir wollen nun im folgenden eine javabezogene Möglichkeit kennenlernen, derartige komponentenbasierte Systeme aufzubauen.



JavaBeans

Komponenten werden hierbei zu sogenannten "Bohnen" (also Beans) zusammen gefaßt. Darüber hinaus besteht die Möglichkeit einer weiteren Zusammenfassung in sogenannte Container. Das folgende Bild verdeutlicht diese Architekturgrundlagen.

Nun wollen wir uns erst einmal die genaue Definition einer solchen Bohne anschauen, wie sie von Sun selbst angegeben wird.


JavaBeans components, or Beans, are reusable software components that can be manipulated visually in a builder tool. Beans can be combined to create traditional applications, or their smaller web-oriented brethren, applets. In additional, applets can be designed to work as reusable Beans.

JavaBeans haben folgende allgemeinen Eigenschaften:

Im folgenden Beispiel wird eine Stoppuhr implementiert. Die dabei zu verwendenden Beans mit ihrem Zusammenhang zeigt die folgende Abbildung.

Mit der visuellen Beschreibung wird gleichzeitig der Bean-Code erzeugt. Die Arbarbeitung des generierten Codes liefert dann zum Beispiel die Java-Anwendung:

Für die Implementation von JavaBeans stehen uns unter anderem folgende Klassen zur Verfügung:

Wir wollen uns einem kleinen Beispiel zuwenden, welches ein JavaBean unter Anwendung der Beans-Klasse definiert. Die Definitionsklasse für ein Bean nennen wir Bohne. Sie legt zwei Bearbeitungszustände für ein Bild fest: "berarbeitet" ja/nein. Im Falle der Nichtbearbeitung ist eine kleine Animation als Bildvergrößerung und -verkleinerung (5-fach) implementiert. Diese Bohne hat dann folgenden Inhalt.

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;

public class Bohne extends Applet implements Runnable {
    Image image;
    Thread thread;
    Point curLoc = new Point(0,0);
    int scale = 1;
    public void init() {
       image = getImage(getDocumentBase(), "skr4900.gif");
       MediaTracker tracker = new MediaTracker(this);
       try{
             tracker.addImage(image, 0);
             tracker.waitForAll(0);
       } catch (Exception e) { e.printStackTrace(); }
   }

   public void start() {
       (thread = new Thread(this)).start();
   }

   public void stop() {
       thread = null;
   }

   public void paint(Graphics g) {
       if (Beans.isDesignTime()) {
             g.drawImage(image, curLoc.x, curLoc.y, this);
       } else { g.drawImage(image, curLoc.x, curLoc.y,
             image.getWidth(null)/scale, image.getHeight(null)/scale, this);
       }
   }

   public void run() {
       int inc = 1;
       while (thread == Thread.currentThread()) {
          try {
             if (!Beans.isDesignTime()) {
             if (scale == 1) { inc = 1; }
             else if (scale ==5 ) { inc = -1;}
             scale +=inc;
             repaint();
          }
          Thread.sleep(300);
        } catch (Exception e) { ; }
    }
   }
}

Die Kapselung als Komponente besteht also hierbei darin, daß ein Bildobjekt erzeugt wird, welches innerhalb eines Fensters bearbeitet werden kann. Die Klasse, die dieses Bild verwendet sei die BeanTest-Klasse. Sie definiert die Darstellung unserer (Bild-) Bohne in einem Fenster. Die BeanTest-Klasse ist dann wie folgt definiert.

import java.awt.*;
import java.awt.event.*;
import java.beans.*;

class BeanTest extends Frame implements ItemListener {
    static Bohne bohne;
    Checkbox designTimeCb = new Checkbox("bearbeitet",true);

    BeanTest() {
       super("Beans-Beispiel");
       designTimeCb.addItemListener(this);
       add(bohne, BorderLayout.CENTER);
       add(designTimeCb, BorderLayout.SOUTH);
       setSize(200, 200);
       show();
       bohne.start();
    }

    public void itemStateChanged(ItemEvent evt) {
       Beans.setDesignTime(designTimeCb.getState());
       ((Component) bohne).repaint();
    }

    public static void main(String[] args) {
       Beans.setDesignTime(true);
       try{
       bohne = (Bohne)Beans.instantiate(
             BeanTest.class.getClassLoader(),"Bohne");
             new BeanTest();
       } catch (Exception e) {e.printStackTrace();
             System.err.println("Bean-Def-Fehler.");
             System.exit(1);
       }
    }
}

Die beiden Ausgaben bzw. Darstellungen (für die Animation (rechts) haben wir nur ein Bild ausgewählt) lauten dann zum Beispiel.

Damit haben wir uns bereits speziellen Java-Technologien zugewandt. Eine weitere Vertiefung zu diesem Gebiet finden wir innerhalb der Softwartechnik I unter dem Link CASE sowie schließlich in der Lehrveranstaltung Web Engineering .



Weitere Web-Links zur Thematik


Zusammenfassung:

Siehe auch unseren Begriffskatalog, den wir insbesondere auch für die Prüfungsvorbereitung zusammen gefaßt und entsprechend gekennzeichnet haben


Email an mich
Zurück zur Hauptseite