Objektorientierte „Normalisierung“

28

Bei der Datenbankprogrammierung gibt es eine Technik namens "Normalisierung", die Sie mit den Daten durchführen, die Sie speichern möchten.

Hat jemand versucht, dieses Konzept auf das Objektdesign anzuwenden? Wie hast du? Wie ist es gelaufen?

Bearbeiten: Zum Erweitern / Verdeutlichen ist die Datenbanknormalisierung mehr als eine Reihe von Prinzipien zur Reduzierung der Redundanz. Es gibt tatsächlich Schritte und Phasen, die Sie durchlaufen, und zumindest mäßig objektive Maßnahmen, die Ihnen mitteilen, in welcher Phase Sie sich befinden. Das Objektdesign hat seine eigenen Prinzipien, und es gibt das Konzept des Geruchs dass du in XX-Form0,1,2 bist ... etc ... und Methoden, um auf die am nächsten "normalisierte" Ebene zu gelangen?

Edward Strange
quelle
2
... Sie meinen, haben wir versucht, nicht mehrere redundante Variablen in unseren Klassen und nicht mehrere redundante Klassen in unseren Projekten zu haben? Würde das überhaupt funktionieren?
Satanicpuppy
2
@Steven A. Lowe: Wo waren Sie vor fünf Jahren, als ich mich für ein Thema meiner Masterarbeit entschieden habe? ;)
Ich habe es noch nie ausprobiert (weshalb ich als Kommentar antworte), aber ich vermute, Sie könnten dies mit einem Cache aus gemeinsam genutzten Daten, Zeigern von Objekten auf zwischengespeicherte gemeinsam genutzte Daten und einer Art Abhängigkeitsinjektionsmechanismus tun um die Zeiger der Instanzen auf die freigegebenen Daten zu verweisen ...
FrustratedWithFormsDesigner
Eine sehr interessante Frage finde ich dabei.
5
Ich denke, Refactoring deckt so ziemlich alles ab, sowohl für OOP als auch für andere Programmiermethoden.
JohnFx

Antworten:

27

Während einige der zugrunde liegenden Spannungen, die die Datenbanknormalisierung vorantreiben, in einem OO-System nicht vorhanden sind, sind es einige. Diese haben zu OO-Entwurfsmustern und -Prinzipien geführt, die in gewisser Weise mit der Normalisierung vergleichbar sind, zumindest insofern, als OO-Systeme mit relationalen Datenbanken vergleichbar sind. Beispielsweise:

Mit anderen Worten, hat jemand versucht, Datenbanknormalisierungstechniken auf OOP anzuwenden? Nein, da OOP bereits Lösungen für die gemeinsamen Probleme bietet, die durch die Normalisierung für relationale Datenbanken gelöst werden.

Rein Henrichs
quelle
+1 Viel besser als das, was ich versucht habe zu schreiben!
Michael K
Das sind Prinzipien, aber keine Techniken. Wie würden Sie diese Prinzipien verwenden, um ein Objektdesign zu "normalisieren"?
Edward Strange
3
Auch die Datenbanknormalisierung ist ein Prinzip. In beiden Fällen gibt es Muster (oder Techniken), die beschreiben, wie Entscheidungen in Bezug auf diese Prinzipien getroffen werden. Schauen Sie sich zum Beispiel Martin Fowlers Bücher zum Thema Refactoring und Kent Becks Bücher zu Mustern an. Der Unterschied besteht darin, dass das Datenbankdesign eine kleinere, weniger komplexe Domäne ist, die einfacher zu quantifizieren und in ein einfaches Regelwerk umzuwandeln ist.
Rein Henrichs
5
@ Crazy Eddie: Wie machst du das mit einer relationalen Datenbank? Sie suchen nach Fällen, in denen ein Auftraggeber verletzt wird, und korrigieren sie. Wenn Sie eine Klasse mit drei Jobs sehen, schreiben Sie sie als drei Klassen um. Wenn Sie nach einem Verb wie "normalisieren" suchen, ist es vielleicht ein "Refaktor", obwohl das nicht ganz so spezifisch ist, dass es inklusiv ist.
Jeremy
1
@Rein: Datenbankdesign ist weder kleiner noch weniger komplex als OOP, aber es hatte einen großen Vorteil: Es begann mit einer soliden theoretischen Grundlage und einem mathematischen Modell. OOP hat viele Heuristiken weiterentwickelt, hat aber immer noch keinen vollständigen Formalismus.
Steven A. Lowe
18

