设计一个项目是主要项目的集合

时间:2016-06-06 14:05:59

标签: oop design-patterns

假设User有很多Car个。这些车只属于他。

您可以代表以下两种方式:

具有汽车集合和main_car属性的User实体,指向集合中的一个。业务规则是:用户只能拥有属于他的主车。

OR

User实体,带有汽车收藏品。其中一辆车可能具有布尔is_main属性。业务规则是:只有1个属于用户的汽车可以被定义为主要。

业务规则将在setter中强制执行。

我想提出您的建议以及两种方法的优缺点。谢谢!

3 个答案:

答案 0 :(得分:2)

我更喜欢第一种选择。

优点:

  1. 性能 - 如果我需要找到用户的主车,我可以引用主车属性而不必通过列表搜索 - o(1)与o(n)。
    1. 班级责任 - 汽车 - 它真的需要知道它是某人的主车(is_main)吗?我认为如果用户有很多车,他有责任存储有关他使用汽车的信息。
    2. 记忆 - 我认为这是一个非常小的,至少对我来说(在C#中)是一个微不足道的原因,但为什么要为所有集合保留另一个数据而不是仅仅一个参考。
  2. 缺点:

    1. 如果现在您需要存储超过1个“主车”然后突然而不是简单属性,您必须持有一组参考,而在另一个解决方案中,您只需将其他车辆的属性设置为真。
    2. 我希望我能正确理解你的要求以及我的答案可以帮助你

答案 1 :(得分:2)

第二种选择的一个大问题是你有两个人,p1和p2,他们驾驶同一辆车。汽车可能是p1的主车而不是p2,所以你不能简单地为汽车设置一个is_main字段。这有希望更多地解释了阶级责任方面。

出于这个原因,我选择第一个选项。

答案 2 :(得分:1)

选项一将是最常采用的方法。

在汽车实体上创建is_main字段的问题是,如果您为一个用户选择了is_main,那么拥有该汽车的任何其他用户也会将该汽车设置为is_main。此外,几辆汽车有可能成为主要的汽车。对于任何给定用户的汽车,因为所有汽车的is_main属性都可以设置为true,因此很难对此进行限制。

如果您的用户有一个main_car字段,他们可以并且在任何给定时间只能拥有一辆主车。

您的第二种方法也存在数据完整性问题(您可能无意中使数据库无法正常化)。您可以删除汽车类型,因此删除用户的主车而不会发出任何类型的警告或异常(导致丢失有用信息)。如果你试图删除一辆用作主用车的方法,你会收到一个错误,因为用户突然有一辆不存在的主车。