AT -- Konstruktion - software

Werbung
AT -- Konstruktion
1
AT -- Konstruktion
...................................
Summary:
Die Konstruktion beschreibt die modulare Gestaltung eines Softwaresystems, d.h. seinen Aufbau
aus Bausteinen und deren Zusammenspiel. Die Konstruktion abstrahiert von Details der
Programmierung, nimmt aber auf grundsätzliche Gegebenheiten der Programmier- und
Betriebsplattform Rücksicht.
4 Architektursicht Konstruktion
Ein Softwaresystem aus der Sicht der Anwendung zu betrachten und zu bewerten ist naheliegend, ebenso der Blick
auf seine programmtechnische Realisierung: Die Anwendung ist der Zweck des Systems und der Programmcode
seine Verwirklichung. Aber was ist die Konstruktion? Wie bei jedem technischen Produkt liegt auch bei Software
der Realisierung eine Überlegung zugrunde, wie sie hergestellt – wir sagen: konstruiert – wird. Die Konstruktion ist
die gedankliche Brücke zwischen Anwendung und Programm. Sie beschreibt die modulare Gestaltung eines
Softwaresystems. Dessen Architekt fängt von beiden Seiten das Denken und Konstruieren an: vom fachlichen
Problem her und von der technischen Plattform, auf die er die Anwendung zu bauen hat.
Die Architektursicht Konstruktion sollte unabhängig sein von Programmiertechniken, die zur Realisierung der
Software eingesetzt werden. Dies ist Sache der Architektursicht Programm.
4.1 Modularität
Der Begriff Modularität bezeichnet die Sicht auf die modulare Gestaltung eines technischen Systems, d.h. seinen
Aufbau aus Bausteinen und deren Zusammenspiel. Im Falle von Softwaresystemen sind das Module und
Komponenten, (Unter)Programme und Makros, Dateien und Datenbanken, (Betriebssystem)Prozesse, etc. Sie
benutzen einander in unterschiedlicher Weise, etwa durch Aufrufe, Nachrichtenaustausch, Datenzugriffe. In diesen
Benutzungsbeziehungen drückt sich das dynamische Zusammenwirken der Bausteine aus.
Jedes Softwaresystem hat eine irgendwie geartete Struktur. Was aber macht eine gute Struktur aus, was sind
Kriterien einer guten Modularität? Wie lässt sich damit die Komplexität beherrschen, die großen Softwaresystemen
zwangsläufig innewohnt? Nach [Denert 91], Seite 213: „Allgemein ausgedrückt, zeichnet sich eine gute
Modularisierung durch hohe Kohäsion (interne Bindung) und geringe Kopplung (externe Bindung) der Module aus.“
Anders ausgedrückt: Ein Baustein realisiert eine bestimmte Funktionalität, diese ist nicht über mehrere Bausteine
verteilt; er kommuniziert mit anderen Bausteinen über schmale Schnittstellen. Das ist in den meisten technischen
Gebieten selbstverständlich. So sind beispielsweise im System Auto Motor und Getriebe klar separierte Einheiten,
die in wohldefinierter Weise zusammenarbeiten. In der Software ist das oft nicht so klar. Der Code einer
zusammengehörenden Funktionalität kann weit verstreut und somit die Schnittstelle zu anderen Bausteinen
unübersichtlich sein.
Zur Gestaltung von Software-Architektur besonders gut geeignet ist die Methode der Objektorientierung mit ihrem
Grundkonzept, zusammengehörige Daten und die auf ihnen operierenden Funktionen zusammenzufassen in einer
Einheit, einer Klasse, einem Modul. Man spricht auch davon, dass die Daten von den Funktionen gekapselt werden,
der Zugriff auf sie also nur über die Funktionen möglich ist (Datenkapselung, data encapsulation). Dieses
Modulkonzept hat seinen Ursprung in zwei miteinander korrespondierenden softwaretechnischen Entwicklungen:
• Erstens in dem Anfang der 1970er Jahre von Parnas, Guttag und anderen propagierten Konzept der
Datenabstraktion. Parnas hat damals das Geheimnisprinzip (information hiding) formuliert: Man muss die interne
programmtechnische Struktur der Daten nicht kennen, um das Modul nutzen zu können. Sie wird nach außen
hinter dessen Funktionen verborgen, die somit eine abstrakte Sicht auf die Daten bieten. Man spricht deshalb von
AT -- Konstruktion
Datenabstraktionsmodulen und von abstrakten Datentypen, für die Guttag die Methode der algebraischen
Spezifikation entwickelt hat.
• Zweitens in der objektorientierten Programmierung, beginnend mit Simula in der zweiten Hälfte der 1960er Jahre,
die heute das dominierende Programmierparadigma ist. Die Datenabstraktion findet sich darin wieder in Form der
Klasse mit ihren Variablen und Methoden.
Diese beiden zunächst programmiertechnischen Entwicklungen sind so grundlegend, dass sie ein prägendes Konzept
sind für die Konstruktionssicht auf die Software-Architektur.
Wie erzielt man nun gute Software-Modularität? Es gibt dafür ein Repertoire an Prinzipien, Methoden, Techniken
und Darstellungsformen:
• Da ist zuvorderst die schon genannte Objektorientierung.
• Vor allem schafft man gute Modularität durch geeignete Abstraktionen (separation of concerns) mit gut
gewählten und präzise definierten Begriffen aus der Anwendungswelt oder der systemtechnischen Umgebung, je
nachdem um welche Art Baustein es geht.
• Ein probates Mittel der Strukturierung besteht darin, Softwareschichten zu bilden.
• Es gibt ein umfangreiches Repertoire an Entwurfsmustern (design patterns), initiiert durch das Buch von [Gamma
et al 95]. Diese Muster beschreiben auch exemplarisch die technische Umsetzung. Für die Konstruktion
interessiert uns nur ihre Entwurfsidee.
• Querschnittskonzepte für Fehlerbehandlung, Sicherheit etc. sollten durchgängig und einheitlich eingesetzt
werden.
• Eine gut gestaltete und gut lesbare Dokumentation der Software und ihrer Architektur trägt zwar nur mittelbar zur
Modularität bei, ist jedoch für ihr Verständnis notwendig und nützlich und spiegelt ihre Güte wider: (un)klare
Dokumentation – (un)übersichtliche Modularität.
4.2 Konzepte der Konstruktion
Im Kontext der Konstruktion sprechen wir davon, dass ein Software-System aus Modulen aufgebaut ist, die
ihrerseits durch Schnittstellen definiert sind. Zudem benutzen wir den Begriff Komponente, um Zusammenfassungen
von Modulen zu bezeichnen.
Die Abbildung
veranschaulicht, wie diese Begriffe
zueinander stehen und zeigt, dass ein
System aus Komponenten aufgebaut
ist, evtl. über mehreren Ebenen, und
letztlich aus Modulen besteht. Eine
derartige Konstruktionszeichnung stellt
die statische Struktur der Software dar,
wie sie im Quellcode realisiert ist oder
werden soll. Sie zeigt nicht ihr
dynamisches Verhalten. Dafür gibt es
in der Konstruktion selbstverständlich
auch Darstellungen, etwa in Form von
Daten- und Kontrollfluss-Diagrammen,
Zustandsautomaten u.ä.m.
Diese Begriffe werden in den
folgenden Abschnitten erläutert. Man
2
AT -- Konstruktion
beachte, dass wir uns dabei nicht auf Konzepte bestimmter Programmiersprachen beziehen. Diese sind der →
Architektursicht Programm vorbehalten.
4.2.1 Modul
In der Konstruktion geht es um den modularen Aufbau eines Softwaresystems. Wie das Wort modular schon
andeutet, ist das Modul ein zentrales Konzept der Konstruktion.
Ein gut gestaltetes Modul realisiert eine (und nur eine) bestimmte Funktionalität, es ist auf einen Sachverhalt
(Know-how) konzentriert und nicht ein Sammelsurium unterschiedlicher Aspekte. Anders und informatisch
ausgedrückt: Ein Modul ist eine untrennbare Einheit aus Funktionen und Daten; Veränderungen der Daten sind nur
über die Benutzung der Funktionen möglich.
Das erwähnte Geheimnisprinzip hat in der Konstruktion keinen Platz – es kommt erst in der Programmsicht zum
Tragen –, denn es gibt keine programmtechnisch bedingten Datenstrukturen zu verbergen, wie es etwa get()-und
set()-Methoden in Programmen tun. Die Konstruktion kennt sie nicht, sie ist vielmehr ein offenes Buch: Die
Daten(strukturen), die hier eine Rolle spielen, stammen aus der Anwendungssicht, es sind durchweg Attribute von
Anwendungsobjekten.
4.2.1.1 Modulschnittstelle
„The connections between modules are the assumptions which the modules make about each other.” Diese
historische Formulierung von Parnas (IFIP-Kongress 1971) erscheint vage, charakterisiert jedoch, worum es geht:
um die Gestaltung der Beziehungen – der Schnittstellen – zwischen den Modulen eines Softwaresystems. Sie prägen
seine Architektur; seine Funktionalität und Leistung entstehen in der Interaktion seiner Bausteine. Die Kunst der
Konstruktion liegt in der Gestaltung der Schnittstellen.
Ein Modul bietet seine Leistungen nach außen, d.h. anderen Modulen, über Schnittstellen an, durch deren Festlegung
das Modul spezifiziert (definiert) ist. Eine Schnittstelle besteht aus einer oder mehreren Funktionen mit deren
Parametern. Bei Anwendungsfunktionen sind letztere Attribute der Anwendungssicht.
Module können mehrere Schnittstellen haben, derart dass Funktionen zu Gruppen zusammengefasst werden, die
spezialisiert sind für unterschiedliche Nutzungsweisen durch andere Module. Module bieten (exportieren) ihre
Schnittstellen anderen Modulen an und nutzen (importieren) ihrerseits die Schnittstellen anderer. Die Differenz
zwischen den Leistungen, die Module importieren, und jenen, die sie exportieren, ist ihre Wertschöpfung.
Damit ein Modul benutzt werden kann, muss seine Schnittstelle bekannt sein. Sie – und damit der Modul an sich –
ist definiert (spezifiziert) durch Syntax und Semantik, also eine formale Festlegung, wie die Schnittstelle zu benutzen
ist, und eine inhaltliche Definition des Effekts, den die Benutzung zur Folge hat. Dieser Effekt kann sein das
Speichern, Berechnen und Bereitstellen von Daten sowie das Ausführen bestimmter Aktionen.
Die Spezifikation der Schnittstelle sollte möglichst präzise und verständlich formuliert und dokumentiert sein, damit
der Benutzer eine klare Vorstellung davon bekommt, was er von dem Modul zu erwarten hat und nicht auf
Mutmaßungen angewiesen ist. Man spricht auch davon, dass die Spezifikation eine Art Vertrag ist zwischen
nutzendem und genutztem Modul.
Module können auf zweierlei Weise kommunizieren: Frage & Antwort oder einseitige Mitteilung. Dabei ist zu
beachten, ob ein Modul, das einem anderen dient, zustandslos ist oder ein Gedächtnis hat, in dem der Zustand der
bisherigen Kommunikation vermerkt ist. Eine spezielle Form zustandsbehafteter Module sind solche, die ein
Protokoll, also die Regeln zur Kommunikation zwischen Systemen, realisieren.
Es gibt verschiedenartige Kommunikationskanäle, über die Module interagieren können:
• Kettenartige Weitergabe von Dateien und zugehörigen Verarbeitungsanweisungen (Batches)
• Prozedur-/Unterprogrammaufruf innerhalb eines Lademoduls
3
AT -- Konstruktion
4
• entfernter Prozeduraufruf (remote procedure call) über die Grenzen von Betriebssystemprozessen oder gar
Rechnern hinweg (z.B. CORBAE, SOAP, rmi, REST)
• Nachrichten (uni- und bidirektional), Subskriptionsmechanismen
• Ereignis/Signal, das eine Modulfunktion aktiviert
• Austausch über die Veränderung gemeinsam genutzten Speichers (shared Memory, Datenbank)
Eine ausführliche Darstellung zu diesem Thema findet sich bei [Taylor].
Diese Kanäle haben unterschiedliche Reichweiten, von ganz nah (innerhalb einer Objektcodeeinheit) bis ganz weit
(über das Internet), sie können innerhalb des eigenen Rechnersystems bzw. -netzes liegen oder dieses mit anderen
Systemen verbinden. Sobald die Kommunikation das eigene System verlässt, ist Vorsicht geboten, denn die
Kontrolle liegt dann anderswo. Techniken zur Sicherung der Kommunikation können nötig werden, damit die zu
übertragenden Daten nicht verfälscht oder missbraucht werden können.
4.2.1.2 Benutzungsbeziehungen
Ein Modul wird mittels seiner Funktionen benutzt. In der Konstruktion kann es jedoch mitunter genügen,
Benutzungsbeziehungen auf der Ebene von Modulnamen festzulegen. Auf einer Übersichtsebene und bei freien
textuellen Beschreibungen sind Modulnamen zur Charakterisierung der beteiligten Partner ausreichend. Beispiel:
...................................
"Beim Anlegen eines neuen BuchTitels wird die nächste freie Nummer von der
ISBN-Verwaltung besorgt".
Bei semi-formalen Konstruktionsbeschreibungen wird man Modul-Benutzungen durch die Angabe von
Funktionsnamen präzisieren und Parameterübergaben andeuten:
...................................
"Die Funktion BuchTitel.anlegen() benutzt
ISBNVerwaltung.nächsteFreieISBN(BuchTitel.Sachgebiet)".
Wie derartige Notationen unter dem Gesichtspunkt der Präzision, Informationsdichte und Lesbarkeit bewertet
werden, ist eine Ermessensfrage. Das zusätzliche Detail (die Vergabe einer ISBN hängt offenbar vom Sachgebiet des
BuchTitels ab) hätte man auch in der freien sprachlichen Formulierung unterbringen können. Abzuraten ist von
Worten wie "this" oder "self", um das handelnde Modul zu referenzieren. Derartige Schlüsselwörter aus dem
Begriffsapparat der objektorientierten Programmierung passen nicht in die sprachliche Ebene der Konstruktion.
Possesivpronomina drücken den Sachverhalt elegant aus und machen zudem klar, dass Module als selbstständig
handlungsfähige Wesen aufgefasst werden können. Hier ein Formulierungsvorschlag:
...................................
Der BuchTitel fragt unter Angabe 'seines' Sachgebiets bei der ISBNVerwaltung nach
der nächsten freien Nummer.
Ein Problem des Erzählstils sei nicht verschwiegen: Allzuleicht passiert es, dass man in Usecase-artige Schilderung
von Prozessabläufen gerät und dabei Informationen an der falschen Stelle landen:
...................................
"Der Buchtitel fragt die ISBNVerwaltung nach der nächsten freien Nummer. Diese verwaltet
aus historischen Gründen spezielle Nummernkreise je Sachgebiet."
Der Umstand, dass die ISBNVerwaltung "Nummernkreise" kennt und über Funktionen verfügt, solche
Nummernkreise einzurichten und Sachgebieten zuzuordnen, hat nichts bei der Beschreibung des BuchTitels zu
suchen. Sie gehört zum Modul ISBNVerwaltung.
AT -- Konstruktion
4.2.2 Komponente
Der Begriff Komponente hat im IT-Sprachgebrauch keine scharf umrissene Bedeutung, er wird meist vage für alles
Mögliche gebraucht, das ein strukturbildendes Element sein soll. Dennoch benutzen auch wir dieses Wort, und zwar
in folgendem Sinn: Eine Komponente ist eine Gruppierung (Zusammenfassung, Menge) von Modulen oder
Komponenten, die hauptsächlich dem Aufzeigen von Zusammenhängen und somit auch der Dokumentation dient,
siehe Abbildung Konzepte und Begriffe der Perspektive Konstruktion.pptx.
Solche Zusammenhänge können sein:
• Schichtenbildung (Zugriffs-/Treiberschicht, Anwendungslogik (-kern), Benutzer-Schnittstelle
• mehrere Module, die in einer sachlichen Beziehung stehen, z.B. Verwalter und ihre Objekte, etwa Konto und
Kontoverwalter
Ein Modul kann in mehreren Komponenten enthalten sein. Es ist dann wie eine Kopie zu sehen, nicht jedoch zu
verwechseln mit dem Erzeugen eines Objekts einer Klasse, wie dies in der objektorientierten Programmierung zur
Laufzeit geschieht.
4.2.2.1 Komponentenschnittstelle
Die Schnittstelle einer Komponente besteht in der Regel aus einer Teilmenge der Funktionen ihrer Module, denn der
Sinn ihr ist es, eine größere Funktionalität modular zu strukturieren. Einige Module werden nur komponentenintern
verwendet, ihre Funktionen werden nach außen nicht (oder nur teilweise) angeboten. Sie erscheinen wie
"Subunternehmer" der Komponente.
4.2.3 System
Mit dem Begriff (Software-) System bezeichnen wir ein eigenständiges Ganzes, das auf die Eingabe von
Informationen mit einer wohldefinierten Reaktion antwortet, indem es Informationen speichert, transformiert und
ausgibt. Es dient Menschen bei der Informationsgewinnung und -verarbeitung oder der Steuerung von Maschinen
bzw. Geräten. Ein Subsystem, auch Teilsystem genannt, ist ein eigenständiges System, das jedoch im Verbund eines
umfassenderen Systems läuft.
4.2.3.1 Systemschnittstelle
Systemschnittstellen sind von anderer Art als Modul- und Komponentenschnittstellen, denn sie dinen der
Kommunikation mit der Außenwelt. Dabei ist wiederum zu unterscheiden zwischen der Schnittstelle zu einem
menschlichen Benutzer – Benutzeroberfläche genannt – und zur technischen Umgebung eines Systems, etwa in
Form von Sensoren und Aktoren.
4.3 Aspekte der Konstruktion
(davon gibt es wohl noch mehr, als im Folgenden aufgeführt)
5
AT -- Konstruktion
6
4.3.1 Fachlicher Nutzen und technisches Fundament
Die Konstruktion geht primär von den fachlichen Inhalten und Anforderungen des Systems aus, den
Anwendungsfunktionen, wie sie vom Auftraggeber definiert sind und vom Anwender benutzt werden. Sie stellen die
Anwendungssicht dar. Die Konstruktion definiert dafür fachliche Module. Diese sind spezifisch für das jeweilige
System; sie werden vollständig, präzise und möglichst unabhängig von der technischen Umsetzung beschrieben.
Die Anwendungsfunktionen bedürfen eines Fundaments von Basisfunktionen. Sie sind für das Funktionieren des
Systems erforderlich, werden jedoch vom Benutzer nicht wahrgenommen und sind für ihn auch nicht direkt von
Bedeutung, z.B. Fehlerbehandlung. Welche Basisfunktionen im Einzelfall nötig sind, hängt teilweise von den
Erwartungen des Auftraggebers ab, etwa von seinen Ansprüchen in Bezug auf Vertraulichkeit von Dateninhalten,
aber auch von den Möglichkeiten und Grenzen der vorgesehenen Betriebsplattform. Oft gibt es Standardlösungen für
Basisfunktionen, die von verschiedenen Anwendungen genutzt werden können, denn sie hängen nur von der
technischen Umsetzung auf der Plattform ab. Zwei Beispiele:
...................................
Datenzugriffsschicht
Betriebswirtschaftlich geprägte Systeme beruhen meist auf einem großen Datenbestand, der in
relationaler Form gespeichert wird. Wird die Fachlogik objektorientiert programmiert, so entsteht
ein Strukturbruch, der durch technische Module überwunden werden kann (objekt-relationale
Zugriffsschicht). Sie sind oft mit Code-Generatoren oder Frameworks realisiert. Die
Konstruktionssicht legt Richtlinien zum Einsatz solcher Werkzeuge fest und beschreibt
exemplarisch die Abbildung eines typischen fachlichen Objekts auf seine Repräsentation in der
Datenbank.
Fehlerbehandlung
Die Konstruktion legt Richtlinien zur Nutzung der entsprechenden Exception-Handling-Konzepte
in der Programmierumgebung fest. Für heterogene Client-Server-Umgebungen beschreibt die
Konstruktion, ob bzw. wie Remote-Exceptions ihren Weg vom Server zum Client finden. Weniger
wichtig ist hingegen, dass jede einzelne denkbare Ausnahmesituation erkannt und beschrieben
wird. Eine vergröberte Betrachtung und die exemplarische Beschreibung typischer
Ausnahmesituationen sind für die Konstruktionssicht ausreichend.
4.3.2 Schichten
Ein probates Mittel der Strukturierung in der Konstruktion besteht darin, Softwareschichten zu bilden. Klassisch sind
drei Schichten: Komponenten und Module für die
1. Steuerung der Schnittstellen zur Außenwelt (Anwender, Sensoren/Aktoren)
2. Anwendungslogik
3. Schnittstellen zum Basissystem (Betriebssystem, Geräte, Kommunikation etc.)
4.3.3 Parallelität
Betriebliche Systeme sind datenintensiv und speichern langlebige Objekte in Datenbanken. Sie haben meist viele
Benutzer. Letzteres zeigt sich jedoch nicht in der Modulstruktur, sondern in der Nutzung von Mechanismen der
Systemplattform, das sind vor allem Transaktionsmonitor, Betriebs- und Datenbanksystem. Letztlich sind es
Betriebssystemprozesse, in denen die Transaktionen der gleichzeitig aktiven Benutzer parallel ausgeführt werden.
Somit kann sich die Konstruktion beschränken auf die modulare Gestaltung der Funktionalität für einen einzelnen
Benutzer und muss nur festlegen, wie deren Ausführung für die vielen Benutzer vom Basissystem zu organisieren
ist.
Sie gibt außerdem vor, wie Konflikte behandelt werden, die dadurch entstehen können, dass mehrere Benutzer
gleichzeitig mit denselben Daten arbeiten. Man muss zwischen zwei grundsätzlich verschiedenen Strategien
entscheiden: Konfliktvermeidung (ex ante) oder Konfliktbewältigung (ex post). Letztere nennt man optimistisch,
weil sie auf der Annahme beruht, dass der Konfliktfall nur selten eintritt und es dann schon gut gehen wird. Die
AT -- Konstruktion
Ex-ante-Strategie heißt pessimistisch, weil sie für hohe Konflikthäufigkeit vorgesehen ist; ihre Realisierung ist
aufwendig. Parallele Programmierung ist erheblich schwieriger und fehleranfälliger als sequenzielle. Deshalb soll
man sie möglichst vermeiden (auch wenn sie viele Programmierer intellektuell reizt). Es ist Sache der Konstruktion,
mit welchen Systemmechanismen die tatsächlich notwendige Parallelverarbeitung realisiert wird.
4.3.4 Mehrere Exemplare eines Moduls
Das Modul als gedankliche Einheit aus Daten und Funktionen repräsentiert ein fachlichen Konzept. Es wird einmalig
in der Konstruktion beschrieben und in der Regel auch nur einmal als Programm implementiert - es sei denn,
technische Umstände erzwingen eine Programmierung des selben Moduls in unterschiedlichen Sprachen, wie dies
z.B. bei Apps heute nötig ist, die auf Apple-Geräten und auf Android verfügbar sein sollen.
Manchmal hat man es innerhalb eines Moduls explizit mit unterschiedlichen Exemplaren eines (anderen) Moduls zu
tun. Beispielsweise wird man sich sich in einer Rechnung auf mehrere RechnungsPositionen beziehen.
Man iteriert etwa über die Positionen, um deren Gesamtwert zu ermitteln. Die Rechnung besteht aus 1..n
Exemplaren der RechnungsPosition - klassische Datenmodelle oder UML-Klassendiagramme beschreiben
solche 1:N-Beziehungen.
Exkurs in die Programmsicht:
In der Datenbank sind die Positionen über irgendeinen (fachlichen oder technischen) Schlüsselbegriff miteinander
verknüpft. Ein Programm hat mehrer Möglichkeiten, den Rechnungsbetrag zu ermitteln:
1. Das Programm kann dafür sorgen, dass die Rechnung sich "ihre" Positionen über ein geeignetes SQL-Statement
holt, um die Werte zu addieren. Dieses "Holen" ist eine technische Transformation von persistenten Daten in
Objekte des Arbeitsspeichers. Sind die Positionen geladen, so ensteht im Arbeitsspeicher ein Ausschnitt des
persistenten Objektgeflechts, bei dem die Objekte über Pointer (Verweise auf Adressen im Arbeitsspeicher)
verbunden sind. Die Rechnung kann irgendein technisches Konstrukt zur Verwaltung von Mengen (Array,
Collection-Klasse) dazu benutzen, die Verweise auf "ihre" Positionen zu verwalten. Ist der Rechnungsbetrag
ermittelt, so stehen die RechnungsPositionen weiterhin zur Verfügung, etwa um Verkaufsstatistiken zu
aktualisieren.
2. Alternativ kann das Programm dafür sorgen, dass die Positionen sequentiell geholt werden, wobei eine Position
jedoch sofort wieder "vergessen wird", wenn ihr Wert zur Rechnungssumme addiert wurde. Die Liste der
Positions-Exemplare existiert dann nicht innerhalb des Arbeitsspeichers. Jedes Exemplar existiert nur während
der Addition im Arbeitsspeicher.
3. Das Programm kann den Prozess der Addition komplett an die Datenbank delegieren, zumindest, wenn es sich
um eine relativ einfache mathematische Operation handelt. Selbst wenn die Operationen komplizierter werden,
könnte eine Implementierung die entsprechenden Algorithmen als "Triggerfunktionen" für die Datenbank
bereitstellen, so dass sie beim Iterieren über die RechnungsPositionen unter der Kontrolle der Datenbank
ausgeführt werden. Die Verknüpfung der Rechnung zu ihrer Position ist dann quasi "automatisch" da. Wie lange
sie lebt, hängt vom Entwurf des SQL-Statements ab.
Was bedeutet das für die Konstruktion?
Einerseits muss die Konstruktion grundlegende Vorgaben für die technische Umsetzung machen. Beispielsweise
muss sie festlegen, ob die Variante (3) erlaubt sein soll, oder nicht. Denn dieser Weg geht in der Regel mit
Abhängigkeiten vom Hersteller der Datenbank einher.
Auf der anderen Seite sollte die Konstruktion den Summationsvorgang möglichst allgemein gültig beschreiben. Es
genügt, wenn sie in der Vorstellung lebt, dass Rechnungen mit ihren Rechnungspositionen verknüpft sind. Das
Modul Rechnung kennt die ihm zugeordneten Exemplare der RechnungsPosition und kann daher deren
Schnittstelle benutzen. Es kann über 'seine' Positionen iterieren und muss dazu nicht jedesmal einen gedanklichen
Schritt der Art "hole alle meine Positionen" vorwegschalten. Ob Variante (1) oder (2) bei der technischen
Umsetzung zweckmäßiger sind, kann nach unserem Verständnis der Programm-Sicht überlassen werden.
7
AT -- Konstruktion
4.3.5 Bezeichner und Sprache
Wenn die Konstruktion an bestimmten Stellen Bezeichner (Namen) für Module, Attribute oder Funktionen
verwendet, stellt sich die Frage nach deren Übertragbarkeit in die Programmsicht. Ein Merkmal wie "nächste freie
ISBN" ist wegen des Umlauts nur in wenigen Programmiersprachen syntaktisch zulässig. Es ist das erklärte Ziel der
Konstruktion, als Basis für unterschiedliche Implementierungen brauchbar zu sein. Begriffliche Konsistenz zwischen
Konstruktion und Programm ("Traceability") ist generell wünschenswert. Die Konstruktionssicht tut daher gut daran,
Namen so zu wählen, dass sie 1:1 oder durch eine bijektive Abbildung in unterschiedliche Programmsichten
überführbar sind. Umlaute taugen dazu nicht, da der Rückweg nicht eindeutig wäre (aus "ue" kann man nicht überall
"ü" machen, sonst würde aus einem "Feuer" eine "Feür" werden). Transformationen von CamelCase, Binde- und
Unterstrichen sind allerdings meist akzeptabel bzw. unvermeidlich. Leerzeichen in Namen verursachen fast immer
Probleme. Das Weglassen von Leerzeichen hat zudem den Vorteil, dass zusammengesetzte Begriffe wie etwa
naechsteFreieISBN sofort als 'präzise gemeinte Begriffe' auch ohne weitere textuelle Auszeichnung erkennbar sind.
Die Frage nach der Sprache stellt sich noch viel grundsätzlicher: Die Sprache des Anwenders (z.B. Deutsch) ist im
Zeitalter globaler Arbeitsteilung nicht automatisch die Arbeits- und Denksprache der Software-Architekten und
Entwickler. Und diese wiederum ist nicht automatisch die vorgesehene Sprache für die Implementierung (Quellcode,
Kommentare). Unser Verständnis für die Bedeutung der Konstruktionssicht lässt nicht zu, dass man
Konstruktionsdokumente als privates Skizzenmaterial der Software-Architekten und Entwickler ansieht. Deren
Muttersprache scheidet also aus. Die fachliche Sicht ist mit großer Wahrscheinlichkeit in der nationalen
Muttersprache des Benutzers / Auftraggebers dokumentiert; lediglich bei internationalen Konzernen werden solche
Dokumente von vornherein in Englisch erstellt. Sehr oft wird eine Implementierung in Englisch angestrebt, um bei
der Wartung auf Mitarbeiter unterschiedlicher Herkunft zurückgreifen zu können. Ist ein sprachlicher Bruch also
unvermeidlich, so stellt sich die Frage "vor oder nach der Konstruktion?".
Wir plädieren dafür, die Konstruktion in der selben Sprache wie die Implementierung zu verfassen. Eine besonders
wichtige Aufgabe der Konstruktion ist in solchen Fällen der Aufbau eines zweisprachigen Glossars, in dem alle
nationalen fachlichen Begriffe der anglisierten Form zugeordnet werden. Ein derartiges Glossar ist an der
Übergangsstelle zwischen Anwendung und Konstruktion angesiedelt. Man beobachtet häufig, dass im Laufe der Zeit
die Autoren der fachlichen Sicht die Zuständigkeit für die Aktualisierung eines solchen Glossars übernehmen.
Quellenangaben:
8
Quelle(n) und Bearbeiter des/der Artikel(s)
Quelle(n) und Bearbeiter des/der Artikel(s)
AT -- Konstruktion Quelle: http://software-architecture.org/wiki/index.php?oldid=8163 Bearbeiter: Gero Scholz
Quelle(n), Lizenz(en) und Autor(en) des Bildes
File:Konzepte und Begriffe der Perspektive Konstruktion.png Quelle: http://software-architecture.org/wiki/index.php?title=Datei:Konzepte_und_Begriffe_der_Perspektive_Konstruktion.png
Lizenz: unbekannt Bearbeiter: Gero Scholz
9
Herunterladen