Die schlimmsten Anti-Muster, auf die Sie gestoßen sind [geschlossen]

9

Was sind die schlimmsten Anti-Muster, auf die Sie in Ihrer Karriere als Programmierer gestoßen sind?

Ich beschäftige mich hauptsächlich mit Java, obwohl es wahrscheinlich sprachunabhängig ist.

Ich denke, das Schlimmste ist das, was ich als Haupt-Anti-Muster bezeichne . Es bedeutet ein Programm, das aus einer einzelnen, extrem großen Klasse besteht (manchmal begleitet von zwei kleinen Klassen) und alle Logik enthält. In der Regel mit einer großen Schleife, in der die gesamte Geschäftslogik enthalten ist und manchmal Zehntausende von Codezeilen enthält.

стривігор
quelle

Antworten:

38

Auskommentierter Code. Blöcke davon, vielleicht Hunderte von Zeilen. Die Theorie ist, hey, es ist auskommentiert, es schadet nicht und vielleicht werden wir es in Zukunft brauchen.

Navi
quelle
7
Na wenigstens kannst du es sicher löschen. Im Gegensatz zu jemandem, mit dem ich zusammengearbeitet habe, wurden Prozeduren häufig umbenannt und der tote Code zugänglich gelassen. Blech.
Jay
@Cyrena, du hast auch mit Eric gearbeitet?!?
CaffGeek
Ich hatte einmal eine Menge Code, der #ifdef COMMENT verwendete, um Dinge auszusperren. Hat super funktioniert, bis jemand KOMMENTAR definiert hat.
Michael Kohne
9
Dies ist ein weiterer Fall, in dem sich die Verwendung der Versionskontrolle auszahlt. Sie können Code löschen, ohne fragen zu müssen, ob Sie ihn möglicherweise in Zukunft benötigen oder nicht, da er mit wenigen Tastenanschlägen erneut abgerufen werden kann.
Jason B
5
Ich denke, auskommentierter Code hat einen Platz, wenn Sie ihm einen Kommentar voranstellen, der erklärt, warum er dort ist. Manchmal hinterlasse ich einen kommentierten Block, der einen potenziellen Weg darstellt, über den ich nachgedacht habe, und hinterlasse einen Kommentar darüber, warum ich es nicht getan habe. @ Jason, ich höre Sie definitiv darüber, dass dies die Rolle der Versionskontrolle ist, aber gelöschter Code in der Versionskontrolle ist nicht sehr auffindbar.
Nlawalker
19

Ich werde eine andere offensichtliche mit "Copy-Pasta" treffen. Kopieren Sie Code, der fast identisch mit dem ist, was Sie möchten, und ändern Sie dann einige Dinge (anstatt ihn in eine Methode zu extrahieren).

Dies ist besonders häufig in einigen Funktions- und API-Testcodes aus den späten 90er Jahren der Fall: Buchstäblich Hunderte (oder sogar Tausende) nahezu identischer Testfälle, die in einige Funktionen unterteilt werden könnten, die 3 oder 4 Parameter annehmen - oder sogar noch besser , etwas datengetriebenes. Mein erster Job außerhalb des College war buchstäblich 8 Monate lang das Umschreiben und Umgestalten von Tausenden von Zeilen mit Nudeln, die veraltete Methoden verwendeten. Als ich fertig war, waren die Testdateien weniger als ein Zehntel ihrer ursprünglichen Größe und weitaus wartbarer (und lesbarer!).

Ethel Evans
quelle
16

Ich denke, ich kann viel über Pattern Mania und Lösungen schreiben , die mit viel weniger Aufwand gelöst werden könnten, aber ich möchte lieber auf einen großartigen Artikel verweisen, den ich kürzlich gelesen habe, mit einem fantastischen Beispiel dafür, wie eine einfache Lösung überkompliziert werden kann .

Wie (nicht) man Factorial in Java schreibt oder so, wir setzen eine Factory in Ihren Algorithmus ein

