Name, Kurzform |
Single Choice
Prinzip |
Synonyme |
SCP |
Beschreibung |
„Immer wenn ein Software-System eine Anzahl von Alternativen anbietet, sollte genau ein Modul die vollständige Menge der Wahlmöglichkeiten kennen.“ [Mayer1998] |
Erläuterung |
Das
Single Choice Prinzip ist eines von Bertrand Meyers fünf Modulprinzipien. Es setzt das Konstrukt einer Fallunterscheidung
in Zusammenhang mit der Modulbildung. Als Fallunterscheidung
kommen dabei ganz unterschiedliche syntaktische Konstrukte in
Betracht:
Je
nach Programmiersprache stehen unterschiedliche Konstrukte in der
Sprachsyntax zur Verfügung. Weitergehende Möglichkeiten wie z.
B. Hash-Tabellen, die Selektion über Pattern-Matching o. Ä.
können zudem über Standardbibliotheken bereitstehen. All diesen
Möglichkeiten ist gemeinsam, dass es eine Anzahl von Kriterien
gibt, und dass jedem Kriterium ein bestimmter Ausführungszweig
entspricht.
Wiederholt
sich eine solche Fallunterscheidung in verschiedenen Modulen, so
entsteht eine unnötige Verteilung dieses Wissens
(Meyer nennt dies distribution
of knowledge),
die als Verstoß gegen das Geheimnisprinzip (information
hiding)
interpretiert werden kann. Zudem
bedeutet die entstehende Redundanz einen Verstoß gegen „Don't
Repeat Yourself“ / „Once and only once“.
|
Beispiel(e) |
1)
Polymorphie und dynamische Bindung:
Das
Single Choice Prinzip wird von verschiedenen Autoren auf den
Einsatz von Polymorphie und dynamischer Bindung reduziert. Diese
stellen einen Basismechanismus zur Verfügung, der die bedingte
Fallunterscheidung elegant verlagert. Die folgende Abbildung
veranschaulicht dies:
Der
Klient ruft lediglich die gewünschte Methode der Instanz auf.
Polymorphie
und dynamische
Bindung
sind die konzeptionellen Grundlagen dieser Möglichkeit.
Supertyp obj; // Deklaration der Instanz ... obj.doSomething(); // Implizite Verzweigung
Die
Fallunterscheidung ist hier verschwunden. Sie wurde implizit an
diejenige Stelle verlagert, welche entschieden hat, welchen Typ
die Objektinstanz erhalten soll. Um diese Entscheidung zu
realisieren, stehen nun verschiedene Möglichkeiten zur Verfügung.
Solche Möglichkeiten sind z. B.:
Zu
erwähnen bleibt, dass die Lösung des Single Choice Prinzips über
Polymorphie und dynamische Bindung auch eine einfache Anwendung
des Open-Closed-Prinzips erlaubt: Durch Hinzufügen neuer
Subtypen und entsprechende Aufnahme in den Erzeugungs- oder
Auswahl-Mechanismus können neue Verzweigungen eingeführt werden,
ohne den Code in den diversen Klienten verändern zu müssen.
Nachteilig
an der Lösung über Polymorphie und dynamische Bindung ist, dass sich die Bildung einer
Klassenhierarchie nicht in allen Fällen anbietet. Was
beispielsweise, wenn sich der betreffende Quellcode bereits in
eine vorhandene Klassenhierarchie einbetten muss oder ein anderes
Kriterium zur Bildung der Klassenhierarchie als bedeutsamer
erscheint? In einigen Fällen können dann noch Rollen-Interfaces
aushelfen, aber auch diese Möglichkeit könnte aus verschiedenen
Gründen verwehrt sein.
2)
First-Class-Funktionen / Zeiger auf Funktionen:
Wenn
sich der Mechanismus über Polymorphie und dynamische Bindung
nicht anbietet, so können in einigen Programmiersprachen
First-Class-Funktionen (oder alternativ – und umständlicher –
Zeiger auf Funktionen) behilflich sein. Es muss wiederum ein
Selektionsmechanismus bereitstehen, wie z. B. der Zugriff über
die Schlüssel einer Map oder eine andere Form von
Funktions-Repository. Die Fallunterscheidung wird hier in
dasjenige Modul verlagert, welches das Funktions-Repository
aufbaut.
3)
Sonstige Ideen
|
Historie |
|
Art des Prinzips |
|
Grad der formalen
Spezifikation |
Hoch.
Redundanzen im Quellcode können mit zahlreichen Werkzeugen
zuverlässig ermittelt werden. |
Vorteile |
|
Nachteile |
|
Übergeordnete
Prinzipien |
|
Abgleitete
Prinzipien |
- |
Qualitätsmerkmale |
(+)
Änderbarkeit, (+) Wiederverwendbarkeit,
(+)
Wartbarkeit, (+) Testbarkeit,
(-)
Verständlichkeit |
Quellen
[Hunt1999]
– The Pragmatic Programmer. From Journeyman to Master,
Andrew Hunt, David Thomas, Ward Cunningham (1999)
[Mayer1998]
- Objekt-oriented Software Construction 2nd
Edition, Bertrand Meyer (1999)