Oto uproszczony wymóg:
Użytkownik tworzy
Question
z wielomaAnswer
s.Question
musi mieć co najmniej jedenAnswer
.Wyjaśnienie: pomyśl
Question
iAnswer
jak w teście : jest jedno pytanie, ale kilka odpowiedzi, z których kilka może być poprawnych. Użytkownik jest aktorem, który przygotowuje ten test, dlatego tworzy pytania i odpowiedzi.
Staram się modelować ten prosty przykład, aby 1) dopasować do rzeczywistego modelu 2), aby był wyrazisty z kodem, aby zminimalizować potencjalne niewłaściwe użycie i błędy oraz dać wskazówki programistom, jak korzystać z modelu.
Pytanie jest bytem , a odpowiedź jest przedmiotem wartości . Pytanie zawiera odpowiedzi. Do tej pory mam te możliwe rozwiązania.
[A] Fabryka w środkuQuestion
Zamiast tworzyć Answer
ręcznie, możemy wywołać:
Answer answer = question.createAnswer()
answer.setText("");
...
To stworzy odpowiedź i doda ją do pytania. Następnie możemy manipulować odpowiedzią, ustawiając jej właściwości. W ten sposób tylko pytania mogą stworzyć odpowiedź. Ponadto zapobiegamy otrzymywaniu odpowiedzi bez pytania. Jednak nie mamy kontroli nad tworzeniem odpowiedzi, ponieważ jest to na stałe zapisane w Question
.
Istnieje również jeden problem z „językiem” powyższego kodu. Użytkownik to ten, który tworzy odpowiedzi, a nie pytanie. Osobiście nie lubię, gdy tworzymy obiekt wartości i zależnie od programisty, aby wypełniał go wartościami - skąd może być pewien, co należy dodać?
[B] Fabryka wewnątrz pytania, weź nr 2
Niektórzy twierdzą, że powinniśmy zastosować tego rodzaju metodę w Question
:
question.addAnswer(String answer, boolean correct, int level....);
Podobnie jak w powyższym rozwiązaniu, ta metoda pobiera dane obowiązkowe dla odpowiedzi i tworzy takie, które również zostaną dodane do pytania.
Problem polega na tym, że powielamy konstruktora Answer
bez powodu. Czy pytanie naprawdę tworzy odpowiedź?
[C] Zależności konstruktora
Dajmy sobie swobodę w tworzeniu obu obiektów. Wyraźmy również zależność bezpośrednio w konstruktorze:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Daje to wskazówki dla programistów, ponieważ odpowiedzi nie można utworzyć bez pytania. Nie widzimy jednak „języka”, który mówi, że odpowiedź jest „dodana” do pytania. Z drugiej strony, czy naprawdę musimy to zobaczyć?
[D] Zależność konstruktora, weź # 2
Możemy zrobić odwrotnie:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Jest to sytuacja odwrotna do powyższej. Tutaj odpowiedzi mogą istnieć bez pytania (co nie ma sensu), ale pytanie nie może istnieć bez odpowiedzi (co ma sens). Również „język” tutaj jest bardziej przejrzysty, ponieważ pytanie będzie zawierać odpowiedzi.
[E] Wspólny sposób
To, co nazywam powszechnym sposobem, pierwszą rzeczą, którą zwykle robią ppl:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
która jest „luźną” wersją dwóch powyższych odpowiedzi, ponieważ zarówno odpowiedź, jak i pytanie mogą istnieć bez siebie. Nie ma żadnej szczególnej wskazówki, że trzeba je połączyć.
[F] Połączone
A może powinienem łączyć C, D, E - aby objąć wszystkie sposoby tworzenia relacji, aby pomóc programistom w użyciu tego, co jest dla nich najlepsze.
Pytanie
Wiem, że ludzie mogą wybrać jedną z powyższych odpowiedzi na podstawie „przeczucia”. Zastanawiam się jednak, czy którykolwiek z powyższych wariantów jest lepszy od drugiego z uzasadnionego powodu. Proszę również nie myśleć w ramach powyższego pytania, chciałbym tu przytoczyć najlepsze praktyki, które można zastosować w większości przypadków - a jeśli się zgadzacie, większość przypadków użycia tworzenia niektórych podmiotów jest podobnych. Bądźmy tu także agnostycy technologiczni, np. Nie chcę myśleć, czy ORM będzie używany, czy nie. Po prostu chcę dobrego, ekspresyjnego trybu.
Jakaś mądrość na ten temat?
EDYTOWAĆ
Zignoruj inne właściwości Question
i Answer
, nie są one istotne dla pytania. Zredagowałem powyższy tekst i zmieniłem większość konstruktorów (tam, gdzie było to potrzebne): teraz akceptują wszelkie niezbędne potrzebne wartości właściwości. Może to być po prostu ciąg zapytania lub mapa ciągów w różnych językach, statusach itp. - niezależnie od przekazywanych właściwości, nie są one w centrum uwagi;) Załóżmy więc, że przekraczamy niezbędne parametry, chyba że podano inaczej. Dzięki!