Betreff: "Softwaretechnologie für Einsteiger" 2. Auflage 22. Netze mit Datenfluss Kommunikation mit Iteratoren, Kanälen und Konnektoren 1 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 Prof. Dr. Uwe Aßmann 1) Channels 1) Entwurfsmuster Iterator (Stream) 2) Entwurfsmuster Sink 3) Channel Fakultät für Informatik Technische Universität Dresden Version 14-0.9, 20.04.12 2) I/O und Persistente Datenhaltung 3) Ereigniskanäle 4) Konnektoren Prof. U. Aßmann, Softwaretechnologie, TU Dresden Lehrstuhl Softwaretechnologie ► Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Warum müssen Softwareingenieure fortgeschrittenes Wissen besitzen? 3 ► Die Konkurrenz ist hart: Zu den Kosten der Arbeit: Überblick Teil II 4 Höhere Sprachen Graphen als Sprachkonstrukte Graphen als Konnektoren (Rollen-Kollaborationen) Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden Graphen als Entwurfsmuster http://www.heise.de/resale/imgs/17/1/0/0/1/3/4/1/ArbeitskostenEULaenderStart20129bb2e8b041f1342e.png 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 +name:String +preis:int +bestellNummer:int -anzahl:String -preis:int Bestellung * 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 Anwendungsklassen mit Datenfluss von Anwendungsklassen mit Datenflussdient. dient. +kunde:String 1 +create:Bestellung Prof. U. Aßmann, Softwaretechnologie, TU Dresden Warenkatalog +name:String warenkat +aussuchen():Artikel Kunde Bestellung ausloesen() WebShop shop annehmen(Artikel) kunde while (true) { b = Bestellung.create(); b.workOn(); b.ship(): }. while (hatBedarf()) { artikel = warenkat.aussuchen(); shop.bestellen(artikel); }. Vorteil von Kanälen 7 ► ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► T produceItem() Ideal für Netze mit dynamisch wechselnden Partnern Ideal für Webprogrammierung << channel<T> >> consumeItem() c while () { c.push(produceItem()); }. while (c.hasNext()) { T item = c.pull(); work(T); }. E.22.1 Lernen mit Begriffshierarchien, die die Vorlesung querschneiden Webshops dürfen die konkreten Objekte ihrer Kunden nicht kennen Kanäle erlauben, die Partner zu wechseln, ohne Kenntnis des Netzes ■ Consumer<T> Producer<T> Problem Partnerwechsel ■ UML Notation: Andoncken eines Kanals an ports Prof. U. Aßmann, Softwaretechnologie, TU Dresden 8 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(): }. Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Querschneidende Begriffshierarchien 9 ► 22.1 Entwurfsmuster Channel Wie lernt man mit Ihnen? ■ Klassen-Taxonomie ■ Methoden-Taxonomie Realisierungen von Graphen ■ Prof. U. Aßmann, Softwaretechnologie, TU Dresden 10 Achtung, wir erweitern in dieser Vorlesung wieder die bereits begonnenen, den Kurs querschneidenden Taxonomien! Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Wie organisiere ich die “unendlich lange” Kommunikation zweier Aktoren? 11 ► ■ ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► 22.1.1 Entwurfsmuster Iterator (Eingabestrom, input stream) Problem: Über der Zeit laufen in einem Webshop eine Menge von Bestellungen auf 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) Kanäle bestehen aus mit einander verbundenen Enden, mindestens zweien Webshop<Artikel> Kunde<Artikel> produceItem():Artikel 12 consumeItem(Artikel) Sink Output Stream StreamServer<Video> produceItem():Page Iterator Input Stream StreamingClient<Video> consumeItem(Page) Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Iterator (Input Stream) (Implementierungsmuster) 13 ► Iterator-Beispiel in der JDK (ArrayList) Ein Eingabestrom (input stream) ist eine potentiell unendliche Folge von Objekten (zeitliche Anordnung einer pot. unendlichen Folge) 14 {abstract} Element next()/ getNext()/ pull() bool hasNext() elements(): Iterator <<create>> * pull.. IteratorMethode Prof. U. Aßmann, Softwaretechnologie, TU Dresden Iterator<Element> Container<Element> 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 ■ 1 Bestellung – kunde: String – anzahl: int <<create>> Klassenname nicht bekannt, weil privat (z.B. ArrayListIterator) Element Anwendungsbeispiel mit Iteratoren 16 import import java.util.Iterator; java.util.Iterator; ... ... class class Bestellung Bestellung {{ private private String String kunde; kunde; private private List<Bestellposition> List<Bestellposition> liste; liste; Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► ► java.util.ArrayList <Bestellposition> add(o: Bestellposition) liste get(pos: int): Bestellposition iterator(): Iterator <Bestellposition> Concrete Iterator Bestellposition Implementierungsmuster Iterator 15 Aggregate ConcreteIterator <Element> Element <<interface>> java.util.Iterator <Bestellposition> bool hasNext() Bestellposition next() Iterator <Bestellposition> * Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Eingabe in eine Klasse oder Komponente }} ... ... 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 ► 22.1.2 Senken (Sinks) 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 void public void sumUp() sumUp() {{ for (BillItem for (BillItem item: item: billItems) billItems) {{ sum sum += += item.price; item.price; }} return return sum; sum; }} }} 18 class class BillItem BillItem {{ int int price; price; }} class class Bill Bill {{ int sum = 0; int sum = 0; private private List List billItems; billItems; public public void void sumUp() sumUp() {{ for (Iterator for (Iterator ii == billItems.iterator(); billItems.iterator(); i.hasNext(); i.hasNext(); )) {{ item = i.next(); item = i.next(); sum sum += += item.price; item.price; }} return return sum; sum; }} }} Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Entwurfsmuster Senke (Implementierungsmuster) ► Name: Senke (auch: Ablage, sink, output stream, belt, pushsocket) ► Problem: Ablage eines beliebig großen Datenstromes. – – Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► 20 Methode 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 Prof. U. Aßmann, Softwaretechnologie, TU Dresden 19 Erweiterung: Begriffshierarchie der Methodenarten Zustandsverändernde Methoden Zustandsinvariante Methoden Iterator (input stream) Anfrage (query) Modifikatoren Allgemeine Methoden Checker Zustandsmodifikatoren Tester Senke (output stream) Netzmodifikatoren RepräsentationsWechsler Entwurfsmuster Channel und Pipe (Implementierungsmuster) 21 Die Kombination aus Senken und Iteratoren, ggf. mit beliebig großem Datenspeicher 22 ► 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.1.3 Channels (Pipes) Channel/Pipe<T> - buffer:Collection[T] push(T) bool hasFreeSpace() Client 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) 24 Sie sind ein elementares Muster für die Kommunikation von parallelen Prozessen (producer-consumer-Muster) Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden – ► ► ► ● – ConcreteChannel<T> Wie organisiere ich die Kommunikation zweier Aktoren? Channels in anderen Programmiersprachen ► pull of iterator.. T pull() bool hasNext() Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik 23 push of sink.. 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); }. Begriffshierarchie von Klassen (Erweiterung) Konnektoren 25 26 Def.: Def.:Ein EinKonnektor Konnektorist isteine einetechnische technischeKlasse, Klasse,die diezur zurKommunikation Kommunikation von Anwendungsklassen dient. von Anwendungsklassen dient. ► 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); }. Partielle Klasse Generische Klasse Abstrakte Klasse Rollenklasse Schnittstelle (interface) (Konkrete) Klasse Konnektor Algorithmenklasse Channel Prädikat-Schnittstelle 22.2.1 Ein- und Ausgabe in Java 22.2 Input/Output und persistente Datenhaltung 27 28 Das JDK nutzt Iteratoren/Streams an verschiedenen Stellen Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik ► ► ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden 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 Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Klasse 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 30 ► Entwurfsidee stammt aus dem UNIX/Linux-Sytem ■ ► 22.2.2 Temporäre und persistente Daten Notation: UML-Komponenten ► JavaApplication <<Sink>> System.out:PrintStream main(String[] argv) <<Sink>> System.err:PrintStream NewsReader enterNews(News) Objekt-Serialisierung in Java, eine einfache Form von persistenten Objekten ► Die Klasse java.io.ObjectOutputStream und stellt eine Sink dar ■ – – Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► 32 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; } 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. 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: Abspeichern import java.io.*; class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } Prof. U. Aßmann, Softwaretechnologie, TU Dresden 31 – – Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden <<Iterator>> System.in:InputStream Daten sind ... 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 33 34 InputStream OutputStream int read() read(byte[] b) write(int i) write(byte[] b) ► 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 FileInputStream FileOutputStream ObjectInputStream ObjectOutputStream :ois Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden ■ InputStream ObjectInputStream :oos Objekt-Serialisierung: Einlesen 35 import java.io.*; 22.2.3 Ereignisse und Kanäle 36 ... XClass xobj; ... FileInputStream fis = new FileInputStream("Xfile.dat"); ObjectInputStream ois = new ObjectInputStream(fis); // internally realised as pull xobj = (XClass) ois.readObject(); // pull ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } ► 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 Kollaborationen kapseln das Verhalten von Netzen 38 ► ► Prof. U. Aßmann, Softwaretechnologie, TU Dresden 37 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 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Kollaboration kapseln Interaktionsprotokolle 39 Consumer Person Item Relationale Klassen (Konnektoren) ► 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 Kollaboration beschreibt also ein Szenario querschneidend durch die Lebenszyklen mehrerer Objekte ■ Collaboration 40 Assoziation (Relation) Die einzelnen Lebenslinien geben das Verhalten einer Rolle der Kollaboration an Termin Person 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 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden Person Teambesprechung Kollaboration (Teamklasse) Konnektor Channel Team Begriffshierarchie von Klassen (Erweiterung) The End 41 42 Assoziation (Relation) Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Generische Klasse Abstrakte Klasse Rollenklasse Schnittstelle (interface) Einige Folien stammen aus den Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002. Used by permission. Kollaboration (Teamklasse) (Konkrete) Klasse Konnektor Algorithmenklasse Channel Prof. U. Aßmann, Softwaretechnologie, TU Dresden Klasse ► Prädikat-Schnittstelle 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 Beim nächsten nächsten Aufruf Aufruf wird wird hier hier fortgesetzt 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 3 ► 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 ► ► Die Konkurrenz ist hart: Zu den Kosten der Arbeit: Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden 2 Warum müssen Softwareingenieure fortgeschrittenes Wissen besitzen? http://www.heise.de/resale/imgs/17/1/0/0/1/3/4/1/ArbeitskostenEULaenderStart20129bb2e8b041f1342e.png Überblick Teil II 4 Höhere Sprachen Beispiel: Bestellung auf dem Webshop Graphen als Sprachkonstrukte 5 Bestellung Bestellposition * Artikel Graphen als Konnektoren (Rollen-Kollaborationen) +name:String +preis:int +bestellNummer:int -anzahl:String -preis:int * 1 +kunde:String +create:Bestellung 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 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden Graphen als Entwurfsmuster 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 Vorteil von Kanälen 7 Def.: Def.:Ein EinKanal Kanal(channel, (channel,stream) stream)ist istein einLink, Link,der derzur zurKommunikation Kommunikation von vonAnwendungsklassen Anwendungsklassenmit mitDatenfluss Datenflussdient. dient. ► 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 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); }. E.22.1 Lernen mit Begriffshierarchien, die die Vorlesung querschneiden Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► ► Problem Partnerwechsel 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(): }. Querschneidende Begriffshierarchien 9 ► Wie lernt man mit Ihnen? ■ Klassen-Taxonomie ■ Methoden-Taxonomie ■ Realisierungen von Graphen Prof. U. Aßmann, Softwaretechnologie, TU Dresden 8 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Achtung, wir erweitern in dieser Vorlesung wieder die bereits begonnenen, den Kurs querschneidenden Taxonomien! 22.1 Entwurfsmuster Channel Wie organisiere ich die “unendlich lange” Kommunikation zweier Aktoren? 11 ► Problem: Über der Zeit laufen in einem Webshop eine Menge von Bestellungen auf ► Frage: Wie repräsentiert man potentiell unendliche Collections? Antwort: mit Kanälen. ■ 10 Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► Sie sind aber nicht in endlicher Form in Collections zu repräsentieren Consumer<T> Producer<T> consumeItem(Object) produceItem():Object Webshop<Artikel> Kunde<Artikel> consumeItem(Artikel) produceItem():Artikel StreamingClient<Video> StreamServer<Video> consumeItem(Page) produceItem():Page Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik 22.1.1 Entwurfsmuster Iterator (Eingabestrom, input stream) 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? Entwurfsmuster Iterator (Input Stream) (Implementierungsmuster) 13 ► Ein Eingabestrom (input stream) ist eine potentiell unendliche Folge von Objekten (zeitliche Anordnung einer pot. unendlichen Folge) ► Eingabe in eine Klasse oder Komponente Kanäle bestehen aus mit einander verbundenen Enden, mindestens zweien Sink Output Stream Iterator Input Stream Prof. U. Aßmann, Softwaretechnologie, TU Dresden 12 Iterator<Element> {abstract} elements(): Iterator pull.. IteratorMethode <<create>> * Element Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Element next()/ getNext()/ pull() bool hasNext() Container<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 Implementierungsmuster Iterator Iterator-Beispiel in der JDK (ArrayList) 14 15 Element Verwendungsbeispiel: Verwendungsbeispiel: Concrete Iterator <<create>> Klassenname nicht bekannt, weil privat (z.B. ArrayListIterator) 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()); }} Prof. U. Aßmann, Softwaretechnologie, TU Dresden java.util.ArrayList <Bestellposition> add(o: Bestellposition) liste get(pos: int): Bestellposition iterator(): Iterator <Bestellposition> 1 * Prof. U. Aßmann, Softwaretechnologie, TU Dresden Aggregate Bestellung – kunde: String – anzahl: int ► ► <<interface>> java.util.Iterator <Bestellposition> bool hasNext() Bestellposition next() Iterator <Bestellposition> ► Einsatzzwecke: ■ Verbergen der inneren Struktur ■ bedarfsgesteuerte Berechnungen ■ “unendliche” Datenstrukturen 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. 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 For-Schleifen auf IterablePrädikatschnittstellen Anwendungsbeispiel mit Iteratoren 16 import import java.util.Iterator; java.util.Iterator; ... ... 17 }} Online: Bestellung2.java Prof. U. Aßmann, Softwaretechnologie, TU Dresden 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; }} ... ... ► ► class class Bestellung Bestellung {{ 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; }} }} Entwurfsmuster Senke (Implementierungsmuster) 22.1.2 Senken (Sinks) 19 ► Name: Senke (auch: Ablage, sink, output stream, belt, pushsocket) ► Problem: Ablage eines beliebig großen Datenstromes. ► Lösung: – push – ggf. mit Abfrage, ob noch freier Platz in der Ablage vorhanden Prof. U. Aßmann, Softwaretechnologie, TU Dresden 18 Sink<T> {abstract} push(T) bool hasFreeSpace() Client ConcreteSink<T> Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Erweiterung: Begriffshierarchie der Methodenarten 22.1.3 Channels (Pipes) 20 Methode Prof. U. Aßmann, Softwaretechnologie, TU Dresden 21 Zustandsverändernde Methoden Zustandsinvariante Methoden Iterator (input stream) Anfrage (query) Modifikatoren Die Kombination aus Senken und Iteratoren, ggf. mit beliebig großem Datenspeicher Allgemeine Methoden Checker Zustandsmodifikatoren Tester Senke (output stream) Netzmodifikatoren RepräsentationsWechsler Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik push.. SinkMethode Entwurfsmuster Channel und Pipe (Implementierungsmuster) 22 Channels in anderen Programmiersprachen ► 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. ► 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) ● Channel/Pipe<T> push of sink.. - buffer:Collection[T] push(T) bool hasFreeSpace() pull of iterator.. T pull() bool hasNext() Client Prof. U. Aßmann, Softwaretechnologie, TU Dresden 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) 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 Wie organisiere ich die Kommunikation zweier Aktoren? 24 ► ► 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) Konnektoren 25 Def.: Def.:Ein EinKonnektor Konnektorist isteine einetechnische technischeKlasse, Klasse,die diezur zurKommunikation Kommunikation von vonAnwendungsklassen Anwendungsklassendient. dient. ► 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? Prof. U. Aßmann, Softwaretechnologie, TU Dresden 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) 22.2 Input/Output und persistente Datenhaltung 26 Klasse 27 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Generische Klasse (Konkrete) Klasse Das JDK nutzt Iteratoren/Streams an verschiedenen Stellen Konnektor Abstrakte Klasse Algorithmenklasse Rollenklasse Schnittstelle (interface) Channel Prädikat-Schnittstelle Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Aufgabe: Grenzen Sie die Begriffe “Konnektor” und “Kanal” gegeneinander ab! Was unterscheidet einen Konnektor von einer Schnittstelle? was von einer generischen Klasse? Java-Anwendungen mit ihren StandardEin/Ausgabe-Strömen 22.2.1 Ein- und Ausgabe in Java ► 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) 29 :System.out ► Ein Programm in Java hat 3 Standard-Ströme ► Notation: UML-Komponenten ■ Prof. U. Aßmann, Softwaretechnologie, TU Dresden 28 Entwurfsidee stammt aus dem UNIX/Linux-Sytem <<Iterator>> System.in:InputStream JavaApplication <<Sink>> System.out:PrintStream main(String[] argv) <<Sink>> System.err:PrintStream NewsReader enterNews(News) Objekt-Serialisierung in Java, eine einfache Form von persistenten Objekten 22.2.2 Temporäre und persistente Daten ► ► 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. ● ● – 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: Abspeichern 32 import java.io.*; 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; } 33 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden // internally realized as push for all child objects oos.writeObject(xobj); // push ... Methoden, um ein Geflecht von Objekten linear darzustellen (zu serialisieren) bzw. aus dieser Darstellung zu rekonstruieren. Ein OutputStream entspricht dem Entwurfsmuster Sink Input und Output Streams im JDK 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); Die Klasse java.io.ObjectOutputStream und stellt eine Sink dar – Einsatz eines Datenbank-Systems ● ► ■ Objektorientierte Programme benötigen Mechanismen zur Realisierung der Persistenz von Objekten. – Prof. U. Aßmann, Softwaretechnologie, TU Dresden 31 Prof. U. Aßmann, Softwaretechnologie, TU Dresden 30 InputStream OutputStream int read() read(byte[] b) write(int i) write(byte[] b) FileInputStream ObjectInputStream FileOutputStream ObjectOutputStream :ois :oos Objekt-Serialisierung: Einlesen ► 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 ■ 35 InputStream ObjectInputStream 22.2.3 Ereignisse und Kanäle 36 ► 22.3 Assoziationen, Konnektoren, Kanäle und Teams 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 ... XClass xobj; ... FileInputStream fis = new FileInputStream("Xfile.dat"); ObjectInputStream ois = new ObjectInputStream(fis); // internally realised as pull xobj = (XClass) ois.readObject(); // pull 37 Prof. U. Aßmann, Softwaretechnologie, TU Dresden ► import java.io.*; class XClass implements Serializable { private int x; public XClass (int x) { this.x = x; } } Prof. U. Aßmann, Softwaretechnologie, TU Dresden 34 Softwaretechnologie, © Prof. Uwe Aßmann Technische Universität Dresden, Fakultät Informatik Kollaborationen kapseln das Verhalten von Netzen ► 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 Consumer Producer Consumer Message Person Item Person Person Consumer Producer Message Collaboration ► 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 Kollaboration beschreibt also ein Szenario querschneidend durch die Lebenszyklen mehrerer Objekte ■ Die einzelnen Lebenslinien geben das Verhalten einer Rolle der Kollaboration an Termin Organisator erzeugen Teilnehmer <<role>> m3:Teil nehmer <<team>> Teilnehmer Person <<role>> m5:Teil nehmer <<role>> tb1:Teambesprechung terminBestätigen() OK bestätigt Person terminBestätigen OK Begriffshierarchie von Klassen (Erweiterung) Relationale Klassen (Konnektoren) 40 <<collaboration>> Teambesprechung organisieren Organisator Consumer Item Person Teambesprechung Person Person Person 39 Prof. U. Aßmann, Softwaretechnologie, TU Dresden 38 Kollaboration kapseln Interaktionsprotokolle 41 Assoziation (Relation) Klasse Assoziation (Relation) Konnektor Channel Team Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden Partielle Klasse Kollaboration (Teamklasse) Generische Klasse Kollaboration (Teamklasse) (Konkrete) Klasse Konnektor Abstrakte Klasse Algorithmenklasse Rollenklasse Schnittstelle (interface) 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! Iterator-Implementierungsmuster in modernen Sprachen The End ► Einige Folien stammen aus den Vorlesungsfolien zur Vorlesung Softwaretechnologie von © Prof. H. Hussmann, 2002. Used by permission. 43 Prof. U. Aßmann, Softwaretechnologie, TU Dresden Prof. U. Aßmann, Softwaretechnologie, TU Dresden 42 ► 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 Beim nächsten nächsten Aufruf Aufruf wird wird hier hier fortgesetzt fortgesetzt }} }} }} .. .. BigObject BigObject bo bo == new new BigObject(); BigObject(); ... ... .. .. aa == bo.deliverThem(); bo.deliverThem(); bb == bo.deliverThem();.. bo.deliverThem();..