Ja, ja ich habe

Ich habe über dieses Thema lange geschwiegen; Es ist Zeit, sich zu äußern.

  • Hat jemand versucht, dieses Konzept auf das Objektdesign anzuwenden?

Ja. Ich arbeite seit über 20 Jahren an der Formalisierung der Objektnormalisierung (und damit der zugrunde liegenden objektorientierten Theorie).

  • Wie hast du?

Durch die Erkenntnis, dass Daten und Code zumindest theoretisch austauschbar sind. Dies bedeutet, dass die Prinzipien der Normalisierung und der relationalen Operationen sowohl für Code als auch für Daten gelten können.

  • Wie ist es gelaufen?

Bisher hat es ziemlich gut geklappt - ich glaube, die gewonnenen Erkenntnisse waren die "Geheimwaffen" meiner Fähigkeiten in den Bereichen Design, Analyse und Refactoring.

Ich habe darüber vorher noch nichts öffentlich gesagt, weil ich dachte, dass ich irgendwann Zeit haben würde, die Recherche abzuschließen - und die implizierten Werkzeuge selbst zu produzieren.

Aber ich bin zu dem Schluss gekommen, dass ich mit allem anderen, was in meinem Leben passiert, was wichtiger, lustiger und / oder rentabler ist, nicht die Zeit habe, die Forschung selbst abzuschließen. Je. Es besteht auch die erhebliche Möglichkeit, dass ich einfach nicht die erforderliche CS-theoretische Grundlage habe, um die Arbeit alleine zu erledigen.

Ich habe an der örtlichen Universität nachgefragt, ob ich einen oder zwei Doktoranden unterstützen möchte, wenn sie sich der Sache annehmen möchten, aber leider lehrt unsere örtliche Universität keine angemessene Grundlage für die Semantik von Programmiersprachen.

Es gab einige interessante Untersuchungen auf diesem Gebiet, aber alles, was mir bekannt ist, hat die Marke verfehlt. Entweder wird fälschlicherweise davon ausgegangen, dass die Normalisierung nicht für objektorientierte Modelle gilt, da sie aus einem relationalen Hintergrund stammt, oder es wird davon ausgegangen, dass die Normalisierung nur für die von Objekten definierten Daten gilt. Es gibt jedoch einige sehr interessante Near-Miss-Projekte ...

Das wirklich Interessante passiert, wenn Sie den Code normalisieren - was meiner Meinung nach die Grundlage für alle Umgestaltungen ist .

Jetzt denke ich, dass es das Beste ist, das Wort zu ergreifen, indem man vielleicht bittet, auf den DevDays 2011 in DC zu sprechen und herauszufinden, ob es eine Community gibt, die von diesem Zeug so begeistert ist wie ich.

Hier ein kleiner Vorgeschmack: Normalisierung ist der Prozess, etwas Minimales und Nicht-Redundantes zu machen. Das Don't Repeat Yourself (DRY) -Prinzip der objektorientierten Programmierung ist daher eine klare Manifestation der Ziele der Normalisierung. Ich glaube, ich kann zeigen, dass alle bekannten objektorientierten Entwurfs- / Programmierungs- / Umgestaltungsprinzipien die logische Folge der Objektnormalisierung sind. Ich denke, ich kann auch zeigen, dass es mit Systemen in Object Normal Form (ONF) interessantere Dinge gibt, als nur das Refactoring.

Steven A. Lowe
quelle
1
Noch umfangreichere Dokumente?
Steve314
4
VERÖFFENTLICHEN! (bitte?) (hübsch bitte?) Wenn Sie Hilfe benötigen, um Unterlagen in Ordnung zu bringen, kontaktieren Sie mich bitte.
AJ01
1
@ ChrisCirefice: Gerne, schreiben Sie mir eine E-Mail an [email protected]
Steven A. Lowe
1
@ ChrisCirefice: Nur zu Ihrer Information, Doktorand wechselte an eine andere Universität; Projekt wieder auf back-burner (aber ich schreibe ein Buch über DDD)
Steven A. Lowe
1
Hi @ StevenA.Lowe Ich bin wirklich an Ihrer Forschung interessiert. Ich habe ein ziemlich kurzes Papier gefunden. Encrypted.google.com/ Haben Sie dazu einen Kommentar? Übrigens, vielleicht können Sie Ihre Idee ein wenig veranschaulichen, indem Sie zuerst einen Blog-Beitrag schreiben? Vielen Dank.
Wei Qiu
5

