22-st-iterators-chan..

Werbung
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();..
Herunterladen