Andrey Taptunov
quelle
3
Genial! Wo ist nun der FactorialWebService? : P
FrustratedWithFormsDesigner
1
Ich nenne es Pattern Fever ... jeder bekommt es an einem Punkt seiner Karriere. Die Besseren unter uns wachsen darüber hinaus. Ich hatte ein Interview, in dem der Typ mich fragte, wann ich über Muster nachdenken sollte. Ich sagte ihm, dass ich sie zum System entwickeln lasse. Er sagte: "Nein, Sie sollten von Anfang an Muster verwenden."
Michael Brown
FactoryFactories sind nur ein Symptom dafür, dass die tatsächliche Auswahl so weit wie möglich verschoben werden soll. Sie führt jedoch dazu, dass sie entweder fest codiert oder einem Code ein externer Zeichenfolgenwert zugeordnet wird. Die Abhängigkeitsinjektion ist eine bessere Lösung.
Muster sind Artefakte guten Designs - sie sollten als solche behandelt werden. Ich beschreibe sie eher als Definitionen als als Lösungen. Sie sind nützlich bei der Kommunikation, aber nicht unbedingt beim Entwerfen.
Michael K
Danke dafür, gute Lektüre.
Syg
14

Goldener Hammer

"Ich habe einen Hammer und alles andere ist ein Nagel."

Maglob
quelle
14

Regionen

In C # können Sie einen Codebereich definieren, der in der IDE reduziert werden kann, und ihn so ausblenden, es sei denn, Sie möchten mit diesem Code umgehen. Ich war in einem Projekt (bin gerade dabei), in dem die Regionen Hunderte von Zeilen umfassten (ich wünschte, ich übertreibe) und es gab mehrere Regionen in einer Funktion mit tausend Zeilen (wieder wünschte ich, ich mache Witze).

Auf der anderen Seite hat der Entwickler, der die Region erstellt hat, sehr gute Arbeit geleistet, um bestimmte Funktionen innerhalb einer Region zu identifizieren. So sehr, dass ich eine Extraktionsmethode für die Region durchführen und weitermachen konnte.

Regionen ermutigen Entwickler, ihren Mist in Sichtweite zu "verstecken".

Michael Brown
quelle
15
+1 für Regionen ermutigen Entwickler, ihren Mist in Sichtweite zu "verstecken". Bei richtiger Verwendung finde ich jedoch, dass Regionen dazu beitragen, Code logisch zu gruppieren und zu einem späteren Zeitpunkt leicht zu finden.
Darren Young
Dies ist seit langem ein Problem bei Falteditoren. Ich habe das gleiche gemacht, als ich das letzte Mal in OCCAM programmiert habe.
Michael Kohne
2
Ich liebe Regionen ... aber nur für die Organisation ... ohne digitale Unmengen von Code zu verstecken.
Zusammenfassung
3
+1. Aus diesem Grund verstößt die Verwendung von Regionen auch gegen die StyleCop-Regel SA1124 DoNotUseRegions.
Arseni Mourzenko
1
Ich habe Projekte, die mit einer großen Anzahl von Feldern in SQL arbeiten, und der Code, der es aktualisiert / erstellt, besteht aus vielen Zeilen. Eine Region #region SQL Updatemacht sie zusammenklappbar, sodass weniger Bildlauf erforderlich ist.
JYelton
12

Für mich ist das schlechteste Muster Kopieren / Einfügen .

LennyProgrammierer
quelle
28
Für mich ist das schlechteste Muster Kopieren / Einfügen.
Andrew Arnold
9

Nicht überladende Methoden:

// Do something
public int doSomething(Data d);

// Do same thing, but with some other data
public int doSomething2(SomeOtherData d);

Zeigt deutlich, dass der Programmierer das Überladen nicht verstanden hat.

Michael K.
quelle
5

Schleifenschaltersequenzen

http://en.wikipedia.org/wiki/Loop-switch_sequence

Sie nerven mich bis zum Äußersten und zeigen wirklich, wie unerfahren der Entwickler war

