22-st-iterators

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