it-swarm.com.de

Was ist ein Anti-Muster?

Ich studiere Muster und Anti-Muster. Ich habe eine klare Vorstellung von Mustern, bekomme aber keine Anti-Muster. Definitionen aus dem Web und Wikipedia verwirren mich sehr.

Kann mir jemand mit einfachen Worten erklären, was ein Antimuster ist? Was ist der Zweck? Was machen Sie? Ist es eine schlechte Sache oder eine gute Sache?

144
g.revolution

Anti-Patterns sind bestimmte Muster in der Softwareentwicklung, die als schlechte Programmierpraktiken gelten.

Im Gegensatz zu Entwurfsmustern , die gängige Ansätze für häufige Probleme sind, die formalisiert wurden und allgemein als gute Entwicklungspraxis gelten, sind Anti-Muster das Gegenteil und unerwünscht.

Bei der objektorientierten Programmierung besteht die Idee zum Beispiel darin, die Software in kleine Teile zu teilen, die als Objekte bezeichnet werden. Ein Anti-Muster in der objektorientierten Programmierung ist ein Gott-Objekt , das viele Funktionen ausführt, die besser in verschiedene Objekte aufgeteilt werden könnten.

Zum Beispiel:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

Das obige Beispiel hat ein Objekt, das alles tut. Bei der objektorientierten Programmierung wäre es vorzuziehen, klar definierte Verantwortlichkeiten für verschiedene Objekte zu haben, um den Code weniger gekoppelt und letztendlich wartungsfähiger zu halten:

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

Unter dem Strich gibt es gute Möglichkeiten, Software mit häufig verwendeten Mustern zu entwickeln ( Entwurfsmuster ), aber es gibt auch Wege, wie Software entwickelt und implementiert wird, was zu Problemen führen kann. Muster, die als schlechte Softwareentwicklungspraktiken angesehen werden, sind Anti-Muster.

183
coobird

Wann immer ich von Anti-Mustern erfahre, erinnere ich mich an einen anderen Begriff, nämlich. Design riechen. 

"Designgerüche sind bestimmte Strukturen im Design, die auf eine Verletzung grundlegender Designprinzipien hinweisen und die Designqualität negativ beeinflussen." (Von "Refactoring für Software Design Smells: Umgang mit technischen Schulden")

Es gibt viele Designgerüche, die nach verletzenden Designprinzipien klassifiziert sind:

Abstraktion riecht

Missing Abstraction: Dieser Geruch tritt auf, wenn Datenklumpen oder kodierte Zeichenfolgen verwendet werden, anstatt eine Klasse oder ein Interface zu erstellen.

Imperative Abstraction: Dieser Geruch entsteht, wenn aus einer Operation eine Klasse wird.

Incomplete Abstraction: Dieser Geruch entsteht, wenn eine Abstraktion komplementäre oder zusammenhängende Methoden nicht vollständig unterstützt.

Facettenreiche Abstraktion: Dieser Geruch entsteht, wenn einer Abstraktion mehrere Verantwortlichkeiten zugewiesen sind.

Unnecessary Abstraction: 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).

Duplicate Abstraction: Dieser Geruch entsteht, wenn zwei oder mehr Abstraktionen identische Namen oder identische Implementierung oder beides haben.

Verkapselungsgerüche

Deficient Encapsulation: Dieser Geruch tritt auf, wenn die deklarierte Erreichbarkeit 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 "ansieht" oder "durchläuft".

Missing Encapsulation: Dieser Geruch tritt auf, wenn Implementierungsvariationen nicht in einer Abstraktion oder Hierarchie eingeschlossen sind.

Unexploited Encapsulation: Dieser Geruch entsteht, wenn der Clientcode explizite Typprüfungen (mithilfe von verketteten if-else- oder switch-Anweisungen, die den Typ des Objekts prüfen) verwendet, anstatt die Variation von Typen zu nutzen, die bereits in einer Hierarchie eingeschlossen sind.

Modularisierung riecht

Broken Modularization: Dieser Geruch entsteht, wenn Daten und/oder Methoden, die idealerweise in einer einzigen Abstraktion lokalisiert werden sollten, voneinander getrennt und über mehrere Abstraktionen verteilt werden.

Unzureichende Modularisierung: Dieser Geruch entsteht, wenn eine Abstraktion existiert, die nicht vollständig zerlegt wurde und eine weitere Zerlegung die Größe, die Implementierungskomplexität oder beides verringern könnte.

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-like Modularization: Dieser Geruch entsteht, wenn eine Abstraktion Abhängigkeiten (sowohl eingehend als auch ausgehend) mit einer großen Anzahl anderer Abstraktionen aufweist.

Hierarchie riecht

Missing Hierarchy: Dieser Geruch entsteht, wenn ein Codesegment bedingte Logik verwendet (normalerweise in Verbindung mit "markierten Typen"), um Abweichungen im Verhalten, bei denen eine Hierarchie erstellt und zum Einkapseln dieser Abweichungen verwendet werden könnte, explizit zu verwalten.

Unnecessary Hierarchy: Dieser Geruch entsteht, wenn die gesamte Vererbungshierarchie nicht erforderlich ist, was darauf hinweist, dass die Vererbung unnötig für den jeweiligen Designkontext angewendet wurde.

Unfactored Hierarchy: Dieser Geruch entsteht, wenn zwischen den Typen in einer Hierarchie unnötige Duplizierungen auftreten.

Wide Hierarchy: Dieser Geruch tritt auf, wenn eine Vererbungshierarchie zu breit ist, was darauf hinweist, dass Zwischentypen fehlen.