CaffGeek
quelle
Ah, eine terminierende Zustandsmaschine :)
Warum müssen Sie diese vergrabenen Erinnerungen zur Sprache bringen? Ich hatte so einen schönen Tag.
Malachi
5

Softcodierung , dh wenn Programmierer alles daran setzen, Hardcodierung zu vermeiden, und auf der anderen Seite der Skala landen - "hartcodierte" Abhängigkeiten.

AareP
quelle
4

Behalten Sie den Status im Client.

Einmal mit einer Webanwendung gearbeitet, bei der der gesamte Status im Browser beibehalten wurde. (Um eine problemlose Skalierbarkeit zu gewährleisten, wurden alle Ausnahmen ignoriert.)

user1249
quelle
Könnten Sie bitte näher darauf eingehen? Imho, für eine Webanwendung ist es in Ordnung, wenn sich der einzige Status im Browser befindet (dh die Cookies) und der Server "nichts geteilt" ist. Oder meinst du "Status" wie in "Anwendungsdatenbank"?
Keppla
Status: Wie in den tatsächlichen Daten, mit denen gearbeitet werden soll.
OO du hast mein tiefstes Mitgefühl.
Keppla
4

Massive Checkins

Ich hasse es, wenn ich sehe, dass ein Entwickler seit über einer Woche nicht mehr eingecheckt hat. Es bedeutet, dass er entweder feststeckt und nicht nach Hilfe gesucht hat oder eine Reihe von Funktionen in einem großen Check-in zusammengefasst hat. (Ich habe das Worst-Case-Szenario ausgelassen, er tut einfach nichts. Das ist leicht zu lösen ... zwei Wörter klingen, als wären Sie eingestellt.)

Wenn Sie einen großen Check-in durchführen, verlieren Sie viele Vorteile von SCM, z. B. die Möglichkeit, einen Änderungssatz mit einer bestimmten Funktion zu verknüpfen. Außerdem müssen Sie wahrscheinlich viel zusammenführen, und das ist nicht unbedingt einfach richtig zu machen.

Michael Brown
quelle
1
Nichts zu tun ist nicht immer der schlimmste Fall. Manchmal ist es besser, es von Grund auf neu schreiben zu müssen, als Code zum Umschreiben zu haben ...
Malachi
4

Derzeit arbeite ich mit einem Legacy-Code und ich mag die Art und Weise, wie der vorherige Codierer das erste Element einer Liste erhält:

String result;
for(int i = 0; i < someList.size(); i++) {
    result = someList.get(i);
    break;
}

Aber das Schlimmste, was ich in diesem Code gesehen habe, ist das Definieren von Klassen in Inline-JSPs-Seiten, das Schreiben von HTML, CSS und Javascript mit scriptlet und out.println :-(

SourceRebels
quelle
4

Eines der schlimmsten Verhaltensmuster, das ich je gesehen habe, war ein Shop, in dem Code erst nach der Produktion in die Versionskontrolle eingecheckt werden konnte. In Verbindung mit exklusiven Checkouts in VSS führte dies zu einem komplizierten Prozess des Rückgängigmachens von Checkouts, wenn ein Produktionsfehler vor der nächsten Version behoben werden musste, geschweige denn, dass mehr als eine Person eine bestimmte Datei für die kommende Version ändern musste.

Die Tatsache, dass dies eine Abteilungsrichtlinie war, machte es noch schlimmer als der Fall eines einzelnen Entwicklers, der sich so verhält.

Malachi
quelle
3

Sperren eines String-Literal

synchronized("one") { /* block one A*/ }

synchronized("one") { /* block one B*/ }

Sehr lange Klassennamen. (in der JRE)

com.sun.java.swing.plaf.nimbus.
InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState

Schlechte Vererbungsstruktur

com.sun.corba.se.internal.Interceptors.PIORB extends
com.sun.corba.se.internal.POA.POAORB extends
com.sun.corba.se.internal.iiop.ORB extends
com.sun.corba.se.impl.orb.ORBImpl extends
com.sun.corba.se.spi.orb.ORB extends
com.sun.corba.se.org.omg.CORBA.ORB extends 
org.omg.CORBA_2_3.ORB extends
org.omg.CORBA.ORB

Eine Ausnahme, die es nicht ist.

public interface FlavorException { }

Sinnlose und kryptische Fehlerbehandlung

if (properties.size() > 10000)
   System.exit(0);

Unnötige Erstellung von Objekten

Class clazz = new Integer(0).getClass();
int num = new Integer(text).intValue();

Eine Ausnahme für andere Zwecke auslösen

try {
    Integer i = null;
    Integer j = i.intValue();
} catch (NullPointerException e) {
    System.out.println("Entering "+e.getStackTrace()[0]);
}

Verwenden von Instanzobjekten für statische Methoden.

Thread.currentThread().sleep(100);

Synchronisieren in einem nicht endgültigen Feld

synchronized(list) {
   list = new ArrayList();
}

Sinnlose Kopie eines konstanten Strings

String s = new String("Hello world");

Sinnloser Aufruf von String.toString ()

String s = "Hello";
String t = s.toString() + " World";

Ruft System.gc () auf, um Speicherplatz freizugeben

Setzen Sie die lokale Variable auf null, um Speicherplatz freizugeben

    // list is out of scope anyway.
    list = null;
}

