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

您将如何处理这种情况:


制作一个Customer类和一个CustomerGroup类:CustomerGroup类的客户在私有成员std :: vector中(或在Java中的List中)。与组相关的功能被实现为CustomerGroup的成员功能。
仅创建一个Customer类,将std :: vector(或List)保留给调用者:在Customer的成员函数中添加单个customer功能。与CustomerGroup相关的功能是作为Customer的静态方法实现的(例如:static int getAverageRevenue(vector&custVector)或Java static int getAverageRevenue(List))
Nr的变化2(仅C ++):仅创建一个Customer类,将带有调用方的Customer向量作为实现CustomerGroup功能的调用者,保留为命名空间Customer中的非成员函数
...


您将如何实施这种方案,或者您认为有什么优点/缺点。

在“有效的C ++”的项目23中(“将非成员非朋友函数优先于成员函数”),Scott Meyers主张将内容从非成员函数的类中移出。我认为这类似于设计编号3。我发现这个建议很奇怪,而且违反直觉。 @jrahhali评论说,这可能是为了遵守单一责任原则。欢迎提出任何想法/帖子/ URL(不幸的是,我没有在第23项上找到任何好的讨论)。

预先感谢您的输入。

最佳答案

我最喜欢这个。在Customer类中具有对客户起作用的方法是很直观的,在CustomerGroup类中具有对客户组起作用的方法很直观。您还可以将CustomerGroup封装成代表一组客户的形式,并为以后所有与组相关的操作提供一个理想的位置。它不是静态的,因此您可以选择线程安全(如果很重要)。 CustomerGroup还提供了不仅仅是矢量或列表的含义。
这也不错。您仍在提供对相关行为进行分组的位置,但是这次是在Customer类的静态方法中进行的。我个人认为静态方法比OO更具程序性,因此,它仍然更喜欢#1。但是,最终,#1和#2非常相似,因为它们都实现了DRY方法。
这比#2更具程序性,但仍能达到相同的结果。


我想答案取决于您要如何编写OO和/或过程。

10-08 20:07