Ось спрощена вимога:
Користувач створює
Question
декількаAnswer
s.Question
повинен мати хоча б однуAnswer
.Уточнення: подумайте
Question
іAnswer
як у тесті : є одне запитання, але кілька відповідей, де мало хто може бути правильним. Користувач - це актор, який готує цей тест, тому він створює питання та відповіді.
Я намагаюся моделювати цей простий приклад таким чином, щоб 1) відповідати реальній життєвій моделі 2), щоб бути виразним з кодом, щоб мінімізувати можливе неправильне використання та помилки, а також дати підказки розробникам, як користуватися моделлю.
Питання - це сутність , а відповідь - об'єкт значення . Питання містить відповіді. Поки що я маю ці можливі рішення.
[A] Фабрика всерединіQuestion
Замість створення Answer
вручну ми можемо зателефонувати:
Answer answer = question.createAnswer()
answer.setText("");
...
Це створить відповідь і додасть її до питання. Тоді ми можемо маніпулювати відповіддю, встановивши її властивості. Таким чином, лише питання можуть створити відповідь. Також ми заважаємо відповідати без запитання. Тим не менш, ми не маємо контролю над створенням відповідей, як це жорстко закодовано в Question
.
Існує також одна проблема з "мовою" вищевказаного коду. Користувач - це той, хто створює відповіді, а не питання. Особисто мені не подобається, що ми створюємо об'єкт цінності і залежно від розробника заповнюємо його значеннями - як він може бути впевнений, що потрібно додати?
[B] Завод всередині питання, візьміть №2
Деякі кажуть, що ми повинні мати такий спосіб у Question
:
question.addAnswer(String answer, boolean correct, int level....);
Подібно до вищезгаданого рішення, цей метод бере обов'язкові дані для відповіді та створює такі, які також будуть додані до питання.
Проблема тут полягає в тому, що ми дублюємо конструктор Answer
без жодних причин. Також питання справді створює відповідь?
[C] Залежності конструктора
Будьмо вільні створити обидва об’єкти нашими власними силами. Висловимо також право залежності в конструкторі:
Question q = new Question(...);
Answer a = new Answer(q, ...); // answer can't exist without a question
Це дає підказки для розробника, оскільки відповідь неможливо створити без запитання. Однак ми не бачимо "мови", яка говорить про те, що відповідь "додається" до питання. З іншого боку, чи насправді нам це потрібно бачити?
[D] Залежність конструктора, візьміть №2
Ми можемо зробити навпаки:
Answer a1 = new Answer("",...);
Answer a2 = new Answer("",...);
Question q = new Question("", a1, a2);
Це протилежна ситуація вище. Тут відповіді можуть існувати без запитання (що не має сенсу), але питання не може існувати без відповіді (які мають сенс). Крім того , «мова» тут більш ясно з цього питання буде мати відповіді.
[E] Загальний шлях
Це те, що я називаю загальним способом, перше, що зазвичай робить ppl:
Question q = new Question("",...);
Answer a = new Answer("",...);
q.addAnswer(a);
що є "вільною" версією вищезгаданих двох відповідей, оскільки і відповідь, і питання можуть існувати один без одного. Немає особливого натяку на те, що вам потрібно зв'язати їх разом.
[F] Комбінована
Або я повинен поєднувати C, D, E - щоб висвітлити всі способи створення відносин, щоб допомогти розробникам використовувати все, що найкраще для них.
Питання
Я знаю, що люди можуть обрати одну з вищезазначених відповідей на основі "химки". Але мені цікаво, чи кращий будь-який із перерахованих вище варіантів, ніж інший, для цього є вагома причина. Крім того, будь ласка, не замислюйтесь у вищезазначеному питанні, я хотів би видавити тут кілька найкращих практик, які можна застосувати у більшості випадків - і якщо ви згодні, більшість випадків використання деяких суб'єктів подібні. Також тут давайте можливість агностики, наприклад. Я не хочу думати, чи буде ORM використовуватись чи ні. Просто хочеться хорошого, виразного режиму.
Якась мудрість щодо цього?
EDIT
Будь ласка, ігноруйте інші властивості Question
та Answer
, вони не стосуються питання. Я редагував вище текст і змінив більшість конструкторів (де це потрібно): тепер вони приймають будь-які необхідні значення властивостей. Це може бути лише рядок запитань або карта рядків різними мовами, статусами тощо - які б властивості не передавались, вони не є для цього фокусом;) Отже, припускайте, що ми вище проходження необхідних параметрів, якщо не зазначено інше. Дякую!