Verwenden von ++ i anstelle von i ++ aus Leistungsgründen (oder einer anderen Mikro-Mikro-Optimierung)

Peter Lawrey
quelle
Dies sind nicht unbedingt Anti-Patterns, sondern nur schlechte Codierung.
Gary Willoughby
@ Gary oder schlechte Entwicklungsmuster sehe ich wiederholt. Vielleicht nicht innerhalb der strengen Definition eines Anti-Musters.
Peter Lawrey
1
@Peter: "Ruft System.gc () auf, um Speicher freizugeben". Ich habe eine Gelegenheit gesehen, bei der .NET mit einer OutOfMemory-Ausnahme explodierte, sofern GC nicht explizit aufgerufen wurde. Natürlich war es eher eine Ausnahme als eine Regel.
Coder
3

Code bestreut mit:

// TODO: 

oder

// TODO: implement feature 

ohne zusätzliche Informationen.

Malachi
quelle
2

Iterator für Dummies:

Iterator iCollection = collection.iterator();
for(int i = 0 ; i < collection.size() ; i++ ){
    if(collection.get(i) == something){
       iCollection.remove();
    }
 }

Singletono-Fabrik:

public class SomeObject{
   private SomeObject() {}
   public static SomeObject getInstance(){
       return new SomeObject();
   }
}

if-else-getriebene Entwicklung (auch Open-Close-Prinzip genannt - offen für Modifikationen, geschlossen zum Verständnis):

if (sth1){
...  
}else if(sth2){
..
}
...
..
else if(sth1000000000000){
...
}

StringPattern (auch StringObject genannt):

a) sendercode
if(sth1)
   str+="#a";
if(sth2)
   str+="#b";
...
if(sth1000)
   str+="#n";

b) receiver
   regexp testing if str contains #a, #b, ... #n
Marcin Michalski
quelle
Das else ifist dann aber oft nur der Weg, um Dinge zu erledigen. Ich denke über Saiten nach; Ich kann keinen Schalter benutzen. Die Bedingungen sollten gleich sein, damit es nützlich ist.
Michael K
IMHO jedes if / else kann durch einfaches Mapping oder Besuchermuster ersetzt werden. Im Fall von Zeichenfolgen, dh Sie haben möglicherweise eine Eigenschaftendatei wie: someString1 = some.package.ObjectToHandleSomeString1
Marcin Michalski
2
Der Singleton ist eine Fabrik . An diesem Code ist nichts auszusetzen. Das einzige, was falsch sein könnte, ist, dass externer Code davon ausgeht, dass jeder Aufruf von getInstancedieselbe Instanz zurückgibt. Eine solche Annahme würde die Einkapselung brechen und ist in der Tat eines der häufigsten Anti-Muster.
back2dos
Genau deshalb ist es so verwirrend :) Wenn die Methode create () heißt oder jedes Mal dieselbe Instanz zurückgibt, ist alles in Ordnung
Marcin Michalski,
2