Spekulative Hierarchie: Dieser Geruch entsteht, wenn ein oder mehrere Typen in einer Hierarchie spekulativ bereitgestellt werden (d. H. Basierend auf den ermittelten Bedürfnissen und nicht den tatsächlichen Anforderungen).

Deep Hierarchy: Dieser Geruch entsteht, wenn eine Vererbungshierarchie "übermäßig" tief ist.

Rebellious Hierarchy: Dieser Geruch entsteht, wenn ein Subtyp die von seinem Supertyp (s) bereitgestellten Methoden ablehnt.

Gebrochene Hierarchie: Dieser Geruch entsteht, wenn ein Supertyp und sein Untertyp konzeptuell keine "IS-A" -Beziehung haben, was zu einer gebrochenen Substituierbarkeit führt.

Multipath Hierarchy: 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.

Cyclic Hierarchy: Dieser Geruch entsteht, wenn ein Supertyp in einer Hierarchie von einem seiner Untertypen abhängt.


Die obige Definition und Klassifizierung ist in "Refactoring für Software-Design riecht: Technische Schulden verwalten " beschrieben. Weitere relevante Ressourcen finden Sie hier .

42
Alex

Ein Muster ist eine Idee, wie ein Problem einer Klasse gelöst werden kann. Ein Anti-Muster ist eine Idee, wie man es nicht lösen kann, weil die Umsetzung dieser Idee zu schlechtem Design führen würde.

Ein Beispiel: Ein "Muster" wäre die Verwendung einer Funktion zur Wiederverwendung von Code, ein "Anti-Muster" wäre das Kopieren und Einfügen derselben. Beide lösen dasselbe Problem, aber die Verwendung einer Funktion führt in der Regel zu lesbarerem und wartbarerem Code als beim Kopieren und Einfügen.

32
sharptooth

Ein Anti-Pattern ist ein Weg, um ein Problem nicht zu lösen. Aber es gibt noch mehr: Es ist auch ein Weg, der häufig in Versuchen zur Lösung des Problems sichtbar wird.

15

Wenn Sie wirklich AntiPatterns studieren möchten, besorgen Sie sich das Buch AntiPatterns (ISBN-13: 978-0471197133).

Darin definieren sie: "Ein AntiPattern ist eine literarische Form, die eine häufig vorkommende Lösung für ein Problem beschreibt, das ausgesprochen negative Folgen hat."

Wenn es sich also um eine schlechte Programmierpraxis handelt, die jedoch nicht üblich ist - sie ist auf eine Anwendung, eine Firma oder einen Programmierer beschränkt, entspricht nicht dem "Pattern" -Teil der AntiPattern-Definition.

9
kmarsh

Ein üblicher Weg, ein Chaos zu machen. Wie zum Beispiel die Klasse God/Kitchenensink (macht alles).

7
Robert Gould

Ein Anti-Muster ist das Komplement eines Designmusters . Ein Anti-Pattern ist eine Vorlagenlösung, die Sie in bestimmten Situationen nicht verwenden sollten.

6
xxmajia

Genau wie bei einem Design Pattern ist ein Anti-Pattern auch eine Vorlage und eine wiederholbare Möglichkeit, ein bestimmtes Problem zu lösen, jedoch auf nicht optimale und ineffektive Weise.

6
Darnell

Interessanterweise kann eine gegebene Lösung eines Problems sowohl ein Muster als auch ein Anti-Muster sein. Singleton ist das Paradebeispiel dafür. Es wird in beiden Literaturgruppen erscheinen.

5
Ed Sykes

Heutzutage verwenden Software-Entwickler und -Praktiker häufig die Begriffe "Anti-Pattern" und "Riechen" austauschbar. Sie sind jedoch konzeptionell nicht gleich. Der Wikipedia-Eintrag von Anti-Pattern besagt, dass sich ein Anti-Pattern durch mindestens zwei Faktoren von einer schlechten Praxis oder einer schlechten Idee unterscheidet. Ein Anti-Muster ist

"Ein häufig verwendeter Prozess, eine Struktur oder ein Handlungsmuster, das, obwohl es zunächst als eine geeignete und effektive Antwort auf ein Problem erscheint, in der Regel mehr negative Folgen hat als positive Ergebnisse."

Es zeigt eindeutig, dass ein Antimuster in dem Glauben gewählt wird, dass es eine gute Lösung (als Muster) für das vorgestellte Problem ist; es bringt jedoch mehr Verbindlichkeiten als Vorteile. Andererseits ist ein Geruch einfach eine schlechte Praxis, die die Qualität eines Softwaresystems negativ beeinflusst. Zum Beispiel ist Singleton ein Anti-Pattern und God-Klasse (oder Unzureichende Modularisierung) ist ein Designgeruch.

3
Tushar

Anti-Patterns sind übliche Methoden, mit denen Menschen den falschen Weg oder zumindest den nicht so guten Weg programmieren.

2

Jedes Designmuster, das der gegebenen Softwareentwicklungsumgebung mehr schadet als nützt, wird als Anti-Pattern betrachtet.

Einige Anti-Muster sind offensichtlich, andere nicht. Zum Beispiel Singleton, obwohl viele es für gutes altes Designmuster halten, aber es gibt andere, die dies nicht tun.

Sie können die Frage überprüfen Was ist an Singletons so schlecht? um die verschiedenen Meinungen dazu besser zu verstehen.

0
Himanshu Negi

Wie im Algorithmus können Sie die Lösung mit Brute Force erreichen, aber Sie müssen viel bezahlen, wenn die Situation komplex wird.

0
Shailesh kumar