Читать книгу Prinzipien des Softwaredesigns - John Ousterhout - Страница 11

Ursachen für Komplexität

Оглавление

Nachdem Sie nun die Symptome von Komplexität aus einer sehr allgemeinen Perspektive kennengelernt haben und wissen, warum sie die Softwareentwicklung erschwert, besteht der nächste Schritt darin, zu verstehen, was Komplexität verursacht, sodass wir Systeme so designen können, dass die Probleme vermieden werden. Komplexität wird durch zwei Dinge verursacht: Abhängigkeiten und Unklarheit. Dieser Abschnitt behandelt diese Faktoren auf sehr allgemeinem Niveau – folgende Kapitel werden darauf eingehen, in welchem Zusammenhang sie zu Designentscheidungen auf niedrigeren Ebenen stehen.

So wie es in diesem Buch verstanden wird, besteht dann eine Abhängigkeit, wenn ein gegebener Codeabschnitt nicht isoliert nachvollzogen und angepasst werden kann – der Code bezieht sich auf die eine oder andere Art und Weise auf anderen Code, und der andere Code muss berücksichtigt und/oder angepasst werden, wenn der gegebene Code geändert wird. Im Website-Beispiel aus Abbildung 2-1 (a) erzeugt die Hintergrundfarbe Abhängigkeiten zwischen allen Seiten. Alle Seiten müssen den gleichen Hintergrund haben – ändern Sie also den Hintergrund für eine Seite, muss er auch für alle anderen angepasst werden. Ein anderes Beispiel für Abhängigkeiten zeigt sich bei Netzwerkprotokollen. Typischerweise gibt es eigenen Code für den Sender und den Empfänger, aber sie müssen sich beide an das Protokoll halten – ändern Sie den Code für den Sender, müssen Sie so gut wie immer auch entsprechende Änderungen beim Empfänger vornehmen und umgekehrt. Die Signatur einer Methode erzeugt eine Abhängigkeit zwischen der Implementierung dieser Methode und dem Code, der sie aufruft – wird der Methode ein neuer Parameter hinzugefügt, müssen alle Aufrufe dieser Methode angepasst werden, um diesen Parameter anzugeben.

Abhängigkeiten sind ein fundamentales Element von Software, und sie können nicht vollständig verhindert werden. Tatsächlich fügen wir als Teil des Softwaredesignprozesses absichtlich Abhängigkeiten hinzu. Jedes Mal, wenn Sie eine neue Klasse schreiben, erzeugen Sie Abhängigkeiten rund um die API für diese Klasse. Aber eines der Ziele des Softwaredesigns ist, die Menge an Abhängigkeiten zu verringern und sie so einfach und offensichtlich wie möglich zu machen.

Denken Sie noch mal an das Beispiel der Website. Auf der alten Website mit dem Hintergrund, der auf jeder Seite getrennt spezifiziert ist, hingen alle Webseiten voneinander ab. Die neue Website hat dieses Problem behoben, indem sie die Hintergrundfarbe an einer zentralen Stelle definiert und eine API bereitstellt, über die die einzelnen Seiten diese Farbe abrufen können, wenn sie gerendert werden. Glücklicherweise ist die neue Abhängigkeit offensichtlicher: Es ist klar, dass jede einzelne Webseite von der Farbe bannerBg abhängt, und beim Entwickeln kann man leicht alle Stellen finden, an denen die Variable verwendet wird, indem man nach ihrem Namen sucht. Zudem helfen Compiler dabei, API-Abhängigkeiten zu verwalten: Ändert sich der Name der gemeinsam genutzten Variablen, werden Kompilierungsfehler in jedem Code auftauchen, der immer noch den alten Namen verwendet. Die neue Website ersetzt eine nicht offensichtliche und schwierig zu managende Abhängigkeit durch eine einfachere und offensichtlichere.

Die zweite Ursache für Komplexität ist Unklarheit. Unklarheit tritt dann auf, wenn wichtige Informationen nicht offensichtlich sind. Ein einfaches Beispiel ist ein Variablenname, der so generisch ist, dass er nur wenige nützliche Informationen enthält (zum Beispiel time). Oder die Dokumentation für eine Variable gibt nicht ihre Einheiten an, sodass Sie diese nur herausfinden können, indem Sie im Code nach Stellen suchen, an denen die Variable zum Einsatz kommt. Unklarheit entsteht oft in Verbindung mit Abhängigkeiten, wenn nicht offensichtlich ist, dass eine Abhängigkeit existiert. Wird beispielsweise ein System durch einen neuen Fehlerstatus ergänzt, kann es notwendig sein, eine Tabelle, die beschreibende Textstrings für jeden Status enthält, um einen Eintrag zu erweitern. Aber die Existenz dieser Message-Tabelle wird beim Programmieren nicht offensichtlich sein, wenn man sich nur die Statusdeklaration anschaut. Inkonsistenz trägt ebenfalls gern zu Unklarheit bei: Wird derselbe Variablenname für zwei verschiedene Zwecke eingesetzt, ist nicht offensichtlich, welchem Zweck eine bestimmte Variable dient.

In vielen Fällen entsteht Unklarheit durch nicht adäquate Dokumentation – Kapitel 13 behandelt dieses Thema. Aber Unklarheit schafft auch ein Designproblem. Hat ein System ein klares und offensichtliches Design, wird weniger Dokumentation benötigt. Der Bedarf nach umfassender Dokumentation ist oft ein Warnsignal dafür, dass das Design noch nicht perfekt ist. Der beste Weg, Unklarheit zu verringern, ist, das Systemdesign zu vereinfachen.

Zusammen sind Abhängigkeiten und Unklarheit für die drei im Abschnitt »Symptome der Komplexität« auf Seite 21 beschriebenen Manifestationen der Komplexität verantwortlich. Abhängigkeiten führen dazu, dass sich Änderungen stärker ausweiten, und sie führen zu einer hohen kognitiven Last. Unklarheit sorgt für unbekannte Unbekannte und trägt ebenfalls zu kognitiver Last bei. Finden wir Designtechniken, die Abhängigkeiten und Unklarheit verringern, können wir die Komplexität der Software reduzieren.

Prinzipien des Softwaredesigns

Подняться наверх