【发布时间】:2014-11-26 20:02:56
【问题描述】:
我们今天在工作中讨论了我们代码库中反复出现的情况: 假设我们的软件中有一个特定的域对象(例如客户)。此外,我们的系统中有一组与特定用例相关的客户。我们有适用于特定客户的业务逻辑(例如 getRevenue())和适用于整个客户组的其他部分(例如 getAverageRevenue()、getNumberOfActiveCustomers()...)。 组功能还包括更改组中某些客户或搜索组中某些子组等的方法。(例如 getCustomersWithoutOrdersSince())。
遇到这种情况你会怎么做:
- 创建一个 Customer 类和一个 CustomerGroup 类:CustomerGroup 类在私有成员 std::vector 中(或在 Java 中的 List 中)有它的客户。组相关功能作为 CustomerGroup 的成员函数实现。
- 只创建一个客户类,将客户的 std::vector(或列表)留给调用者:在客户的成员函数中添加单个客户功能。 CustomerGroup 相关功能实现为 Customer 的静态方法(例如:static int getAverageRevenue(vector &custVector) 或 Java 中的 static int getAverageRevenue(List))
- 编号的变化。 2(仅限 C++):只创建一个 Customer 类,将客户向量留给调用者,将 CustomerGroup 功能作为命名空间 Customer 中的非成员函数实现
- ...
您将如何实现这样的场景,或者您认为有哪些优点/缺点。
在“Effective C++”的第 23 条(“Prefer non-member non-friend functions to members functions”)中,Scott Meyers 提倡将东西移出非成员函数的类。在我看来,这类似于设计号 3。然而,我发现这个建议很奇怪且违反直觉。 @jrahhali 评论说,这可能是为了遵守单一责任原则。欢迎提出任何想法/帖子/网址(不幸的是,我没有找到关于第 23 项的任何好的讨论)。
提前感谢您的意见。
【问题讨论】:
-
5.使用
std::accumulate并停止将所有内容硬塞到类层次结构中。 -
@Kerrek SB:我的例子有点误导和做作。组功能不仅提供简单的累积方法(如 getAverageRevenue()),还提供以各种方式修改客户对象、搜索客户子组的功能......我将更新示例以反映这一点
-
啊。在这种情况下,请考虑我的回答具有误导性和做作。
标签: java c++ oop design-patterns