13 Architektur, Design und angewandte Objektorientierung
»Eines der traurigsten Dinge im Leben ist, dass ein Mensch viele gute Taten tun muss, um zu beweisen, dass er tüchtig ist, aber nur einen Fehler zu begehen braucht, um zu beweisen, dass er nichts taugt.«
– George Bernard Shaw (1856–1950)
Während die Beispiele aus Kapitel 2 bis Kapitel 12 im Wesentlichen in einer kleinen main(…)-Methode Platz fanden, sind die Beispiele aus diesem Kapitel etwas umfangreicher und zeigen das objektorientierte Zusammenspiel von mehreren Klassen.
13.1 Architektur, Design und Implementierung
Von dem Wunsch des Auftraggebers hin zur fertigen Software ist es ein weiter Weg. Dazwischen liegen Anforderungsdokumente, Testfälle, die Auswahl der Infrastruktur, die Wahl von Datenbanken, Lizenzfragen, menschliche Eitelkeiten und vieles, vieles mehr. Da die »Insel« die Softwareentwicklung in den Mittelpunkt rückt, wollen wir uns bevorzugt in den Bereichen Architektur, Design und Implementierung aufhalten.
Der Begriff Softwarearchitektur ist wenig klar umrissen, doch meint er das große Ganze, also die fundamentalen Entscheidungen beim Aufbau der Software. Am besten lässt sich Architektur vielleicht bissig als das charakterisieren, was aufwendig und teuer zu ändern ist, wenn es einmal steht. Ein bekanntes Architekturmuster ist das Schichtenmodell, das Software in mehrere Ebenen gliedert. Die obere Schicht kann dabei nur auf Dienste der direkt unter ihr liegenden Schicht zurückgreifen, aber keine Schicht überspringen, und die untere Schicht hat keine Ahnung von höher liegenden Schichten.
Im Design kümmern sich die Entwickler um die Abbildung der Ideen auf Pakete, Klassen und Schnittstellen. Diese Abbildung ist nicht eindeutig, und so gibt es viele Möglichkeiten. Einige sind schlecht, weil sie die Lesbarkeit, Erweiterbarkeit oder Performance beeinträchtigen, andere sind besser. Es kommt aber immer auf den Kontext an. Wir wollen uns daher mit einigen Abbildungen beschäftigen und sie diskutieren.
Die Implementierung setzt das Design (das sich auf der Ebene von UML-Modellen befindet) in den Quellcode einer Programmiersprache um. Die Implementierung vereint das statische Modell, also welche Klasse von welcher erbt, und bringt sie mit der nötigen Dynamik zusammen. Fragen der Implementierung werden immer wieder diskutiert, wenn es zum Beispiel um die Wahl der richtigen Datenstruktur oder um die Realisierung der Nebenläufigkeit geht.