Immer wenn ich von Anti-Mustern höre, erinnere ich mich an einen anderen Begriff, nämlich. Designgeruch.
"Designgerüche sind bestimmte Strukturen im Design, die auf eine Verletzung grundlegender Designprinzipien hinweisen und sich negativ auf die Designqualität auswirken." (Aus "Refactoring für Software-Designgerüche: Verwaltung technischer Schulden")
Es gibt viele Designgerüche, die aufgrund von Verstößen gegen Designprinzipien klassifiziert wurden:
Abstraktion riecht
Fehlende Abstraktion: Dieser Geruch entsteht, wenn Datenklumpen oder codierte Zeichenfolgen verwendet werden, anstatt eine Klasse oder eine Schnittstelle zu erstellen.
Imperative Abstraktion: Dieser Geruch entsteht, wenn eine Operation in eine Klasse umgewandelt wird.
Unvollständige Abstraktion: Dieser Geruch entsteht, wenn eine Abstraktion komplementäre oder miteinander verbundene Methoden nicht vollständig unterstützt.
Vielfältige Abstraktion: Dieser Geruch entsteht, wenn einer Abstraktion mehr als eine Verantwortung zugewiesen ist.
Unnötige Abstraktion: Dieser Geruch tritt auf, wenn eine Abstraktion, die tatsächlich nicht benötigt wird (und daher hätte vermieden werden können), in ein Software-Design eingeführt wird.
Nicht genutzte Abstraktion: Dieser Geruch entsteht, wenn eine Abstraktion nicht verwendet wird (entweder nicht direkt verwendet oder nicht erreichbar).
Doppelte Abstraktion: Dieser Geruch entsteht, wenn zwei oder mehr Abstraktionen identische Namen oder identische Implementierungen oder beides haben.
Verkapselung riecht
Mangelhafte Kapselung: Dieser Geruch tritt auf, wenn die deklarierte Zugänglichkeit eines oder mehrerer Mitglieder einer Abstraktion zulässiger ist als tatsächlich erforderlich.
Leaky Encapsulation: Dieser Geruch entsteht, wenn eine Abstraktion Implementierungsdetails über ihre öffentliche Schnittstelle „aufdeckt“ oder „verliert“.
Fehlende Kapselung: Dieser Geruch tritt auf, wenn Implementierungsvariationen nicht in einer Abstraktion oder Hierarchie gekapselt sind.
Nicht ausgenutzte Kapselung: Dieser Geruch entsteht, wenn Client-Code explizite Typprüfungen verwendet (unter Verwendung verketteter if-else- oder switch-Anweisungen, die nach dem Typ des Objekts suchen ), anstatt die Variation der bereits in einer Hierarchie gekapselten Typen auszunutzen.
Modularisierung riecht
Defekte Modularisierung: Dieser Geruch entsteht, wenn Daten und / oder Methoden, die idealerweise in einer einzigen Abstraktion lokalisiert sein sollten, getrennt und auf mehrere Abstraktionen verteilt werden.
Unzureichende Modularisierung: Dieser Geruch entsteht, wenn eine Abstraktion existiert, die nicht vollständig zerlegt wurde, und eine weitere Zerlegung ihre Größe, Implementierungskomplexität oder beides verringern kann.
Zyklisch abhängige Modularisierung: Dieser Geruch entsteht, wenn zwei oder mehr Abstraktionen direkt oder indirekt voneinander abhängen (wodurch eine enge Kopplung zwischen den Abstraktionen entsteht).
Hub-ähnliche Modularisierung: Dieser Geruch entsteht, wenn eine Abstraktion Abhängigkeiten (sowohl eingehende als auch ausgehende) von einer großen Anzahl anderer Abstraktionen aufweist.
Hierarchie riecht
Fehlende Hierarchie: Dieser Geruch entsteht, wenn ein Codesegment bedingte Logik verwendet (normalerweise in Verbindung mit „markierten Typen“), um Abweichungen im Verhalten explizit zu verwalten, bei denen eine Hierarchie hätte erstellt und zur Kapselung dieser Abweichungen verwendet werden können.
Unnötige Hierarchie: Dieser Geruch entsteht, wenn die gesamte Vererbungshierarchie nicht erforderlich ist, was darauf hinweist, dass die Vererbung für den jeweiligen Entwurfskontext unnötig angewendet wurde.
Nicht faktorisierte Hierarchie: Dieser Geruch entsteht, wenn zwischen Typen in einer Hierarchie unnötige Duplikate auftreten.
Breite Hierarchie: Dieser Geruch entsteht, wenn eine Vererbungshierarchie „zu“ breit ist, was darauf hinweist, dass möglicherweise Zwischentypen fehlen.
Spekulative Hierarchie: Dieser Geruch entsteht, wenn ein oder mehrere Typen in einer Hierarchie spekulativ bereitgestellt werden (dh basierend auf imaginären Bedürfnissen und nicht auf realen Anforderungen).
Tiefe Hierarchie: Dieser Geruch entsteht, wenn eine Vererbungshierarchie „übermäßig“ tief ist.
Rebellische Hierarchie: Dieser Geruch entsteht, wenn ein Subtyp die von seinen Supertypen bereitgestellten Methoden ablehnt.
Unterbrochene Hierarchie: Dieser Geruch entsteht, wenn ein Supertyp und sein Subtyp konzeptionell keine „IS-A“ -Beziehung teilen, was zu einer unterbrochenen Substituierbarkeit führt.
Multipath-Hierarchie: Dieser Geruch entsteht, wenn ein Subtyp sowohl direkt als auch indirekt von einem Supertyp erbt, was zu unnötigen Vererbungspfaden in der Hierarchie führt.
Zyklische Hierarchie: Dieser Geruch entsteht, wenn ein Supertyp in einer Hierarchie von einem seiner Subtypen abhängt.
Die obige Definition und Klassifizierung wird unter "Refactoring für Software-Design-Gerüche: Verwaltung technischer Schulden " beschrieben. Weitere relevante Ressourcen finden Sie hier .