Ich habe Probleme beim Definieren dieses Datenmusters, auf das ich bei der Arbeit an mehreren Anwendungen gestoßen bin.
Es besteht aus:
- Ein Objekttyp, der aus vielen Objekten selbst besteht
- Ein zweiter Objekttyp, bei dem jede Instanz viele des ersten Objekts hat
- Und jedes der Unterobjekte des ersten Objekts kann pro Zuordnung zum zweiten Objekttyp geändert werden.
Ein einfaches Beispiel könnte sein:
- Ein Programmierkurs, der aus einer Reihe von Lektionen besteht
- Die Lektionen bestehen aus einer Reihe von Aufgaben.
- Ein Kurs kann einem Studenten zugewiesen werden.
- 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.
quelle
Antworten:
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.
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.
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 .
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.
quelle
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.
quelle
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.
quelle