22. Netze mit Datenfluss Kommunikation mit Iteratoren, Kanälen und Konnektoren 1 Prof. Dr. Uwe Aßmann Lehrstuhl Softwaretechnologie Fakultät für Informatik Technische Universität Dresden Version 14-0.9, 20.04.12 1) Channels 1) Entwurfsmuster Iterator (Stream) 2) Entwurfsmuster Sink 3) Channel 2) I/O und Persistente Datenhaltung 3) Ereigniskanäle 4) Konnektoren Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Betreff: "Softwaretechnologie für Einsteiger" 2. Auflage Prof. U. Aßmann, Softwaretechnologie, TU Dresden 2 ► zur Info: o.g. Titel steht jetzt zur Verfügung: 20 Exemplare ausleihbar in der Lehrbuchsammlung sowie 1 PräsenzExemplar im DrePunct. Jeweils unter ST 230 Z96 S68(2). ► Beste Grüße Sabine Fügner ► Warum müssen Softwareingenieure fortgeschrittenes Wissen besitzen? ► Die Konkurrenz ist hart: Zu den Kosten der Arbeit: Prof. U. Aßmann, Softwaretechnologie, TU Dresden 3 http://www.heise.de/resale/imgs/17/1/0/0/1/3/4/1/ArbeitskostenEULaenderStart20129bb2e8b041f1342e.png Überblick Teil II 4 Höhere Sprachen Graphen als Sprachkonstrukte Graphen als Konnektoren (Rollen-Kollaborationen) Prof. U. Aßmann, Softwaretechnologie, TU Dresden Graphen als Entwurfsmuster Netze mit Datenfluss Graphen als Bibliotheken (Java) Java Graphen als Collections abgeflacht (Java) Graphen als Endoassoziationen: Netze von Unterobjekten in komplexen Objekten (Java) Systemprogrammiersprache (C) Graphen als Datenstrukturen fester Länge abgeflacht Beispiel: Bestellung auf dem Webshop 5 Bestellposition * Artikel Prof. U. Aßmann, Softwaretechnologie, TU Dresden +name:String +preis:int +bestellNummer:int -anzahl:String -preis:int Bestellung * 1 +kunde:String +create:Bestellung Warenkatalog +name:String warenkat +aussuchen():Artikel Kunde Bestellung ausloesen() WebShop shop kunde while (hatBedarf()) { artikel = warenkat.aussuchen(); shop.bestellen(artikel); }. annehmen(Artikel) while (true) { b = Bestellung.create(); b.workOn(); b.ship(): }. Kanäle bilden Netze mit Datenfluss 6 Def.: Def.:Ein EinKanal Kanal(channel, (channel,stream) stream)ist istein einLink, Link,der derzur zurKommunikation Kommunikation von vonAnwendungsklassen Anwendungsklassenmit mitDatenfluss Datenflussdient. dient. Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► UML Notation: Andoncken eines Kanals an ports Consumer<T> Producer<T> T produceItem() << channel<T> >> consumeItem() c while () { c.push(produceItem()); }. while (c.hasNext()) { T item = c.pull(); work(T); }. Vorteil von Kanälen 7 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Problem Partnerwechsel Webshops dürfen die konkreten Objekte ihrer Kunden nicht kennen Kanäle erlauben, die Partner zu wechseln, ohne Kenntnis des Netzes ■ Ideal für Netze mit dynamisch wechselnden Partnern ■ Ideal für Webprogrammierung Kunde << stream<Artikel> >> Bestellung ausloesen() Webshop annehmen() channel while (hatBedarf()) { artikel = warenkat.aussuchen(); channel.bestellen(artikel); }. while (true) { b = Bestellung.create(); artikel = channel.pull(); b.workOn(artikel); b.ship(): }. E.22.1 Lernen mit Begriffshierarchien, die die Vorlesung querschneiden 8 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Querschneidende Begriffshierarchien 9 ► Wie lernt man mit Ihnen? ■ Klassen-Taxonomie ■ Methoden-Taxonomie Realisierungen von Graphen Prof. U. Aßmann, Softwaretechnologie, TU Dresden ■ Achtung, wir erweitern in dieser Vorlesung wieder die bereits begonnenen, den Kurs querschneidenden Taxonomien! 22.1 Entwurfsmuster Channel 10 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Wie organisiere ich die “unendlich lange” Kommunikation zweier Aktoren? 11 ► Problem: Über der Zeit laufen in einem Webshop eine Menge von Bestellungen auf ■ ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Sie sind aber nicht in endlicher Form in Collections zu repräsentieren Frage: Wie repräsentiert man potentiell unendliche Collections? Antwort: mit Kanälen. Consumer<T> Producer<T> produceItem():Object consumeItem(Object) Webshop<Artikel> Kunde<Artikel> produceItem():Artikel StreamServer<Video> produceItem():Page consumeItem(Artikel) StreamingClient<Video> consumeItem(Page) 22.1.1 Entwurfsmuster Iterator (Eingabestrom, input stream) 12 Kanäle bestehen aus mit einander verbundenen Enden, mindestens zweien Sink Output Stream Iterator Input Stream Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Iterator (Input Stream) (Implementierungsmuster) 13 ► Ein Eingabestrom (input stream) ist eine potentiell unendliche Folge von Objekten (zeitliche Anordnung einer pot. unendlichen Folge) Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Eingabe in eine Klasse oder Komponente Iterator<Element> {abstract} Element next()/ getNext()/ pull() bool hasNext() Container<Element> elements(): Iterator <<create>> * Element ConcreteIterator <Element> pull.. IteratorMethode Iterator-Beispiel in der JDK (ArrayList) 14 <<interface>> java.util.Iterator <Bestellposition> bool hasNext() Bestellposition next() Aggregate Bestellung – kunde: String – anzahl: int java.util.ArrayList <Bestellposition> add(o: Bestellposition) liste get(pos: int): Bestellposition iterator(): Iterator <Bestellposition> Concrete Iterator 1 Element * Prof. U. Aßmann, Softwaretechnologie, TU Dresden Iterator <Bestellposition> Bestellposition <<create>> Klassenname nicht bekannt, weil privat (z.B. ArrayListIterator) Implementierungsmuster Iterator Prof. U. Aßmann, Softwaretechnologie, TU Dresden 15 ► ► Verwendungsbeispiel: Verwendungsbeispiel: TT thing; thing; List<T> List<T> list; list; .. .. Iterator<T> Iterator<T> ii == list.iterator(); list.iterator(); while (i.hasNext()) while (i.hasNext()) {{ doSomeThing(i.next()); doSomeThing(i.next()); }} ► Einsatzzwecke: ■ Verbergen der inneren Struktur bedarfsgesteuerte Berechnungen ■ “unendliche” Datenstrukturen ■ Anwendungsbeispiel mit Iteratoren 16 import import java.util.Iterator; java.util.Iterator; ... ... class class Bestellung Bestellung {{ Prof. U. Aßmann, Softwaretechnologie, TU Dresden private private String String kunde; kunde; private private List<Bestellposition> List<Bestellposition> liste; liste; }} ... ... public public int int auftragssumme() auftragssumme() {{ Iterator<Bestellposition> Iterator<Bestellposition> ii == liste.iterator(); liste.iterator(); int int ss == 0; 0; while while (i.hasNext()) (i.hasNext()) ss += += i.next().positionspreis(); i.next().positionspreis(); return return s; s; }} ... ... Online: Bestellung2.java For-Schleifen auf IterablePrädikatschnittstellen 17 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Erbt eine Klasse von Iterable, kann sie in einer vereinfachten for-Schleife benutzt werden Typisches Implementierungsmuster class class BillItem BillItem extends extends Iterable Iterable {{ int int price; price; }} class class Bill Bill {{ int int sum sum == 0; 0; private List private List billItems; billItems; public void sumUp() public void sumUp() {{ for for (BillItem (BillItem item: item: billItems) billItems) {{ sum sum += += item.price; item.price; }} return return sum; sum; }} }} class class BillItem BillItem {{ int int price; price; }} class class Bill Bill {{ int sum int sum == 0; 0; private List private List billItems; billItems; public public void void sumUp() sumUp() {{ for for (Iterator (Iterator ii == billItems.iterator(); billItems.iterator(); i.hasNext(); ) i.hasNext(); ) {{ item item == i.next(); i.next(); sum += item.price; sum += item.price; }} return return sum; sum; }} }} 22.1.2 Senken (Sinks) 18 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Senke (Implementierungsmuster) 19 ► Name: Senke (auch: Ablage, sink, output stream, belt, pushsocket) ► Problem: Ablage eines beliebig großen Datenstromes. – – Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► push ggf. mit Abfrage, ob noch freier Platz in der Ablage vorhanden Lösung: Sink<T> {abstract} push(T) bool hasFreeSpace() Client ConcreteSink<T> push.. SinkMethode Erweiterung: Begriffshierarchie der Methodenarten 20 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Methode Zustandsverändernde Methoden Zustandsinvariante Methoden Iterator (input stream) Anfrage (query) Modifikatoren Allgemeine Methoden Checker Zustandsmodifikatoren Tester Senke (output stream) Netzmodifikatoren RepräsentationsWechsler 22.1.3 Channels (Pipes) 21 Die Kombination aus Senken und Iteratoren, ggf. mit beliebig großem Datenspeicher Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Channel und Pipe (Implementierungsmuster) ► Name: Ein Channel (Kanal, full stream) organisiert die gerichtete Kommunikation (Datenfluss) zwischen Produzenten und Konsumenten. ► Zweck: asynchrone Kommunikation mit Hilfe eines Puffers buffer ► Wir sprechen von einer Pipe (Puffer, buffer), wenn die Kapazität des Kanals endlich ist, d.h. hasFreeSpace() irgendwann false liefert. Prof. U. Aßmann, Softwaretechnologie, TU Dresden 22 Channel/Pipe<T> push of sink.. - buffer:Collection[T] push(T) bool hasFreeSpace() T pull() bool hasNext() Client ConcreteChannel<T> pull of iterator.. Channels in anderen Programmiersprachen 23 ► Channels (pipes) kommen in vielen Sprachen als Konstrukte vor – Shell-Skripte in Linux (Operator für pipes: “|”) – Communicating Sequential Processes (CSP, Hoare): ● Operator für pull: “?” Operator für push: “!” C++: Eingabe- und Ausgabestream stdin, stdout, stderr ● Operatoren “<<” (read) und “>>” (write) Architectural Description Languages (ADL, Kurs CBSE) ● Prof. U. Aßmann, Softwaretechnologie, TU Dresden – – ► Sie sind ein elementares Muster für die Kommunikation von parallelen Prozessen (producer-consumer-Muster) Wie organisiere ich die Kommunikation zweier Aktoren? 24 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Einsatzzweck: Ein Aktor ist ein parallel arbeitendes Objekt. Zwei Aktoren können mit Hilfe eines Kanals kommunizieren und lose gekoppelt arbeiten Bsp.: Pipes mit ihren Endpunkten (Sockets) organisieren den Verkehr auf den Internet; sie bilden Kanäle zur Kommunikation zwischen Prozessen (Producer-Consumer-Muster) Consumer<T> Producer<T> consumeItem() T produceItem() Channel<T> +int port-number -T buffer[SIZE] while (c.hasFreeSpace()) { c.push(produceItem()); }. push(T) bool hasFreeSpace() T pull() bool hasNext() while (c.hasNext()) { T item = c.pull(); work(T); }. Konnektoren 25 Def.: Def.:Ein EinKonnektor Konnektorist isteine einetechnische technischeKlasse, Klasse,die diezur zurKommunikation Kommunikation von vonAnwendungsklassen Anwendungsklassendient. dient. ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► ► Konnektoren verallgemeinern Kanäle; Kanäle bilden spezielle Konnektoren Kommunikation über Konnektoren muss nicht gerichtet sein; es können komplexe Protokolle herrschen Konnektoren können mehrere Input und Output Streams koppeln Consumer<T> Producer<T> T produceItem() c c consumeItem() Connector<T> while (c.hasFreeSpace()) { c.push(produceItem()); }. while (c.hasNext()) { T item = c.pull(); work(T); }. Begriffshierarchie von Klassen (Erweiterung) 26 Klasse Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Generische Klasse (Konkrete) Klasse Konnektor Abstrakte Klasse Algorithmenklasse Rollenklasse Schnittstelle (interface) Channel Prädikat-Schnittstelle 22.2 Input/Output und persistente Datenhaltung 27 Das JDK nutzt Iteratoren/Streams an verschiedenen Stellen Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik 22.2.1 Ein- und Ausgabe in Java 28 ► ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Die Klasse java.io.InputStream stellt einen Iterator/Stream in unserem Sinne dar. Sie enthält Methoden, um Werte einzulesen java.io.OutputStream stellt eine Senke dar. Sie enthält Methoden, um Werte auszugeben Die statischen Objekte in, out, err bilden die Sinks und Streams in und aus einem Programm, d.h. die Schnittstellen zum Betriebssystem :System.in InputStream OutputStream int read() read(byte[] b) write(int i) write(byte[] b) FilterInputStream FilterOutputStream PrintStream println(String) print(char c) print(int i) :System.out Java-Anwendungen mit ihren StandardEin/Ausgabe-Strömen 29 ► Ein Programm in Java hat 3 Standard-Ströme ■ Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Entwurfsidee stammt aus dem UNIX/Linux-Sytem Notation: UML-Komponenten <<Iterator>> System.in:InputStream JavaApplication <<Sink>> System.out:PrintStream main(String[] argv) <<Sink>> System.err:PrintStream NewsReader enterNews(News) 22.2.2 Temporäre und persistente Daten 30 ► ► Daten sind – temporär, wenn sie mit Beendigung des Programms verloren gehen, das sie verwaltet; – persistent, wenn sie über die Beendigung des verwaltenden Programms hinaus erhalten bleiben. Objektorientierte Programme benötigen Mechanismen zur Realisierung der Persistenz von Objekten. Prof. U. Aßmann, Softwaretechnologie, TU Dresden – Einsatz eines Datenbank-Systems ● ● ● – Objektorientiertes Datenbank-System Relationales Datenbank-System Java: Java Data Base Connectivity (JDBC) Zugriffsschicht auf Datenhaltung Java: Java Data Objects (JDO) Speicherung von Objektstrukturen in Dateien mit Senken und Iteratoren ● Objekt-Serialisierung (Object Serialization) ● Die Dateien werden als Channels benutzt: ● Zuerst schreiben in eine Sink ● Dann lesen mit Iterator Objekt-Serialisierung in Java, eine einfache Form von persistenten Objekten 31 ► Die Klasse java.io.ObjectOutputStream und stellt eine Sink dar ■ – – Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Methoden, um ein Geflecht von Objekten linear darzustellen (zu serialisieren) bzw. aus dieser Darstellung zu rekonstruieren. Ein OutputStream entspricht dem Entwurfsmuster Sink Ein InputStream entspricht dem Entwurfsmuster Iterator Eine Klasse, die Serialisierung zulassen will, muß die (leere!) PrädikatSchnittstelle java.io.Serializable implementieren. class ObjectOutputStream { public ObjectOutputStream (OutputStream out) throws IOException; // push Method public void writeObject (Object obj) throws IOException; } Objekt-Serialisierung: Abspeichern 32 import java.io.*; Prof. U. Aßmann, Softwaretechnologie, TU Dresden class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } ... XClass xobj; ... FileOutputStream fos = new FileOutputStream("Xfile.dat"); ObjectOutputStream oos = new ObjectOutputStream(fos); // internally realized as push for all child objects oos.writeObject(xobj); // push ... Input und Output Streams im JDK Prof. U. Aßmann, Softwaretechnologie, TU Dresden 33 InputStream OutputStream int read() read(byte[] b) write(int i) write(byte[] b) FileInputStream ObjectInputStream FileOutputStream ObjectOutputStream :ois :oos 34 ► Die Klasse java.io.ObjectInputStream stellt einen Iterator/Stream in unserem Sinne dar ■ Methoden, um ein Geflecht von Objekten linear darzustellen (zu serialisieren ) bzw. aus dieser Darstellung zu rekonstruieren (zu deseralisieren) ■ Ein OutputStream entspricht dem Entwurfsmuster Sink Ein InputStream entspricht dem Entwurfsmuster Iterator Prof. U. Aßmann, Softwaretechnologie, TU Dresden ■ InputStream ObjectInputStream Objekt-Serialisierung: Einlesen 35 import java.io.*; Prof. U. Aßmann, Softwaretechnologie, TU Dresden class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } ... XClass xobj; ... FileInputStream fis = new FileInputStream("Xfile.dat"); ObjectInputStream ois = new ObjectInputStream(fis); // internally realised as pull xobj = (XClass) ois.readObject(); // pull 22.2.3 Ereignisse und Kanäle 36 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Kanäle eignen sich hervorragend zur Kommunikation mit der Außenwelt, da sie die Außenwelt und die Innenwelt eines Softwaresystems entkoppeln Ereignisse können in der Außenwelt asynchron stattfinden und auf einem Kanal in die Anwendung transportiert werden ■ Dann ist der Typ der Daten ein Ereignis-Objekt ■ In Java wird ein externes oder internes Ereignis immer durch ein Objekt repräsentiert 22.3 Assoziationen, Konnektoren, Kanäle und Teams 37 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Kollaborationen kapseln das Verhalten von Netzen 38 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Statisch fixe Netze werden in UML durch n-stellige Assoziationen oder, wenn es um die Kommunikation der Objekte geht, durch Kollaborationen dargestellt. Def.: Eine Kollaboration (Teamklasse, collaboration) realisiert die Kommunikation eines fixen Netzes mit einem festen anwendungsspezifischen Protokoll Person Person Consumer Producer Consumer Message Person Item Person Person Consumer Producer Message Item Collaboration Consumer Person Kollaboration kapseln Interaktionsprotokolle 39 ► Kollaborationen beschreiben die anwendungsspezifische Interaktion, Nebenläufigkeit und Kommunikation eines Teams von Beteiligten ► Def.: Ein Team realisiert eine Kollaboration durch eine feste Menge von Rollenobjekten, koordiniert durch ein Hauptobjekt. Es wird oft mit einem Sequenzdiagramm als Verhalten unterlegt ■ ► Die einzelnen Lebenslinien geben das Verhalten einer Rolle der Kollaboration an Die Kollaboration beschreibt also ein Szenario querschneidend durch die Lebenszyklen mehrerer Objekte Termin Prof. U. Aßmann, Softwaretechnologie, TU Dresden Person Person Teambesprechung Organisator <<collaboration>> Teambesprechung organisieren <<role>> m3:Teil nehmer <<team>> Organisator erzeugen <<role>> tb1:Teambesprechung terminBestätigen() OK bestätigt terminBestätigen OK Teilnehmer Teilnehmer Person <<role>> m5:Teil nehmer Relationale Klassen (Konnektoren) 40 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Assoziation (Relation) Kollaboration (Teamklasse) Konnektor Channel Team Begriffshierarchie von Klassen (Erweiterung) 41 Assoziation (Relation) Klasse Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Generische Klasse Kollaboration (Teamklasse) (Konkrete) Klasse Konnektor Abstrakte Klasse Algorithmenklasse Rollenklasse Schnittstelle (interface) Channel Prädikat-Schnittstelle The End Prof. U. Aßmann, Softwaretechnologie, TU Dresden 42 ► Einige Folien stammen aus den Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002. Used by permission. Iterator-Implementierungsmuster in modernen Sprachen Prof. U. Aßmann, Softwaretechnologie, TU Dresden 43 ► In vielen Programmiersprachen (Sather, Scala) stehen Iteratormethoden (stream methods) als spezielle Prozeduren zur Verfügung, die die Unterobjekte eines Objekts liefern können – Die yield-Anweisung gibt aus der Prozedur die Elemente zurück – Iterator-Prozedur kann mehrfach aufgerufen werden und damit als inputstream verwendet werden – Beim letzten Mal liefert sie null class class bigObject bigObject {{ private private List List subObjects; subObjects; public public iterator iterator Object Object deliverThem() deliverThem() {{ while while (i (i in in subObjects) subObjects) {{ yield yield i; i; // Dieser // Dieser Punkt Punkt im im Ablauf Ablauf wird wird sich sich als als Zustand Zustand gemerkt gemerkt // Beim nächsten Aufruf wird hier fortgesetzt // Beim nächsten Aufruf wird hier fortgesetzt }} }} }} .. .. BigObject BigObject bo bo == new new BigObject(); BigObject(); ... ... .. .. aa == bo.deliverThem(); bo.deliverThem(); bb == bo.deliverThem();.. bo.deliverThem();.. 22. Netze mit Datenfluss Kommunikation mit Iteratoren, Kanälen und Konnektoren 1 Prof. Dr. Uwe Aßmann Lehrstuhl Softwaretechnologie Fakultät für Informatik Technische Universität Dresden Version 14-0.9, 20.04.12 1) Channels 1) Entwurfsmuster Iterator (Stream) 2) Entwurfsmuster Sink 3) Channel 2) I/O und Persistente Datenhaltung 3) Ereigniskanäle 4) Konnektoren Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Betreff: "Softwaretechnologie für Einsteiger" 2. Auflage Prof. U. Aßmann, Softwaretechnologie, TU Dresden 2 ► zur Info: o.g. Titel steht jetzt zur Verfügung: 20 Exemplare ausleihbar in der Lehrbuchsammlung sowie 1 PräsenzExemplar im DrePunct. Jeweils unter ST 230 Z96 S68(2). ► Beste Grüße Sabine Fügner ► Warum müssen Softwareingenieure fortgeschrittenes Wissen besitzen? ► Die Konkurrenz ist hart: Zu den Kosten der Arbeit: Prof. U. Aßmann, Softwaretechnologie, TU Dresden 3 http://www.heise.de/resale/imgs/17/1/0/0/1/3/4/1/ArbeitskostenEULaenderStart20129bb2e8b041f1342e.png Überblick Teil II 4 Höhere Sprachen Graphen als Sprachkonstrukte Graphen als Konnektoren (Rollen-Kollaborationen) Prof. U. Aßmann, Softwaretechnologie, TU Dresden Graphen als Entwurfsmuster Netze mit Datenfluss Graphen als Bibliotheken (Java) Java Graphen als Collections abgeflacht (Java) Graphen als Endoassoziationen: Netze von Unterobjekten in komplexen Objekten (Java) Systemprogrammiersprache (C) Graphen als Datenstrukturen fester Länge abgeflacht Überblick von Teil II des Kurses. Dieses Kapitel beschäftigt sich mit Objektnetzen, in denen Daten fließen Beispiel: Bestellung auf dem Webshop 5 * Artikel +name:String +preis:int +bestellNummer:int Prof. U. Aßmann, Softwaretechnologie, TU Dresden Bestellung Bestellposition -anzahl:String -preis:int * 1 +kunde:String +create:Bestellung Warenkatalog +name:String warenkat +aussuchen():Artikel Kunde Bestellung ausloesen() WebShop shop kunde while (hatBedarf()) { artikel = warenkat.aussuchen(); shop.bestellen(artikel); }. annehmen(Artikel) while (true) { b = Bestellung.create(); b.workOn(); b.ship(): }. Kanäle bilden Netze mit Datenfluss 6 Def.: Def.:Ein EinKanal Kanal(channel, (channel,stream) stream)ist istein einLink, Link,der derzur zurKommunikation Kommunikation von vonAnwendungsklassen Anwendungsklassenmit mitDatenfluss Datenflussdient. dient. Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► UML Notation: Andoncken eines Kanals an ports Consumer<T> Producer<T> T produceItem() << channel<T> >> consumeItem() c while () { c.push(produceItem()); }. while (c.hasNext()) { T item = c.pull(); work(T); }. Vorteil von Kanälen 7 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Problem Partnerwechsel Webshops dürfen die konkreten Objekte ihrer Kunden nicht kennen Kanäle erlauben, die Partner zu wechseln, ohne Kenntnis des Netzes ■ Ideal für Netze mit dynamisch wechselnden Partnern ■ Ideal für Webprogrammierung Kunde << stream<Artikel> >> Bestellung ausloesen() Webshop annehmen() channel while (hatBedarf()) { artikel = warenkat.aussuchen(); channel.bestellen(artikel); }. while (true) { b = Bestellung.create(); artikel = channel.pull(); b.workOn(artikel); b.ship(): }. E.22.1 Lernen mit Begriffshierarchien, die die Vorlesung querschneiden 8 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Querschneidende Begriffshierarchien Prof. U. Aßmann, Softwaretechnologie, TU Dresden 9 ► Wie lernt man mit Ihnen? ■ Klassen-Taxonomie ■ Methoden-Taxonomie ■ Realisierungen von Graphen Achtung, wir erweitern in dieser Vorlesung wieder die bereits begonnenen, den Kurs querschneidenden Taxonomien! 22.1 Entwurfsmuster Channel 10 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Wie organisiere ich die “unendlich lange” Kommunikation zweier Aktoren? 11 ► Problem: Über der Zeit laufen in einem Webshop eine Menge von Bestellungen auf ■ ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Sie sind aber nicht in endlicher Form in Collections zu repräsentieren Frage: Wie repräsentiert man potentiell unendliche Collections? Antwort: mit Kanälen. Consumer<T> Producer<T> produceItem():Object consumeItem(Object) Webshop<Artikel> Kunde<Artikel> produceItem():Artikel StreamServer<Video> produceItem():Page consumeItem(Artikel) StreamingClient<Video> consumeItem(Page) Problem: Über der Zeit laufen in einem Webshop eine Menge von Bestellungen auf – Sie sind aber nicht in endlicher Form in Mengen oder Collections zu repräsentieren Frage: Wie repräsentiert man potentiell unendliche Collections? Antwort: mit Kanälen. Viele Prozesse in Softwaresystemen benötigen den Austausch von unendlichen Mengen von Daten. Wie repräsentiert man potentiell unendliche Mengen und Collections? 22.1.1 Entwurfsmuster Iterator (Eingabestrom, input stream) 12 Kanäle bestehen aus mit einander verbundenen Enden, mindestens zweien Sink Output Stream Iterator Input Stream Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Iterator (Input Stream) (Implementierungsmuster) 13 ► Ein Eingabestrom (input stream) ist eine potentiell unendliche Folge von Objekten (zeitliche Anordnung einer pot. unendlichen Folge) Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Eingabe in eine Klasse oder Komponente Iterator<Element> {abstract} Element next()/ getNext()/ pull() bool hasNext() Container<Element> elements(): Iterator pull.. IteratorMethode <<create>> * Element ConcreteIterator <Element> Das Entwurfsmuster Iterator wird benutzt, um potentiell unendliche Folgen von Eingaben in eine Klasse oder Komponente zu realisieren. Merkmale Entwurfsmuster Iterator (auch: input stream, Cursor, Enumeration, pull-socket) – Sequentielles, polymorphes Durchlaufen der Elemente eines strukturieren Objekts oder einer Collection (Navigation). Typisierung des Inhalts (der Elemente) – Aufzählen der in einem “Behälter” befindlichen Elemente durch Herausziehen (pull) mit Hilfe einer Iteratormethode (next, getNext, pull) – Keine Aussage über die Reihenfolge im Container möglich – Merken des Zustandes der Navigation Iterator-Beispiel in der JDK (ArrayList) 14 <<interface>> java.util.Iterator <Bestellposition> bool hasNext() Bestellposition next() Aggregate Bestellung – kunde: String – anzahl: int java.util.ArrayList <Bestellposition> add(o: Bestellposition) liste get(pos: int): Bestellposition iterator(): Iterator <Bestellposition> Concrete Iterator 1 Element <<create>> Klassenname nicht bekannt, weil privat (z.B. ArrayListIterator) * Prof. U. Aßmann, Softwaretechnologie, TU Dresden Iterator <Bestellposition> Bestellposition Collections haben Iteratoren zugeordnet. Man kann mit dem Iterator Stück für Stück aus einer Collection alle Elemente herausholen, sodass transparent bleibt, wie viele Elemente die Collection hat. Implementierungsmuster Iterator Prof. U. Aßmann, Softwaretechnologie, TU Dresden 15 ► ► Verwendungsbeispiel: Verwendungsbeispiel: TT thing; thing; List<T> List<T> list; list; .. .. Iterator<T> Iterator<T> ii == list.iterator(); list.iterator(); while while (i.hasNext()) (i.hasNext()) {{ doSomeThing(i.next()); doSomeThing(i.next()); }} ► Einsatzzwecke: ■ Verbergen der inneren Struktur ■ bedarfsgesteuerte Berechnungen ■ “unendliche” Datenstrukturen Einsatzzwecke: – Iteratoren und Iteratormethoden erlauben, die Elemente einer komplexten Datenstruktur nach außen hin bekannt zu geben, aber ihre Struktur zu verbergen (Geheimnisprinzip) – Sie erlauben bedarfsgesteuerte Berechnungen (processing on demand, lazy processing), weil sie nicht alle Objekte der komplexen Datenstruktur herausgeben, sondern nur die, die wirklich benötigt werden – Iteratoren können “unendliche” Datenstrukturen repräsentieren, z.B. unendliche Mengen wie die natürlichen Zahlen, oder “unendliche” Graphen wie die Karte der Welt in einem Navigator Anwendungsbeispiel mit Iteratoren 16 import import java.util.Iterator; java.util.Iterator; ... ... class class Bestellung Bestellung {{ Prof. U. Aßmann, Softwaretechnologie, TU Dresden private private private private }} String String kunde; kunde; List<Bestellposition> List<Bestellposition> liste; liste; ... ... public public int int auftragssumme() auftragssumme() {{ Iterator<Bestellposition> Iterator<Bestellposition> ii == liste.iterator(); liste.iterator(); int int ss == 0; 0; while while (i.hasNext()) (i.hasNext()) ss += += i.next().positionspreis(); i.next().positionspreis(); return return s; s; }} ... ... Online: Bestellung2.java For-Schleifen auf IterablePrädikatschnittstellen 17 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Erbt eine Klasse von Iterable, kann sie in einer vereinfachten for-Schleife benutzt werden Typisches Implementierungsmuster class class BillItem BillItem extends extends Iterable Iterable {{ int int price; price; }} class class Bill Bill {{ int int sum sum == 0; 0; private private List List billItems; billItems; public public void void sumUp() sumUp() {{ for for (BillItem (BillItem item: item: billItems) billItems) {{ sum sum += += item.price; item.price; }} return return sum; sum; }} }} class class BillItem BillItem {{ int int price; price; }} class class Bill Bill {{ int int sum sum == 0; 0; private private List List billItems; billItems; public public void void sumUp() sumUp() {{ for for (Iterator (Iterator ii == billItems.iterator(); billItems.iterator(); i.hasNext(); i.hasNext(); )) {{ item item == i.next(); i.next(); sum sum += += item.price; item.price; }} return return sum; sum; }} }} 22.1.2 Senken (Sinks) 18 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Senke (Implementierungsmuster) 19 ► Name: Senke (auch: Ablage, sink, output stream, belt, pushsocket) ► Problem: Ablage eines beliebig großen Datenstromes. Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► – push – ggf. mit Abfrage, ob noch freier Platz in der Ablage vorhanden Lösung: Sink<T> {abstract} push(T) bool hasFreeSpace() Client ConcreteSink<T> push.. SinkMethode Erweiterung: Begriffshierarchie der Methodenarten 20 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Methode Zustandsverändernde Methoden Zustandsinvariante Methoden Iterator (input stream) Anfrage (query) Modifikatoren Allgemeine Methoden Checker Zustandsmodifikatoren Tester Senke (output stream) Netzmodifikatoren RepräsentationsWechsler 22.1.3 Channels (Pipes) 21 Die Kombination aus Senken und Iteratoren, ggf. mit beliebig großem Datenspeicher Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Channel und Pipe (Implementierungsmuster) ► Name: Ein Channel (Kanal, full stream) organisiert die gerichtete Kommunikation (Datenfluss) zwischen Produzenten und Konsumenten. ► Zweck: asynchrone Kommunikation mit Hilfe eines Puffers buffer ► Wir sprechen von einer Pipe (Puffer, buffer), wenn die Kapazität des Kanals endlich ist, d.h. hasFreeSpace() irgendwann false liefert. Prof. U. Aßmann, Softwaretechnologie, TU Dresden 22 Channel/Pipe<T> push of sink.. - buffer:Collection[T] push(T) bool hasFreeSpace() T pull() bool hasNext() Client pull of iterator.. ConcreteChannel<T> Zweck: asynchrone Kommunikation zwischen zwei Komponenten durch Pufferung eines beliebig großen Datenstromes mit Hilfe eines Puffers buffer – Kombination von push- und pull-Methoden (Iterator- und Ablagemethoden) – ggf. mit Abfrage, ob noch freier Platz in der Ablage vorhanden – ggf. mit Abfrage, ob noch Daten im Kanal vorhanden Channels in anderen Programmiersprachen 23 ► Channels (pipes) kommen in vielen Sprachen als Konstrukte vor – Shell-Skripte in Linux (Operator für pipes: “|”) – Communicating Sequential Processes (CSP, Hoare): ● Operator für pull: “?” Operator für push: “!” C++: Eingabe- und Ausgabestream stdin, stdout, stderr ● Operatoren “<<” (read) und “>>” (write) ● Prof. U. Aßmann, Softwaretechnologie, TU Dresden – – ► Architectural Description Languages (ADL, Kurs CBSE) Sie sind ein elementares Muster für die Kommunikation von parallelen Prozessen (producer-consumer-Muster) Wie organisiere ich die Kommunikation zweier Aktoren? 24 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Einsatzzweck: Ein Aktor ist ein parallel arbeitendes Objekt. Zwei Aktoren können mit Hilfe eines Kanals kommunizieren und lose gekoppelt arbeiten Bsp.: Pipes mit ihren Endpunkten (Sockets) organisieren den Verkehr auf den Internet; sie bilden Kanäle zur Kommunikation zwischen Prozessen (Producer-Consumer-Muster) Consumer<T> Producer<T> consumeItem() T produceItem() Channel<T> +int port-number -T buffer[SIZE] while (c.hasFreeSpace()) { c.push(produceItem()); }. push(T) bool hasFreeSpace() T pull() bool hasNext() while (c.hasNext()) { T item = c.pull(); work(T); }. Viele Prozesse in Softwaresystemen benötigen den Austausch von unendlichen Mengen von Daten. Wie repräsentiert man potentiell unendliche Mengen? Konnektoren 25 Def.: Def.:Ein EinKonnektor Konnektorist isteine einetechnische technischeKlasse, Klasse,die diezur zurKommunikation Kommunikation von Anwendungsklassen dient. von Anwendungsklassen dient. ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► ► Konnektoren verallgemeinern Kanäle; Kanäle bilden spezielle Konnektoren Kommunikation über Konnektoren muss nicht gerichtet sein; es können komplexe Protokolle herrschen Konnektoren können mehrere Input und Output Streams koppeln Consumer<T> Producer<T> T produceItem() c c consumeItem() Connector<T> while (c.hasFreeSpace()) { c.push(produceItem()); }. while (c.hasNext()) { T item = c.pull(); work(T); }. Begriffshierarchie von Klassen (Erweiterung) 26 Klasse Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Generische Klasse Abstrakte Klasse Rollenklasse Schnittstelle (interface) (Konkrete) Klasse Konnektor Algorithmenklasse Channel Prädikat-Schnittstelle Aufgabe: Grenzen Sie die Begriffe “Konnektor” und “Kanal” gegeneinander ab! Was unterscheidet einen Konnektor von einer Schnittstelle? was von einer generischen Klasse? 22.2 Input/Output und persistente Datenhaltung 27 Das JDK nutzt Iteratoren/Streams an verschiedenen Stellen Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik 22.2.1 Ein- und Ausgabe in Java 28 ► Die Klasse java.io.InputStream stellt einen Iterator/Stream in unserem Sinne dar. Sie enthält Methoden, um Werte einzulesen ► java.io.OutputStream stellt eine Senke dar. Sie enthält Methoden, um Werte auszugeben Die statischen Objekte in, out, err bilden die Sinks und Streams in und aus einem Programm, d.h. die Schnittstellen zum Betriebssystem Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► :System.in InputStream OutputStream int read() read(byte[] b) write(int i) write(byte[] b) FilterInputStream FilterOutputStream PrintStream println(String) print(char c) print(int i) :System.out Java-Anwendungen mit ihren StandardEin/Ausgabe-Strömen 29 ► Ein Programm in Java hat 3 Standard-Ströme ■ Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Entwurfsidee stammt aus dem UNIX/Linux-Sytem Notation: UML-Komponenten <<Iterator>> System.in:InputStream JavaApplication <<Sink>> System.out:PrintStream main(String[] argv) <<Sink>> System.err:PrintStream NewsReader enterNews(News) 22.2.2 Temporäre und persistente Daten 30 ► ► Daten sind – temporär, wenn sie mit Beendigung des Programms verloren gehen, das sie verwaltet; – persistent, wenn sie über die Beendigung des verwaltenden Programms hinaus erhalten bleiben. Objektorientierte Programme benötigen Mechanismen zur Realisierung der Persistenz von Objekten. Prof. U. Aßmann, Softwaretechnologie, TU Dresden – Einsatz eines Datenbank-Systems ● ● ● – Objektorientiertes Datenbank-System Relationales Datenbank-System Java: Java Data Base Connectivity (JDBC) Zugriffsschicht auf Datenhaltung Java: Java Data Objects (JDO) Speicherung von Objektstrukturen in Dateien mit Senken und Iteratoren ● Objekt-Serialisierung (Object Serialization) ● Die Dateien werden als Channels benutzt: ● Zuerst schreiben in eine Sink ● Dann lesen mit Iterator Objekt-Serialisierung in Java, eine einfache Form von persistenten Objekten 31 ► Die Klasse java.io.ObjectOutputStream und stellt eine Sink dar ■ – – Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Methoden, um ein Geflecht von Objekten linear darzustellen (zu serialisieren) bzw. aus dieser Darstellung zu rekonstruieren. Ein OutputStream entspricht dem Entwurfsmuster Sink Ein InputStream entspricht dem Entwurfsmuster Iterator Eine Klasse, die Serialisierung zulassen will, muß die (leere!) PrädikatSchnittstelle java.io.Serializable implementieren. class ObjectOutputStream { public ObjectOutputStream (OutputStream out) throws IOException; // push Method public void writeObject (Object obj) throws IOException; } Objekt-Serialisierung: Abspeichern 32 import java.io.*; Prof. U. Aßmann, Softwaretechnologie, TU Dresden class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } ... XClass xobj; ... FileOutputStream fos = new FileOutputStream("Xfile.dat"); ObjectOutputStream oos = new ObjectOutputStream(fos); // internally realized as push for all child objects oos.writeObject(xobj); // push ... Input und Output Streams im JDK Prof. U. Aßmann, Softwaretechnologie, TU Dresden 33 InputStream OutputStream int read() read(byte[] b) write(int i) write(byte[] b) FileInputStream ObjectInputStream FileOutputStream ObjectOutputStream :ois :oos 34 ► Die Klasse java.io.ObjectInputStream stellt einen Iterator/Stream in unserem Sinne dar ■ Methoden, um ein Geflecht von Objekten linear darzustellen (zu serialisieren ) bzw. aus dieser Darstellung zu rekonstruieren (zu deseralisieren) ■ Ein OutputStream entspricht dem Entwurfsmuster Sink Ein InputStream entspricht dem Entwurfsmuster Iterator Prof. U. Aßmann, Softwaretechnologie, TU Dresden ■ InputStream ObjectInputStream Objekt-Serialisierung: Einlesen 35 import java.io.*; Prof. U. Aßmann, Softwaretechnologie, TU Dresden class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } ... XClass xobj; ... FileInputStream fis = new FileInputStream("Xfile.dat"); ObjectInputStream ois = new ObjectInputStream(fis); // internally realised as pull xobj = (XClass) ois.readObject(); // pull 22.2.3 Ereignisse und Kanäle 36 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Kanäle eignen sich hervorragend zur Kommunikation mit der Außenwelt, da sie die Außenwelt und die Innenwelt eines Softwaresystems entkoppeln Ereignisse können in der Außenwelt asynchron stattfinden und auf einem Kanal in die Anwendung transportiert werden ■ Dann ist der Typ der Daten ein Ereignis-Objekt ■ In Java wird ein externes oder internes Ereignis immer durch ein Objekt repräsentiert 22.3 Assoziationen, Konnektoren, Kanäle und Teams 37 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Kollaborationen kapseln das Verhalten von Netzen 38 ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Statisch fixe Netze werden in UML durch n-stellige Assoziationen oder, wenn es um die Kommunikation der Objekte geht, durch Kollaborationen dargestellt. Def.: Eine Kollaboration (Teamklasse, collaboration) realisiert die Kommunikation eines fixen Netzes mit einem festen anwendungsspezifischen Protokoll Person Person Consumer Producer Consumer Message Person Item Person Person Consumer Producer Message Item Collaboration Consumer Person Kollaboration kapseln Interaktionsprotokolle 39 ► Kollaborationen beschreiben die anwendungsspezifische Interaktion, Nebenläufigkeit und Kommunikation eines Teams von Beteiligten ► Def.: Ein Team realisiert eine Kollaboration durch eine feste Menge von Rollenobjekten, koordiniert durch ein Hauptobjekt. Es wird oft mit einem Sequenzdiagramm als Verhalten unterlegt ■ ► Die einzelnen Lebenslinien geben das Verhalten einer Rolle der Kollaboration an Die Kollaboration beschreibt also ein Szenario querschneidend durch die Lebenszyklen mehrerer Objekte Termin Prof. U. Aßmann, Softwaretechnologie, TU Dresden Person Person Teambesprechung Organisator <<collaboration>> Teambesprechung organisieren <<role>> m3:Teil nehmer <<team>> Organisator erzeugen <<role>> tb1:Teambesprechung terminBestätigen() OK bestätigt terminBestätigen OK Teilnehmer Teilnehmer Person <<role>> m5:Teil nehmer Relationale Klassen (Konnektoren) 40 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Assoziation (Relation) Kollaboration (Teamklasse) Konnektor Channel Team Begriffshierarchie von Klassen (Erweiterung) 41 Assoziation (Relation) Klasse Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Generische Klasse Abstrakte Klasse Rollenklasse Schnittstelle (interface) Kollaboration (Teamklasse) (Konkrete) Klasse Konnektor Algorithmenklasse Channel Prädikat-Schnittstelle “Jetzt geht's rund”: Was bedeuten alle diese Begriffe? Achtung: Sie sollten nicht bis zur Klausur warten, die Bedeutung erklären zu können! The End Prof. U. Aßmann, Softwaretechnologie, TU Dresden 42 ► Einige Folien stammen aus den Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002. Used by permission. Iterator-Implementierungsmuster in modernen Sprachen Prof. U. Aßmann, Softwaretechnologie, TU Dresden 43 ► In vielen Programmiersprachen (Sather, Scala) stehen Iteratormethoden (stream methods) als spezielle Prozeduren zur Verfügung, die die Unterobjekte eines Objekts liefern können – Die yield-Anweisung gibt aus der Prozedur die Elemente zurück – Iterator-Prozedur kann mehrfach aufgerufen werden und damit als inputstream verwendet werden – Beim letzten Mal liefert sie null class class bigObject bigObject {{ private private List List subObjects; subObjects; public iterator public iterator Object Object deliverThem() deliverThem() {{ while (i in subObjects) while (i in subObjects) {{ yield yield i; i; // // Dieser Dieser Punkt Punkt im im Ablauf Ablauf wird wird sich sich als als Zustand Zustand gemerkt gemerkt // // Beim Beim nächsten nächsten Aufruf Aufruf wird wird hier hier fortgesetzt fortgesetzt }} }} }} .. .. BigObject BigObject bo bo == new new BigObject(); BigObject(); ... ... .. a = bo.deliverThem(); .. a = bo.deliverThem(); bb == bo.deliverThem();.. bo.deliverThem();..