Es ist nicht so sehr ein Codierungsmuster, sondern ein Verhaltensmuster, aber es ist ziemlich schlecht: Ändern Sie etwas im Code (sagen wir, die Anforderungen haben sich geändert) und optimieren Sie dann alle Komponententests, bis der Code es besteht. Optimieren oder Entfernen des gesamten Testcodes aus der Testmethode, aber Belassen der Methode dort.

Dies ist jedoch mit einem allgemeineren Muster verknüpft, dem That'll Do- Muster. Hier ist eine repräsentative Codezeile dafür:

int num = new Integer( stringParam ).parseInt( stringParam );

Es funktioniert schließlich.

biziclop
quelle
2

Ich verachte die Inversion der Abstraktion oder die Neuerfindung von Grundelementen auf niedriger Ebene zusätzlich zu Grundelementen auf hoher Ebene. Manchmal wird dies jedoch von schlechten Sprachdesignern verursacht, nicht von schlechten Programmierern. Beispiele:

  1. Verwenden einer einzelnen Methodenklasse ohne Elementvariablen und einer entsprechenden Schnittstelle (implementiert in Form von Tabellen mit Funktionszeigern) anstelle eines Funktionszeigers. Beachten Sie, dass Sie in Sprachen wie Java möglicherweise keine Wahl haben.

  2. In MATLAB und R besteht das Bestehen darauf, dass alles eher ein Vektor / eine Matrix als ein Primitiv ist.

  3. Während wir MATLAB verprügeln, wie wäre es mit der Tatsache, dass es keine ganzen Zahlen hat. Wenn Sie also eine ganze Zahl benötigen, müssen Sie ein Double verwenden.

  4. Rein funktionale Sprachen, in denen Sie Funktionsaufrufe verwenden müssen, um eine Schleife zu schreiben.

Dsimcha
quelle
1

Es wäre definitiv Kopieren / Einfügen, ich habe gesehen, wie viel schlechter Code gemacht wurde, das und Cowboy-Codierung und alles, was daraus resultiert. (Gottklassen, extra große Methoden, schlecht durchdachte Algorithmen usw.)

Und wenn Entwurfsmuster zulässig sind, würde ich sagen: Ein Projekt als eine Reihe von Aktionen aus einem Plan ausführen, ohne eine Entwurfs- oder Domänenanalyse durchzuführen.

Coyote21
quelle
1

Mehrzweck-Java-Bohne -

Eine Java-Bean mit vielen Variablen, die in verschiedenen Operationen verwendet wird. Jede Operation verwendet eine beliebige Teilmenge der Bean-Variablen und ignoriert die anderen. Ein paar Variablen für den GUI-Status, ein paar Variablen für die Weitergabe zwischen Komponenten, einige, die wahrscheinlich nicht einmal mehr verwendet werden. Die besten Beispiele haben keine Dokumentation, die die Wertschätzung des Musters behindern würde.

Ich kann auch den Geliebten nicht vergessen

try{ 
   ... //many lines of likely dangerous operations
}
catch(Exception e){}
Steve B.
quelle
IMHO, Ausnahmen stinken. Sie sind zu schwer, um sie richtig zu machen, und sie fügen ein falsches Sicherheitsgefühl hinzu.
Coder
Was auch immer Ihre Meinung über den Gestank von Ausnahmen ist, das stille Schlucken muss mehr stinken.
Steve B.
1

Ein ehemaliger Mitarbeiter hatte die Angewohnheit, Objekte durch Überschreiben ihrer Eigenschaften wiederzuverwenden, anstatt einfach neue zu erstellen. Ich hätte mir nie vorstellen können, wie viele Probleme dies bei der Implementierung neuer Funktionen verursacht hat.

deltreme
quelle
1

