Gibt es ein Entwurfsmuster für die Verwaltung tiefer Viele-zu-Viele-Beziehungen?


10

Ich habe Probleme beim Definieren dieses Datenmusters, auf das ich bei der Arbeit an mehreren Anwendungen gestoßen bin.

Es besteht aus:

  1. Ein Objekttyp, der aus vielen Objekten selbst besteht
  2. Ein zweiter Objekttyp, bei dem jede Instanz viele des ersten Objekts hat
  3. Und jedes der Unterobjekte des ersten Objekts kann pro Zuordnung zum zweiten Objekttyp geändert werden.

Ein einfaches Beispiel könnte sein:

  1. Ein Programmierkurs, der aus einer Reihe von Lektionen besteht
  2. Die Lektionen bestehen aus einer Reihe von Aufgaben.
  3. Ein Kurs kann einem Studenten zugewiesen werden.
  4. Sobald jedoch ein Kurs einem Schüler zugewiesen wurde, kann jede Lektion und / oder Aufgabe an diesen Schüler angepasst werden, wobei sie entfernt und ergänzt werden, bis der ursprüngliche Kurs möglicherweise nicht mehr erkennbar ist.

In meinen Lösungen ergibt sich Folgendes:

Bei der Zuordnung eines Kurses zu einem Studenten wird der Kurs in den Speicher geladen. Anschließend wird für jedes Unterobjekt ein Schüler / Unterobjekt-Beziehungsobjekt mit den entsprechenden Metadaten generiert. Im Wesentlichen verwende ich das Originalobjekt als Vorlage, um die erforderlichen anpassbaren Objekte zu generieren.

Dies führt zu einer großen Datenmenge, da die Unterobjekte komplexer und nummerierter werden. Ich frage mich, ob es eine Optimierung oder ein Muster gibt, um die Logik / Komplexität zu reduzieren, die zur Manipulation dieses Datenmusters erforderlich ist.


