Вот упрощенное требование:
Пользователь создает
Question
с несколькимиAnswer
с.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 или нет. Просто хочется хорошего, выразительного режима.
Есть ли в этом какая-то мудрость?
РЕДАКТИРОВАТЬ
Пожалуйста, игнорируйте другие свойства Question
и Answer
, они не имеют отношения к вопросу. Я отредактировал приведенный выше текст и изменил большинство конструкторов (при необходимости): теперь они принимают любые необходимые значения свойств. Это может быть просто строка вопроса или карта строк на разных языках, статусы и т. Д. - независимо от того, какие свойства переданы, они не являются фокусом для этого;) Поэтому просто предположим, что мы выше передачи необходимых параметров, если не указано иное. Thanx!