Hier ist eine vereinfachte Anforderung:
Benutzer erstellt ein
Question
mit mehrerenAnswer
s.Question
muss mindestens eine habenAnswer
.Klarstellung: Denken Sie
Question
undAnswer
wie in einem Test : Es gibt eine Frage, aber mehrere Antworten, bei denen nur wenige richtig sein können. Der Benutzer ist der Schauspieler, der diesen Test vorbereitet, daher erstellt er Fragen und Antworten.
Ich versuche, dieses einfache Beispiel so zu modellieren, dass 1) es mit dem realen Modell übereinstimmt 2) mit dem Code ausdrucksstark ist, um potenziellen Missbrauch und Fehler zu minimieren und Entwicklern Hinweise zur Verwendung des Modells zu geben.
Frage ist eine Entität , während Antwort Wertobjekt ist . Frage enthält Antworten. Bisher habe ich diese möglichen Lösungen.
[A] Fabrik im InnerenQuestion
Anstatt Answer
manuell zu erstellen , können wir Folgendes aufrufen:
Answer answer = question.createAnswer()
answer.setText("");
...
Dadurch wird eine Antwort erstellt und der Frage hinzugefügt. Dann können wir die Antwort manipulieren, indem wir ihre Eigenschaften festlegen. Auf diese Weise können nur Fragen eine Antwort liefern. Wir verhindern auch, dass wir eine Antwort ohne Frage haben. Wir haben jedoch keine Kontrolle über das Erstellen von Antworten, da dies in der Question
.
Es gibt auch ein Problem mit der 'Sprache' des obigen Codes. Der Benutzer ist derjenige, der Antworten erstellt, nicht die Frage. Persönlich mag ich es nicht, wenn wir ein Wertobjekt erstellen und es je nach Entwickler mit Werten füllen - wie kann er sicher sein, was hinzugefügt werden muss?
[B] Fabrik in Frage, nimm # 2
Einige sagen, wir sollten diese Art von Methode haben in Question
:
question.addAnswer(String answer, boolean correct, int level....);
Ähnlich wie bei der obigen Lösung verwendet diese Methode obligatorische Daten für die Antwort und erstellt eine, die ebenfalls zur Frage hinzugefügt wird.
Das Problem hierbei ist, dass wir den Konstruktor von ohne guten Grund duplizierenAnswer
. Schafft die Frage wirklich eine Antwort?
[C] Konstruktorabhängigkeiten
Lassen Sie uns beide Objekte selbst erstellen. Lassen Sie uns auch das Abhängigkeitsrecht im Konstruktor ausdrücken:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Dies gibt dem Entwickler Hinweise, da die Antwort nicht ohne Frage erstellt werden kann. Wir sehen jedoch nicht die "Sprache", die besagt, dass die Antwort der Frage "hinzugefügt" wird. Müssen wir es auf der anderen Seite wirklich sehen?
[D] Konstruktorabhängigkeit, nimm # 2
Wir können das Gegenteil tun:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Dies ist die entgegengesetzte Situation von oben. Hier können Antworten ohne eine Frage existieren (was keinen Sinn ergibt), aber eine Frage kann nicht ohne Antwort existieren (was keinen Sinn ergibt). Auch die ‚Sprache‘ ist hier deutlicher zu dieser Frage wird hat die Antworten.
[E] Gemeinsamer Weg
Dies ist, was ich den üblichen Weg nenne, das erste, was Menschen normalerweise tun:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
Dies ist eine "lose" Version der beiden oben genannten Antworten, da sowohl Antwort als auch Frage ohne einander existieren können. Es gibt keinen besonderen Hinweis , dass Sie haben sie zusammen zu binden.
[F] Kombiniert
Oder sollte ich C, D, E kombinieren, um alle Möglichkeiten der Beziehungsherstellung abzudecken und Entwicklern zu helfen, das zu verwenden, was für sie am besten ist.
Frage
Ich weiß, dass die Leute eine der oben genannten Antworten basierend auf der Vermutung auswählen können. Aber ich frage mich, ob eine der oben genannten Varianten besser ist als die andere, mit einem guten Grund dafür. Denken Sie auch nicht an die obige Frage. Ich möchte hier einige Best Practices zusammenfassen, die in den meisten Fällen angewendet werden können. Wenn Sie zustimmen, sind die meisten Anwendungsfälle bei der Erstellung einiger Entitäten ähnlich. Lassen Sie uns hier auch technologieunabhängig sein, z. Ich möchte nicht darüber nachdenken, ob ORM verwendet wird oder nicht. Ich will nur einen guten, ausdrucksstarken Modus.
Irgendeine Weisheit dazu?
BEARBEITEN
Bitte ignorieren Sie andere Eigenschaften von Question
und Answer
, sie sind für die Frage nicht relevant. Ich habe den obigen Text bearbeitet und die meisten Konstruktoren geändert (wo erforderlich): Jetzt akzeptieren sie alle erforderlichen Eigenschaftswerte. Dies kann nur eine Fragezeichenfolge oder eine Zuordnung von Zeichenfolgen in verschiedenen Sprachen, Status usw. sein. Unabhängig davon, welche Eigenschaften übergeben werden, stehen sie nicht im Mittelpunkt.) Nehmen wir also an, wir übersteigen die erforderlichen Parameter, sofern nicht anders angegeben. Danke!