这是一个简化的要求:
用户创建一个
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
,他们是不相关的问题。我在上面的文本中进行了编辑,并更改了大多数构造函数(在需要的地方):现在它们接受任何需要的必要属性值。那可能只是一个问题字符串,或者是使用不同语言,状态等形式的字符串映射-不管传递什么属性,它们都不是重点;)因此,只要假设我们上面传递了必要的参数即可,除非另有说明。谢谢!