Softwareentwurf - Analyse-Klassendiagramm - Universität Paderborn
Softwareentwurf - Analyse-Klassendiagramm - Universität Paderborn
Softwareentwurf - Analyse-Klassendiagramm - Universität Paderborn
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Eigentlich kennen wir bereits eine Notation, mit der<br />
man die Informationen aus der Tabelle darstellen kann:<br />
<strong>Klassendiagramm</strong>e<br />
Uns fehlen nur noch einige Ausdrucksmöglichkeiten<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 41
Operationen<br />
Kommissioniervorgang<br />
datum:Datum<br />
gib Anzahl Aufträge():Integer<br />
Navigationsrichtung<br />
Komissioniervorgang<br />
*<br />
Ausdrucksmittel in <strong>Analyse</strong>-<br />
<strong>Klassendiagramm</strong>en<br />
Zusätzliches Kompartment für<br />
Notation der Operationen einer<br />
Klasse<br />
speichert<br />
0..1<br />
KV Verwaltung<br />
Gibt an, dass eine Navigation von KV Verwaltung zu KV<br />
möglich ist.<br />
Achtung: Unabhängig von der Leserichtung!<br />
Unidirektionale und bidirektionale Navigation ist möglich<br />
Default (keine Pfeilspitzen) = beide Pfeilspitzen = bidir. Nav.<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 42
Umsetzen von <strong>Analyse</strong>-Tabellen ins<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Jede Klasse der <strong>Analyse</strong>-Tabelle wird eine Klasse im<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Klasse<br />
GUI<br />
SysStrg<br />
KV Verwaltung<br />
KV<br />
KVStrg<br />
GUI<br />
KV Verwaltung<br />
SysStrg<br />
Kommissioniervorgang<br />
KVStrg<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 43
Umsetzen von <strong>Analyse</strong>-Tabellen ins<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Gefundene Attribute und Operationen werden eingetragen<br />
Klasse Aufgaben Attribute<br />
KV gib Anzahl Aufträge():Integer<br />
gibt die Anzahl der Aufträge im<br />
Kommissioniervorgang zurück<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 44<br />
KV<br />
Anzahl Aufträge:Integer<br />
gib Anzahl Aufträge():Integer<br />
Anzahl Aufträge:Integer<br />
Die Anzahl der im<br />
Kommissioniervorgang enthaltenen<br />
Aufträge
Umsetzen von <strong>Analyse</strong>-Tabellen ins<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Dauerhaftes Bekanntsein wird zu (gerichteten) Assoziationen<br />
Klasse Aufgaben Attribute Kennt (dauerhaft?)<br />
SysStrg KV Verwaltung (ja)<br />
SysStrg KV Verwaltung<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 45
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Abschließen der Erstellung des <strong>Analyse</strong>-Klassenendigrammes:<br />
Assoziationen vervollständigen (Namen und Kardinalitäten)<br />
Bei Assoziationen zwischen Entity-Klassen: Gibt es bereits eine<br />
Assoziation im Modell des Problembereichs?<br />
enthält<br />
Lagerfach Lagerfeld<br />
4..12<br />
1<br />
Bei Assoziationen mit mindestens einer neu gefundenen Klasse:<br />
Was ist ein sinnvoller Name? Wie sind die Kardinalitäten?<br />
SysStrg KV Verwaltung<br />
1<br />
1<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 46
Problem<br />
Pflichtenheft<br />
Problem<br />
System<br />
<strong>Analyse</strong>dokument<br />
Genereller Überblick über die Beziehungen<br />
der Dokumente etc.?<br />
Ziele<br />
Beschreibung des<br />
Problembereichs<br />
Zusammenfassen der<br />
Informationen<br />
(über die <strong>Analyse</strong>-<br />
Tabellen)<br />
Architektur<br />
Modell des<br />
Problembereichs<br />
Geschäftsfeld<br />
Struktur Verhalten<br />
<strong>Analyse</strong>-<br />
<strong>Klassendiagramm</strong><br />
Produktfunktionen<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 47<br />
1.<br />
1.<br />
2.<br />
2.<br />
3.<br />
3.<br />
<strong>Analyse</strong>-Sequenzdiagramm
Yo, jetzt seh‘ ich<br />
wieder klarer, thnx!<br />
Aber haben wir jetzt<br />
nicht nur ein<br />
<strong>Klassendiagramm</strong><br />
durch ein anderes<br />
ersetzt?<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 48
Problem<br />
Pflichtenheft<br />
Problem<br />
System<br />
<strong>Analyse</strong>dokument<br />
Ziele<br />
Beschreibung des<br />
Problembereichs<br />
Architektur<br />
MdP vs.<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Modell des<br />
Problembereichs<br />
Geschäftsfeld<br />
Struktur Verhalten<br />
vs.<br />
<strong>Analyse</strong>-<br />
<strong>Klassendiagramm</strong><br />
Produktfunktionen<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 49<br />
1.<br />
1.<br />
2.<br />
2.<br />
3.<br />
3.<br />
<strong>Analyse</strong>-Sequenzdiagramm
Modell des Problembereichs<br />
Beschreibt das Problemgebiet<br />
Enthält Begriffe des Problembereichs<br />
Alle Klassen sind gleich<br />
Assoziationen sind ungerichtet<br />
MdP vs.<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Beschreibt unseren Lösungsansatz<br />
Übernimmt manche dieser Begriffe<br />
als Gegenstandsklassen<br />
Verwirft manche dieser Begriffe als<br />
irrelevant<br />
Integriert oder spaltet manche dieser<br />
Begriffe (z.B. KV Steuerung)<br />
Enthält komplett neue, lösungsorientierte<br />
Klassen (z.B.<br />
Übergangsklassen)<br />
Ordnet die Klassen verschiedenen<br />
Ebenen der Architektur zu<br />
Assoziationen sind gerichtet<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 50
Relevanter Ausschnitt des MdP:<br />
1<br />
26<br />
{ordered}<br />
Karussell<br />
Lagerfeld<br />
-Zulässiges Gewicht : Decimal<br />
1<br />
4..12<br />
{ordered}<br />
Lagerfach<br />
-Zulässiges Gewicht : Decimal<br />
-Höhe : Decimal<br />
MdP vs. <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Beispiel V-DHC<br />
Auftrag<br />
-Auftragsnummer : String<br />
-Bestelldatum : Date<br />
-Priorität : Decimal<br />
0..1<br />
Auslagerungsauftrag<br />
Charge<br />
-Nummer : Decimal<br />
-Verfallsdatum : Date<br />
liegt in<br />
1..* wird erledigt durch<br />
1<br />
Kommissioniervorgang<br />
Warengruppe<br />
-Bezeichnung : String<br />
-Gewicht pro Ware : Decimal<br />
-maxAnzahl pro Fach : Decimal<br />
-Standardlagerfach : String<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 51<br />
1<br />
0..*<br />
1..*<br />
von<br />
1<br />
1<br />
zusammengestellt in<br />
0..*<br />
Ware<br />
1..*<br />
Los<br />
0..* 0..1<br />
enthält Waren von<br />
1<br />
1..*
MdP vs. <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Beispiel V-DHC<br />
Relevanter Ausschnitt des <strong>Analyse</strong>-KD (nach den oben gezeigten Sequenzdiagrammen)<br />
-ID : int<br />
+gibID() : int<br />
-ID : int<br />
GUI<br />
1<br />
4..12<br />
{ordered}<br />
Lagerfeld<br />
Lagerfach<br />
+getLagerfeld() : Lagerfeld<br />
+getID() : int<br />
0..1<br />
KV Verwaltung<br />
+starteKV()<br />
+zeigeAnzahlAufträge(Integer)() +gibNaechsten() : Kommissioniervorgang<br />
zeigt an<br />
1<br />
1<br />
1<br />
1<br />
zeigt an<br />
1<br />
1<br />
KVStrg<br />
+starteKV()<br />
SysStrg<br />
+kommissioniere(in kv : Kommissioniervorgang)<br />
+kommissioniere() : Los<br />
LosStrg<br />
DHCStrg<br />
+steuereAnFachAnzahl(in lf : Lagerfach, in anz : int)<br />
liegt in<br />
0..1 *<br />
Kommissioniervorgang<br />
-AnzahlAutraege : int<br />
+gibAnzahlAuftraege() : int<br />
-Anzahl : int<br />
+gibLagerfach() : Lagerfach<br />
zusammengestellt<br />
+gibAnzahl()<br />
in<br />
: int<br />
1..*<br />
+gibLagerfach() : Lagerfach<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 52<br />
0..*<br />
Ware<br />
1<br />
Schedule<br />
+gibNaechstesLos() : Los<br />
1..*<br />
Los<br />
0..1
MdP vs. <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
Beispiel V-DHC<br />
Relevanter Ausschnitt des <strong>Analyse</strong>-KD (nach den oben gezeigten Sequenzdiagrammen)<br />
-ID : int<br />
+gibID() : int<br />
-ID : int<br />
GUI<br />
1<br />
4..12<br />
{ordered}<br />
Lagerfeld<br />
Lagerfach<br />
+getLagerfeld() : Lagerfeld<br />
+getID() : int<br />
0..1<br />
KV Verwaltung<br />
+starteKV()<br />
+zeigeAnzahlAufträge(Integer)() +gibNaechsten() : Kommissioniervorgang<br />
zeigt an<br />
1<br />
1<br />
1<br />
1<br />
zeigt an<br />
1<br />
1<br />
KVStrg<br />
+starteKV()<br />
SysStrg<br />
+kommissioniere(in kv : Kommissioniervorgang)<br />
+kommissioniere() : Los<br />
LosStrg<br />
DHCStrg<br />
+steuereAnFachAnzahl(in lf : Lagerfach, in anz : int)<br />
liegt in<br />
0..1 *<br />
Kommissioniervorgang<br />
-AnzahlAutraege : int<br />
+gibAnzahlAuftraege() : int<br />
-Anzahl : int<br />
+gibLagerfach() : Lagerfach<br />
zusammengestellt<br />
+gibAnzahl()<br />
in<br />
: int<br />
1..*<br />
+gibNaechstesLos() : Los<br />
+gibLagerfach() : Lagerfach<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 53<br />
0..*<br />
Ware<br />
1<br />
Schedule<br />
1..*<br />
Los<br />
0..1
Stimmt, da haben wir eine Menge<br />
dazugelernt<br />
Und in den Sequenzdiagrammen<br />
stecken<br />
auch noch Details über<br />
die internen Abläufe<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 54
Aber dürfen Kontrollklassen auf<br />
Boundaryklassen zeigen?<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 55
Wir erinnern uns:<br />
Drei Schichten Architektur<br />
Jede Schicht ist zur darüberliegenden ein Server<br />
Abschluss der <strong>Analyse</strong><br />
Verfeinerung der Architektur<br />
Jede Schicht ist Client der darunterliegenden Schicht<br />
Wir hatten (erstmal) eine Drei-Schichten-Architektur vereinbart<br />
Nach der <strong>Analyse</strong> wissen wir jetzt viel mehr Details über<br />
unser System<br />
Haben wir uns an die Architektur gehalten?<br />
Wissen wir jetzt mehr Details über die Architektur?<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 56
Nochmal das <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
+starteKV()<br />
+zeigeAnzahlAufträge(Integer)()<br />
zeigt an<br />
1<br />
+starteKV()<br />
-ID : int<br />
+gibID() : int<br />
1<br />
1<br />
SysStrg<br />
GUI<br />
Lagerfeld<br />
1<br />
4..12<br />
{ordered}<br />
1<br />
zeigt an<br />
1<br />
+kommissioniere(in kv : Kommissioniervorgang)<br />
Lagerfach<br />
-ID : int<br />
+getLagerfeld() : Lagerfeld<br />
+getID() : int<br />
1<br />
KV Verwaltung<br />
+gibNaechsten() : Kommissioniervorgang<br />
0..*<br />
liegt in<br />
0..1<br />
Überprüfung der Architektur<br />
+steuereAnFachAnzahl (in lf : Lagerfach, in anz : int)<br />
KVStrg<br />
Ware<br />
DHCStrg<br />
+gibLagerfach() : Lagerfach<br />
+kommissioniere() : Los<br />
0..1 *<br />
1..*<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 57<br />
Los<br />
0..1<br />
-Anzahl : int<br />
+gibLagerfach() : Lagerfach<br />
+gibAnzahl() : int<br />
LosStrg<br />
Kommissioniervorgang<br />
-AnzahlAutraege : int<br />
+gibAnzahlAuftraege() : int<br />
zusammengestellt in<br />
1..*<br />
1<br />
Schedule<br />
+gibNaechstesLos() : Los
Nochmal das <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
+starteKV()<br />
+zeigeAnzahlAufträge(Integer)()<br />
zeigt an<br />
1<br />
+starteKV()<br />
1<br />
1<br />
SysStrg<br />
GUI<br />
Lagerfeld<br />
-ID : int<br />
+gibID() : int<br />
1<br />
+kommissioniere(in kv : Kommissioniervorgang)<br />
1<br />
KVStrg<br />
KV Verwaltung<br />
0..1<br />
Überprüfung der Architektur<br />
DHCStrg<br />
+steuereAnFachAnzahl(in lf : Lagerfach, in anz : int)<br />
+gibNaechsten() : Kommissioniervorgang<br />
4..12<br />
{ordered}<br />
Ware<br />
Zwischen dem Kommissioniervorgang<br />
und dem Schedule besteht eine<br />
Verbindung, die sichtbar wird, wenn<br />
der Konstruktor des Schedules 0..*<br />
liegt in<br />
analysiert wird [<strong>Analyse</strong>-KD ist hier<br />
noch unvollständig]<br />
Lagerfach<br />
-ID : int<br />
+getLagerfeld() : Lagerfeld<br />
+getID() : int<br />
+gibLagerfach() : Lagerfach<br />
+kommissioniere() : Los<br />
0..1 *<br />
1..*<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 58<br />
0..1<br />
Los<br />
-Anzahl : int<br />
+gibLagerfach() : Lagerfach<br />
+gibAnzahl() : int<br />
Steuerungsklassen existieren<br />
häufig nur temporär (für einen<br />
bestimmten Zweck) und haben<br />
keine dauerhaften Assoziationen<br />
LosStrg<br />
Kommissioniervorgang<br />
-AnzahlAutraege : int<br />
+gibAnzahlAuftraege() : int<br />
zusammengestellt in<br />
1..*<br />
+gibNaechstesLos() : Los<br />
1<br />
Schedule
Nochmal das <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
+starteKV()<br />
+zeigeAnzahlAufträge(Integer)()<br />
zeigt an<br />
1<br />
Logikschicht<br />
+starteKV()<br />
Datenhaltungsschicht<br />
-ID : int<br />
+gibID() : int<br />
1<br />
1<br />
SysStrg<br />
GUI<br />
Lagerfeld<br />
1<br />
-ID : int<br />
4..12<br />
{ordered}<br />
1<br />
zeigt an<br />
1<br />
+kommissioniere(in kv : Kommissioniervorgang)<br />
Lagerfach<br />
+getLagerfeld() : Lagerfeld<br />
+getID() : int<br />
1<br />
KV Verwaltung<br />
+gibNaechsten() : Kommissioniervorgang<br />
0..1<br />
Überprüfung der Architektur<br />
+steuereAnFachAnzahl(in lf : Lagerfach, in anz : int)<br />
KVStrg<br />
0..*<br />
liegt in<br />
Ware<br />
DHCStrg<br />
+gibLagerfach() : Lagerfach<br />
0..1 *<br />
1..*<br />
-Anzahl : int<br />
+kommissioniere() : Los<br />
Präsentationsschicht<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 59<br />
Los<br />
0..1<br />
+gibLagerfach() : Lagerfach<br />
+gibAnzahl() : int<br />
LosStrg<br />
Kommissioniervorgang<br />
-AnzahlAutraege : int<br />
+gibAnzahlAuftraege() : int<br />
zusammengestellt in<br />
1..*<br />
+gibNaechstesLos() : Los<br />
1<br />
Schedule
Nochmal das <strong>Analyse</strong>-<strong>Klassendiagramm</strong><br />
+starteKV()<br />
+zeigeAnzahlAufträge(Integer)()<br />
zeigt an<br />
1<br />
Logikschicht<br />
+starteKV()<br />
Datenhaltungsschicht<br />
-ID : int<br />
+gibID() : int<br />
1<br />
1<br />
SysStrg<br />
GUI<br />
Lagerfeld<br />
1<br />
-ID : int<br />
4..12<br />
{ordered}<br />
1<br />
zeigt an<br />
1<br />
+kommissioniere(in kv : Kommissioniervorgang)<br />
Lagerfach<br />
+getLagerfeld() : Lagerfeld<br />
+getID() : int<br />
1<br />
KV Verwaltung<br />
+gibNaechsten() : Kommissioniervorgang<br />
0..1<br />
Überprüfung der Architektur<br />
+steuereAnFachAnzahl(in lf : Lagerfach, in anz : int)<br />
KVStrg<br />
0..*<br />
liegt in<br />
Ware<br />
DHCStrg<br />
+gibLagerfach() : Lagerfach<br />
0..1 *<br />
1..*<br />
-Anzahl : int<br />
+kommissioniere() : Los<br />
Präsentationsschicht<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 60<br />
Los<br />
0..1<br />
+gibLagerfach() : Lagerfach<br />
+gibAnzahl() : int<br />
LosStrg<br />
Kommissioniervorgang<br />
-AnzahlAutraege : int<br />
+gibAnzahlAuftraege() : int<br />
zusammengestellt in<br />
1..*<br />
+gibNaechstesLos() : Los<br />
1<br />
Schedule
<strong>Analyse</strong> von „KV kommissionieren“<br />
:GUI :KVStrg kv1:KV<br />
zeige Anzahl<br />
Aufträge(3)<br />
gib Anzahl<br />
Aufträge()<br />
3<br />
new Schedule (kv1)<br />
gib nächstes Los ()<br />
l1<br />
new LosStrg()<br />
kommissioniere (l1)<br />
gib nächstes Los ()<br />
…<br />
s:Schedule<br />
Vom Sequenzdiagramm<br />
zur <strong>Analyse</strong>-Tabelle<br />
l1:Los<br />
:LosStrg<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 61
<strong>Analyse</strong> von „Los kommissionieren“<br />
:LosStrg l1:Los<br />
gib Lagerfach()<br />
fa<br />
gib anzahl()<br />
12<br />
gib Lagerfach()<br />
fa<br />
:Ware<br />
steuere an Fach Anzahl(fa,12)<br />
fa:Lagerfach<br />
Vom Sequenzdiagramm<br />
zur <strong>Analyse</strong>-Tabelle<br />
fe:Lagerfeld<br />
gib Lagerfeld()<br />
fe<br />
gib ID()<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 62<br />
1<br />
gib ID()<br />
16<br />
:DHCStrg<br />
steuereAn<br />
FeldFachAnz<br />
(16,1,12)
Aufwärtskommunikation<br />
in der 3-Schichten-Architektur<br />
Wie gelangen Informationen über den aktuellen Systemzustand zum<br />
Display?<br />
Antworten<br />
Berechne<br />
Berechne<br />
2+2<br />
4<br />
:GUI<br />
Berechne<br />
Wert(„2+2“)<br />
:Strg<br />
Problem: Die Art der Ausgabe kann sich abhängig von der<br />
Verarbeitung des Inputs ändern<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 63<br />
4
Aufwärtskommunikation<br />
in der 3-Schichten-Architektur<br />
Wie gelangen Informationen über den aktuellen Systemzustand zum<br />
Display?<br />
Antworten mit Informationen über Anzeige<br />
Berechne<br />
2/(3-x)<br />
Es ist ein Fehler<br />
aufgetreten:<br />
Division by Zero<br />
:GUI<br />
Berechne<br />
Wert(„2/(3-x)“)<br />
„Fehlerscreen“,<br />
„Division by Zero“<br />
:Strg<br />
Problem: Dieses Ein-Ausgabemuster entspricht nicht zeitgemäßen,<br />
interaktiven Systemen<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 64
Aufwärtskommunikation<br />
in der 3-Schichten-Architektur<br />
Wie gelangen Informationen über den aktuellen Systemzustand zum<br />
Display?<br />
Polling<br />
:GUI<br />
Berechne<br />
Wert(„2/(3-x)“)<br />
getUpdate<br />
getUpdate<br />
getUpdate<br />
„Ergebnis“,“2“<br />
:Strg<br />
Problem: Dieses Muster ist unschön anzusehen und nicht<br />
gewinnbringend in der <strong>Analyse</strong><br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 65
Lösung<br />
Aufwärtskommunikation<br />
in der 3-Schichten-Architektur<br />
Ein Boundary Objekt der <strong>Analyse</strong> verkapselt (immer) ein relativ komplexes<br />
System (GUI Klassen, Dialogkontrolle, externe Protokolle…)<br />
Erweiterung des Boundary Begriffes um eine Fassadenklasse in der<br />
Logikschicht<br />
Freie Kommunikation in der Präsentationsschicht<br />
Logikschicht möglich<br />
Unabhängigkeit vom<br />
Informationstransport<br />
zur echten Schnittstelle Logikschicht<br />
Datenhaltungsschicht<br />
«boundary» «boundary»<br />
«control»<br />
«control»<br />
«entity» «entity»<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 66
Lösungspattern(intern):<br />
:GUI<br />
Berechne<br />
Wert(„2/(3-x)“)<br />
getUpdate<br />
getUpdate<br />
getUpdate<br />
„Ergebnis“,“2“<br />
:GUIFassade<br />
Berechne<br />
Wert(„2/(3-x)“)<br />
zeigeErgebnis(„2“)<br />
Aufwärtskommunikation<br />
in der 3-Schichten-Architektur<br />
Erkenntnis für uns: Wir können mit der GUI kommunizieren, ohne<br />
die Architektur zu verletzen. Interne Realisierung dann über das o.g. Pattern<br />
:Strg<br />
im <strong>Analyse</strong>-SD:<br />
:GUI :Strg<br />
Berechne<br />
Wert(„2/(3-x)“)<br />
zeigeErgebnis(„2“)<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 67
Wichtige Erkenntnis:<br />
Ergebnis der <strong>Analyse</strong><br />
Die „Objekte“ (und damit auch Klassen) in der <strong>Analyse</strong><br />
erfordern (teilweise) noch eine Realisierung durch<br />
komplexe Strukturen.<br />
<strong>Analyse</strong> Klassen ≠ Implementationsklassen<br />
<strong>Analyse</strong> Klassen ≈ Interfaces<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 68
In der <strong>Analyse</strong><br />
Zusammenfassung <strong>Analyse</strong><br />
Legen wir die grundsätzliche Architektur des Systems fest<br />
Verfeinern wir die Produktfunktionen durch <strong>Analyse</strong>-<br />
Sequenzdiagramme<br />
Fassen wir die dabei gewonnenen strukturellen Informationen erst<br />
zu Tabellen, dann zu einem <strong>Analyse</strong>-<strong>Klassendiagramm</strong> zusammen<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 69
<strong>Analyse</strong>-Sequenzdiagramme<br />
Wozu sie gut sind<br />
Wie man sie zeichnet<br />
Welche Elemente ihnen zugrunde liegen<br />
Was Sie gelernt haben sollten<br />
Welche Prinzipien Sie bei der Erstellung berücksichtigen sollten<br />
<strong>Analyse</strong>-Tabellen<br />
Welche Informationen hier einzutragen sind<br />
Welche Probleme dabei auftreten können<br />
<strong>Analyse</strong>-<strong>Klassendiagramm</strong>e<br />
Welche neuen Notationselemente diese enthalten<br />
Wie man sie aus den Tabellen ableitet<br />
Was man sonst noch einfügen muss<br />
Wie sie sich vom Modell des Problembereichs unterscheiden<br />
<strong>Softwareentwurf</strong> 2008/089 <strong>Universität</strong> <strong>Paderborn</strong> - Gregor Engels 70