域对象的类设计和这些对象的容器

时间:2014-11-26 20:02:57

标签: java c++ oop design-patterns

我们今天正在讨论我们的代码库中反复出现的情况: 假设我们的软件(例如客户)中有特定的域对象。此外,我们有一组客户与我们系统中的特定用例相关。我们的业务逻辑适用于特定客户(例如getRevenue())以及适用于整个客户群的其他部分(例如getAverageRevenue(),getNumberOfActiveCustomers(),...)。 组功能还包括更改组中某些客户的方法,或搜索组中某些子组等的方法。(例如getCustomersWithoutOrdersSince())。

你会如何处理这种情况:

  1. 创建Customer类和CustomerGroup类:CustomerGroup类的客户位于私有成员std :: vector(或列表中的Java)中。组相关功能作为CustomerGroup的成员函数实现。
  2. 只创建一个Customer类,将客户的std :: vector(或List)保留给调用者:在Customer的成员函数中添加单个客户功能。 CustomerGroup相关功能实现为Customer的静态方法(例如:static int getAverageRevenue(vector& custVector)或Java static int getAverageRevenue(List))
  3. Nr的变化。 2(仅限C ++):仅创建一个Customer类,将带有调用者实现CustomerGroup功能的客户向量保留为命名空间Customer中的非成员函数
  4. ...
  5. 您如何实施这种情况或您认为哪些优点/缺点。

    在"有效C ++"的第23项中; ("首选非会员非朋友功能到会员功能")Scott Meyers主张在非会员功能中移出课程。在我看来,这类似于设计3。我发现这个建议很奇怪而且违反直觉。 @jrahhali评论说,这可能是坚持单一责任原则。欢迎任何想法/帖子/网址(不幸的是我没有找到关于第23项的任何好的讨论)。

    提前感谢您的意见。

1 个答案:

答案 0 :(得分:1)

  1. 我最喜欢这个。具有作用于Customer类中的客户的方法是直观的,并且其直观地具有对CustomerGroup类中的客户上​​的组进行操作的方法。您还可以将CustomerGroup封装为一组客户的表示,并为将来与组相关的所有操作提供一个很好的位置。它不是静态的,所以你可以选择线程安全,如果这很重要的话。 CustomerGroup还提供了比矢量或List更多的含义。

  2. 这也不错。您仍然提供了一个分组相关行为的位置,但这次是在Customer类的静态方法中。我个人认为静态方法比OO更像程序,因此,仍然更喜欢#1。但是,在一天结束时,#1和#2非常相似,因为它们都实现了DRY方法。

  3. 这比#2更具程序性,但仍能获得相同的结果。

  4. 我想答案取决于你想要编码的OO和/或程序。