Dies begann als Kommentar zu Rein Henrichs exzellenter Antwort , wurde aber zu lang ...

Die Normalisierung gilt für relationale Daten. Es wird zur Vermeidung von Duplikaten verwendet, wodurch die Datenintegrität einfacher sichergestellt werden kann, da jedes Datum nur an einem Ort gespeichert wird. Sie normalisieren eine Datenbank, indem Sie Verstöße gegen ein normalisiertes Formular feststellen und korrigieren.

Objektorientierte Programmierung gilt für Operationen an Daten. Es ist dazu gedacht, Methoden zur Manipulation von Daten zusammenzufassen. Sie können ähnliche Techniken auf Klassen anwenden, um doppelte Methoden zu eliminieren, indem Sie sich beispielsweise ansehen, von welchen Daten die Operation manipuliert oder abhängt. Zum Beispiel würde 1NF in einer OO-Perspektive keine doppelten Operationen innerhalb einer Klasse haben. 3NF könnte einer guten Vererbungsstruktur entsprechen, in der häufig verwendeter Code zu einer Oberklasse gehört. Ich bin sicher, Sie könnten dort auch eine Stelle finden, an der die Abhängigkeitsinjektion angebracht werden kann. Sie erreichen ein besseres Design (obwohl bisher nichts Vergleichbares entdeckt wurde), indem Sie Verstöße gegen gute Designprinzipien und Refactoring feststellen.

Es gibt in keiner Welt wirklich algorithmische Methoden, um ein gutes Design zu erreichen. Wie Rein Hendrichs betont, gibt es viele Prinzipien, die potenzielle Probleme identifizieren können (auch bekannt als Codegerüche). Entwurfsmuster und Best Practices sind einige der Methoden, mit denen versucht wurde, sie anzugehen. Testgetriebene Entwicklungen versuchen, sie frühzeitig zu finden, indem sie den Code so ausführen, wie er extern sein wird. Genau wie bei der Datenbankentwicklung wird die beste Lösung mit Erfahrung und Analyse gefunden.

Michael K
quelle
2
Meiner Ansicht nach sind Prinzipien eine Aussage über den idealen Weg, um eine Reihe von Spannungen zu lösen. Muster sind eine Heuristik zur Anwendung eines Prinzips. IOW-Prinzipien sind eine Aussage über die Struktur des Problemraums und Muster sind Regeln, um sie in einen Lösungsraum umzuwandeln. Aber ich bin ein bisschen mathe, also denke ich komisch :)
Rein Henrichs
2

Ein sehr guter Ansatz zum Entwerfen von Geschäftsmodellobjekten, der der Normalisierung ähnelt, ist die UML-Modellierung in Farbe .

Es ist eine Designstrategie von Peter Coad, die dabei hilft, die Geschäftsmodellobjekte zu abstrahieren.

Leider ist das Buch - Java-Modellierung in Farbe mit UML: Enterprise-Komponenten und -Prozesse - ausverkauft und Sie können nur gebrauchte kaufen.

Über diese Technik gibt es im Internet einige Artikel.

Wenn Sie mit relationalem Design vertraut sind, finden Sie UML-Modellierung in Farbe als Orientierungshilfe:

Lucas Machado
quelle
0

Haben Sie untersucht, ob Sie ORM-Java-Annotationen in Ihrem Code verwenden können, während Sie Ihr Klassendiagramm erstellen? Der Ruhezustand generiert die Datenbank, sobald die Modellierungsphase abgeschlossen ist. Das Diagramm ist in diesem Beispiel nur ein Betrachter des Codes.

UML_GURU
quelle
0

Objektreferenzen oder -zeiger ähneln Fremdschlüsseln. Das ist so tief, wie ich bereit bin, darüber nachzudenken. :)

Eigentlich werde ich tiefer nachdenken. Wenn Sie Ihre Objekte mit einer Duplizierung von 0 Daten modellieren und Ihre Objekte "abfragen" und satzbasierte Aktualisierungen durchführen könnten, würde es keine Unterbrechung geben. Tatsächlich können Sie dies tun, indem Sie eine Objektkonsumentenbibliothek erstellen. Microsoft hat dies bereits berücksichtigt, ist jedoch die Richtung gegangen, dass die satzbasierte LINQ-Syntax Teil von C # über eine "Abfragebibliothek" wird.

jojo
quelle