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?