Etwas, das mir viel Kummer bereitet hat, ist das Muster "Große Karte am Himmel". Eine Karte herumwerfen, anstatt die richtigen Objekte zu verwenden. Sie haben keine Ahnung, welche "Variablen" es enthält, ohne zu debuggen, und Sie wissen nicht, was es enthalten könnte, ohne den Code rückwärts zu verfolgen. Ordnet Strings normalerweise Objekten oder Strings Strings zu, die Sie möglicherweise in Grundelemente analysieren sollen.

Buhb
quelle
Klingt so, als würde man sich in ASP.NET auf Session und ViewState verlassen, um Datenmengen zwischen Seiten zu übertragen, was leider oft erforderlich ist ...
Wayne Molina
1

Eines meiner bevorzugten Anti-Patterns für die Entwicklung ist die Verwendung eines Datenbank- "Designs", bei dem einer oder mehreren Tabellen programmgesteuert kontinuierlich zusätzliche Spalten hinzugefügt werden müssen . Dies ist ein Cousin des "Designs", der für jede Instanz einer Entität eine neue Tabelle erstellt. Beide stoßen unweigerlich auf Einschränkungen des Datenbankservers, aber normalerweise erst, wenn das System schon seit einiger Zeit in Produktion ist.

Malachi
quelle
0

Ich denke, eines der schlimmsten Anti-Patterns, die ich je gesehen habe, ist die Verwendung einer Datenbanktabelle als temporärer Speicher anstelle des Computerspeichers.

Die Problemdomäne ist proprietär, was es mir nicht erlaubt, sie zu erklären, aber es ist nicht notwendig, das Grundproblem zu verstehen. Dies war eine in Java geschriebene GUI-Anwendung mit einer Backend-Datenbank. Es sollte bestimmte Eingabedaten übernehmen, bearbeiten und dann die verarbeiteten Daten in die Datenbank übertragen.

Unser Projekt hat einen ziemlich komplizierten Algorithmus, der Zwischenwerte für die spätere Verarbeitung speichert. Anstatt die temporären Objekte in ... Objekte zu kapseln, wurde eine Datenbanktabelle wie "t_object" erstellt. Jedes Mal, wenn ein Wert berechnet wurde, wurde er dieser Tabelle hinzugefügt. Nachdem der Algorithmus seine Arbeit beendet hat, wählt er alle Zwischenwerte aus und verarbeitet sie alle in einem großen Map-Objekt. Nachdem die gesamte Verarbeitung abgeschlossen war, wurden die verbleibenden Werte, die zum Speichern markiert wurden, zum realen Datenbankschema hinzugefügt und die temporären Einträge in der Tabelle "t_object" wurden verworfen.

Die Tabelle wurde auch wie eine eindeutige Liste verwendet, Daten konnten nur einmal existieren. Dies wäre vielleicht ein anständiges Merkmal des Entwurfs gewesen, wenn wir Einschränkungen für die Tabelle implementiert hätten, aber am Ende haben wir die gesamte Tabelle durchlaufen, um festzustellen, ob die Daten vorhanden waren oder nicht. (Nein, wir haben nicht einmal Abfragen verwendet, die where-Klauseln mit CONTAINS verwendet haben.)

Einige der Probleme, auf die wir aufgrund dieses Designs gestoßen sind, waren speziell das Debuggen. Die Anwendung wurde für Pipeline-Daten erstellt, sodass mehrere GUIs vorhanden sind, die die Daten vorverarbeiten, bevor sie zu diesem Algorithmus gelangen. Der Debugging-Prozess bestand darin, einen Testfall zu verarbeiten und dann direkt nach Abschluss des obigen Abschnitts anzuhalten. Dann würden wir die Datenbank abfragen, um zu sehen, welche Daten in dieser Tabelle enthalten waren.

Ein weiteres Problem, das wir festgestellt haben, war, dass Daten nicht ordnungsgemäß aus dieser temporären Tabelle gelöscht wurden, was in Zukunft die Ausführung beeinträchtigen würde. Wir haben festgestellt, dass dies darauf zurückzuführen ist, dass Ausnahmen nicht ordnungsgemäß behandelt wurden und die Anwendung daher nicht ordnungsgemäß beendet wurde und die Daten in der Tabelle, über die sie die Kontrolle hatte, nicht gelöscht wurden.

