Anwendungsarchitektur
Lösungen und Anwendungen
Warum werden Anwendungen entwickelt? Die Beantwortung dieser Frage setzt voraus,
dass eine Definition des Begriffs Anwendung vorliegt, auf die man sich beziehen
kann.
In erster Linie werden Anwendungen entwickelt, um Aufgaben einer spezifischen Domäne
zu erledigen und die damit einhergehenden Probleme zu lösen. Daher wäre es eigentlich
angebracht, an Stelle von Anwendungsentwicklung von der Entwicklung von Lösungen zu
sprechen. Dennoch wird im alltäglichen Sprachgebrauch der Begriff der Anwendung häufig
synonym mit dem der Lösung verwendet.
Dabei darf allerdings nicht vergessen werden, dass eine moderne Anwendung - im Sinne
einer Lösung - sehr wohl aus mehr als nur einer Anwendung - im Sinne einer ausführbaren
Anwendung - bestehen kann.
Einerseits kann nämlich bereits die eigentliche Funktionalität auf mehrere Anwendungen
verteilt werden, wie es beispielsweise in Umgebungen mit einer Server- und mehreren
Client-Anwendungen der Fall ist. Andererseits wird gerade für Webanwendungen häufig
eine zusätzliche Windowsanwendung zur Wartung entwickelt.
Außerdem nutzen die meisten modernen Anwendungen eine Reihe unterstützender Anwendungen,
wie eine Datenbank, einen Webserver und sonstige Services, die zwar nicht direkt integriert
sind, aber dennoch - wie die eigentliche Anwendung - ihren jeweiligen Teil zur übergeordneten
Lösung beitragen.
Insofern sind Anwendungen genau genommen autonome Bestandteile einer Lösung und kommunizieren
miteinander über definierte Schnittstellen und Kanäle. Dennoch werden im folgenden die Begriffe
Anwendung und Lösung synonym verwendet, da die in diesem Buch entwickelten Lösungen zumeist
nur aus einer einzelnen Anwendung bestehen.
Komponenten und Assemblies
Die hierarchische Struktur einer Lösung mit mehreren untergeordneten Anwendungen besteht
vergleichbar auch innerhalb einer einzelnen Anwendung. Waren diese früher häufig monolithisch -
also aus einem Guss - aufgebaut, werden heutzutage in der Regel eine Reihe von eigenständigen
Komponenten entwickelt, die anschließend miteinander integriert und zu einer Anwendung
verschmolzen werden.
Komponenten zeichnen sich vor allem durch zwei Aspekte aus: Zum einen sind sie autarke, in
sich abgeschlossene Einheiten, die nicht von anderen Einheiten abhängen. Auf Grund dessen kann
die Entwicklung einer komponentenorientierten Anwendung problemlos innerhalb eines Teams
aufgeteilt werden. Zum anderen verfügt jede Komponente über eine definierte Schnittstelle,
über die sie von außen angeprochen werden kann. Um eine Komponente in eine Anwendung einzubinden,
muss nur ihre Schnittstelle, nicht aber ihr innerer Aufbau bekannt sein, so dass eine Komponente
als Blackbox fungiert.
Außerdem sind verschiedene Komponenten untereinander austauschbar, sofern sie die gleiche
Schnittstelle bereitstellen. Dies erleichtert nicht nur die Wartbarkeit von Anwendungen, da
im Nachhinein problemlos einzelne Komponenten an Stelle der ganzen Anwendung ausgetauscht
werden können. Zudem wird auch die Testbarkeit verbessert, da bei einer Änderung in einer
Komponente nur diese erneut getestet werden muss, nicht aber die vollständige Anwendung.
Auf Grund dieser Eigenschaften spielen Komponenten eine essenzielle Rolle in der modernen,
teambasierten Anwendungsentwicklung.
Eine Komponente besteht - wie bereits Lösungen und Anwendungen - wiederum aus kleineren
Bestandteilen, den Assemblies. Eine Assembly ist dabei ein Konzept, das von Microsoft in
.NET neu eingeführt wurde. Diese wird physisch von einer Datei mit der Endung .dll oder .exe
repräsentiert, wobei eine Assembly außer der Dateiendung nicht viel mit einer klassischen
Datei mit der selben Endung gemein hat.
Eine Assembly enthält in erster Linie ausführbare Anweisungen in MSIL. Zudem kann sie aber
noch Ressourcen enthalten, die zur ihrer Ausführung benötigt werden, wie beispielsweise Bilder
oder Klänge. Erzeugt wird eine Assembly aus einer oder mehreren Dateien, die Anweisungen in
C# enthalten, und zusätzlich aus den einzubindenden Ressourcendateien.
Außerdem verfügt eine Assembly über Metadaten, die ihren Inhalt näher beschreiben. So werden
nicht nur Angaben zu den enthaltenen Anweisungen und Ressourcen gemacht, sondern auch Informationen
über die Assembly an sich wie beispielsweise ihr Hersteller und ihre Versionsnummer bereitgestellt.
Datentypen
Die Anweisungen in einer Assembly, die ursprünglich in C# geschrieben wurden, sind ihrerseits
allerdings noch einmal in sogenannten Typen organisiert, und zwar gemeinsam mit den Datenstrukturen,
die sie zu ihrer Ausführung benötigen. Das Entwerfen und Organisieren dieser Typen ist die
wesentliche Arbeit, die bei der Entwicklung einer Anwendung in C# geleistet wird.
Zusammenfassend heißt das auf der einen Seite, dass alles, was sich oberhalb einer Assembly
befindet, zwar zu der Ausführung einer Anwendung benötigt wird, aber letztlich auch nur die
Ausführung sowie die Verteilung der Anwendung betrifft. Insbesondere wird all dies nicht in
C# umgesetzt, da dort nur noch ausführbare Dateien gehandhabt werden, und man, wenn überhaupt,
nur mit MSIL - nicht aber mit C# - in Berührung kommt.
Auf der anderen Seite wird im Gegenzug alles, was sich unterhalb einer Assembly befindet, in
C# umgesetzt. Das heißt, Anwendungen zu entwickeln bedeutet im wesentlichen, Datenstrukturen zu
modellieren, sie zu organisieren und darauf basierend die Verfahren aufzubauen, die mit diesen
Datenstrukturen arbeiten.