2
Sind Sie sicher, dass Sie "die Datenmenge reduzieren" möchten? Suchen Sie stattdessen nach Möglichkeiten, um "die Menge an nicht trivialem Code und Logik zu reduzieren", die geschrieben werden müssen, um das erforderliche Verhalten zu implementieren? (Ich
stelle

@rwong Ja, "die Menge an nicht trivialem Code und Logik zu reduzieren" ist mein Endziel. Für mich bedeutet das, die Datenkomplexität auf irgendeine Weise zu reduzieren, aber das ist nicht unbedingt eine Voraussetzung. Es ist zu einem so verbreiteten Datenmuster geworden, dass ich mich frage, ob es einen einfacheren Weg gibt, es zu verwalten.
Nicholas Pickering

1
Im Prinzip ist dies eine erweiterte Version einer m: n-Beziehung. Was ist mit einem Titel wie »Wie man komplexe Objektbeziehungen verwaltet«?
Thomas Junk

1
Eine große Datenmenge ist nicht gleichbedeutend mit einer großen Komplexität der Daten. Die Schwierigkeit, das zu verwalten, was Sie erstellen, wird wahrscheinlich mehr mit der Komplexität als mit dem Volumen zunehmen.
Walter Mitty

1
Interessant. Ich habe an mehreren Anwendungen gearbeitet, die dieses Muster haben, aber noch nie zuvor entdeckt, dass es sich um ein Muster handelt. Würde auch gerne einfachere Möglichkeiten zur Verwaltung dieser Art von Daten sehen.
Jules

Antworten:


6

Ich sehe einige Optionen, je nachdem, was Sie benötigen: (1) wenn es viele eindeutige Instanzen gibt, die einem gemeinsamen Algorithmus folgen, (2) wenn es viele ähnliche Objekte gibt oder Sie zur Laufzeit Objekte generieren, und (3) wenn Sie möchten das Verhalten des Objekts während der Ausführung dynamisch ändern. Hinweis: Sie können bei Bedarf alle hier genannten Muster kombinieren.

  1. Wenn jeder "zweite Objekttyp" eindeutig ist, aber einem ähnlichen Verhaltensmuster folgt, können Sie das Vorlagenmuster verwenden . Es hört sich so an, als ob Sie dies tun. Um es explizit zu machen, hat Ihre abstrakte Basisklasse einen allgemeinen Algorithmus programmiert. Bestimmte Schritte dieses Algorithmus sind in den abgeleiteten Klassen implementiert.

  2. Wenn Sie viele Objekte erstellen oder wenn das Erstellen von Objekten zur Laufzeit für Sie wichtig ist, können Sie das Factory-Muster verwenden .

  3. Und wenn Sie das Verhalten dynamisch ändern möchten, könnte Stategy Pattern funktionieren. Zum Beispiel, wenn ein Student in einem regulären Lehrplan entschieden wird, besondere Bedürfnisse zu haben oder an einem beschleunigten Programm teilzunehmen. Dies funktioniert, indem der "Schüler" eines Objekts zusammengestellt wird, das eine Basisklasse des Lehrplans darstellt. Der Lehrplan würde bei der Konstruktion des Schülers einem abgeleiteten Lehrplan zugewiesen (was seltsam klingt) und könnte später einem anderen abgeleiteten Lehrplan zugewiesen werden.

(Nur zu Ihrer Information, wenn Sie (3) Strategy Pattern mit C ++ verwenden, müssen Sie Rvalues ​​für die Komposition verwenden.)

Um Ihre Objekte und zweiten Objekte zu speichern, kann es sinnvoll sein, das Iteratormuster in Betracht zu ziehen (um sie zu durchlaufen, hinzuzufügen, zu löschen, zu sortieren usw.).

Eine gute Referenz sind Head First Design Patterns , die die von mir erwähnten Muster und ihre Implementierung abdecken. Sie arbeiten in Java.


0

Es fällt mir schwer zu glauben, dass Sie bei Vorhandensein eines Datenspeichers oder einer Persistenz zu einem bestimmten Zeitpunkt in einer Laufzeit Objekte mit dieser Tiefe benötigen würden. Ist das für CRUD GUIs? Wenn ja, dann würde ich vorschlagen, Ihren Ansatz von Anfang an zu ändern. IE:

Identifizieren Sie die Unterkonstruktion , die für die Schüler zu zeigen, und zustandsvoll speichert seinen Ursprung Index zurück an die DB und statelessly dass aktualisieren, nach oder aus der Sicht und dem Backend - db.


Ich bin mir nicht sicher, ob ich Ihren Vorschlag verstehe. Ich sollte ein leeres Unterobjekt generieren und den Benutzer dann zu einem anderen Formular zwingen, mit dem er das Unterobjekt ändern kann.
Nicholas Pickering

Ich schlage vor, dass Objekte an sich nicht viel bewirken, wenn Sie nur eine zustandslose Transaktion zwischen ihrem Inhalt und einer Back-End-Datenbank durchführen. Wenn dies der Fall ist, entfernen Sie sie und führen Sie einfach die Transaktion für Daten aus, die für das, was dem Client gegenübersteht, spezifisch sind.
John P. Feltz

Bearbeiten: Dies kann auch bedeuten, dass Objekte erstellt werden, um die bestimmten Daten zu erfassen, die gerade verarbeitet werden, wenn Sie aufgrund ihrer Bequemlichkeit in dieser Hinsicht auf ORM voreingenommen sind.
John P. Feltz

Wenn ich das nicht falsch verstehe, denke ich nicht, dass etwas über den Prozess zustandslos gemacht werden kann. Es hängt alles vom Kontext der Benutzeraktion ab. Wenn ein Benutzer ein primäres Objekt erstellt, erwartet er, dass die Unterstruktur sofort geändert werden kann.
Nicholas Pickering

-1

Ein angepasster Kurs für jeden Schüler bis zu dem Punkt, an dem der ursprüngliche Kurs nicht wiederzuerkennen ist, deutet darauf hin, dass der ursprüngliche Kurs lediglich eine „Standardreferenz“ ist. Ich würde eine Klasse namens CustomizedCourse (oder eine Liste davon) erstellen und diese (oder eine Liste davon) als Eigenschaft eines Schülers haben. Der CustomizedCourse kann einen Verweis auf den ursprünglichen Kurs für die „referenzielle“ Verwendung enthalten, aber die Hauptarbeit und die Daten befinden sich im CustomizedCourse selbst.


Downvoter Lust zu kommentieren?
Frezq

Ich habe nicht abgelehnt (ich bin der OP), aber es scheint, als würden Sie versuchen, die Vorlage oder das Strategiemuster zu beschreiben, die bereits in einer anderen Antwort beschrieben wurden.
Nicholas Pickering
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.