Wenn wir Basic Object-Oriented Design verwendet und alles im Speicher behalten hätten, wären diese oben genannten Probleme niemals aufgetreten. Erstens wäre das Debuggen einfach gewesen, da wir leicht Haltepunkte in der Anwendung einrichten und dann den Speicher im Stapel und im Heap untersuchen könnten. Zweitens wäre der Java-Speicher bei einem abnormalen Beenden der Anwendung auf natürliche Weise bereinigt worden, ohne sich Gedanken über das Löschen aus der Datenbank machen zu müssen.

HINWEIS: Ich sage nicht, dass dieses Muster von Natur aus schlecht ist, aber in diesem Beispiel fand ich es unnötig, wenn grundlegende OO-Prinzipien ausgereicht hätten.

Ich bin mir nicht sicher, wie dieses Anti-Muster heißen soll, da dies das erste Mal ist, dass ich so etwas gesehen habe. Gibt es gute Namen für dieses Muster?

jluzwick
quelle
Ich würde das nicht als pauschales Problem bezeichnen. Es hängt davon ab, wie viele temporäre Daten gespeichert werden und was damit gemacht wird.
Großmeister
Ich sollte dem Beitrag mehr hinzufügen, aber das Hauptproblem war, dass anstatt Daten zu ändern und auf die Daten aus dem Speicher zuzugreifen, die Daten mit Hack-SQL-Code manipuliert wurden. Dies führte zu erhöhter Komplexität und schwerwiegenden Leistungsproblemen.
Jluzwick
2
Sie erwähnen Ihre Problemdomäne nicht, aber es ist nicht immer eine schlechte Sache. Wenn Sie den Status an anderer Stelle beibehalten, können Prozesse skaliert und während langer Laufzeiten überprüft werden, auch beim Debuggen. Verursachte der DB-Zugriff Leistungsprobleme oder Bedenken?
Jé Queue
Ich habe den Artikel bearbeitet, um besser zu reflektieren, wie dies in unserem Projekt verwendet wurde, aber wir hatten beim Debuggen zahlreiche Probleme, insbesondere weil wir die Datenbank abfragen mussten, um die temporären Variablen zu sehen. Außerdem hatten wir große leistungsbezogene Probleme, da die Datenbank ständig nach Daten abgefragt und überprüft wurde, ob bereits neue Daten vorhanden waren.
Jluzwick
0

Cart-Before-The-Horse - auch bekannt als YouMightNeedIt

Beispielsweise:

  • Erstellen eines RDMB-Schemas mit abstrakten Konzepten, Querverweisen - im Wesentlichen einem überverallgemeinerten Datenwürfel ... und DANN Schreiben von Funktionen um ein Do-Everything-Modell.
Sheldon Warkentin
quelle
Das wäre YAGNIs böser Zwillingsbruder, oder?
Wayne Molina
0

IMO ist das schlimmste Anti-Pattern, das ich je gesehen habe, das Anti-Pattern "Wir brauchen keine stinkenden Muster": Die Idee, dass Design-Patterns Zeitverschwendung sind und Sie Code schneller schreiben können, indem Sie ihn einfach zusammenfügen und kopieren / nach Bedarf einfügen.

Lobende Erwähnung verdient Code, der ein Objekt aus der Datenbank mit dem alten VB6-Stil lädt:

Foobar oFoo = new Foobar();
oFoo.FooID = 42;
if (oFoo.Load()) { 
    // do something with oFoo
}

an sich kein wirkliches Anti-Muster, zeigt aber, dass es nicht möglich ist, die richtige Architektur auszunutzen und Bedenken zu trennen.

Auch solche Dinge:

// this name is misleading, we may not always want to stand in fire,
// we may want to stand in slime or voidzones or ice patches...
public Foobar StandInFire() { }

// why is this here???
public string BeatWithNerfBat(string whom) { }

// ????
public int GivePony(string to) { }
Wayne M.
quelle