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

标签 java c++ oop design-patterns

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

你会如何处理这种情况:

  1. 创建一个 Customer 类和一个 CustomerGroup 类:CustomerGroup 类在私有(private)成员 std::vector 中有其客户(或在 Java 中的 List 中)。组相关功能作为 CustomerGroup 的成员函数实现。
  2. 只创建一个 Customer 类,将客户的 std::vector(或列表)留给调用者:在 Customer 的成员函数中添加单个客户功能。 CustomerGroup 相关功能实现为 Customer 的静态方法(例如:static int getAverageRevenue(vector &custVector) 或 Java static int getAverageRevenue(List))
  3. Nr. 的变化。 2(仅限 C++):只创建一个 Customer 类,将客户 vector 留给调用者,将 CustomerGroup 功能实现为命名空间 Customer 中的非成员函数
  4. ...

您将如何实现这样的场景,或者您认为有哪些优点/缺点。

在“Effective C++”(“Prefer non-member non-friend functions to members functions”)的第 23 条中,Scott Meyers 主张将非成员函数中的内容移出类。在我看来,这类似于设计编号 3。然而,我发现这个建议很奇怪而且违反直觉。 @jrahhali 评论说这可能是为了坚持单一职责原则。欢迎就此提出任何想法/帖子/URL(不幸的是,我没有找到关于第 23 项的任何好的讨论)。

预先感谢您的输入。

最佳答案

  1. 我最喜欢这个。在 Customer 类中具有作用于客户的方法是直观的,在 CustomerGroup 类中具有作用于客户组的方法也是直观的。您还让 CustomerGroup 封装了一组客户的表示,它为所有 future 与组相关的操作提供了一个很好的位置。它不是静态的,因此如果这很重要,您可以选择线程安全。 CustomerGroup 还提供了比 vector 或列表更多的含义。

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

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

我想答案取决于您希望如何编写面向对象和/或过程的代码。

关于java - 领域对象和这些对象的容器的类设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27157928/

相关文章:

java - 有没有办法在 Java 中生成 8.3 或 'short' (Windows) 版本的文件名?

java - 如何在 Hibernate 中初始化集合的集合

java - 如何使用 Spring Autowire 编写 JUnit 测试?

Java servlet : problem with corrupt file download

c++ - 非阻塞连接 OpenSSL

php - 在 PHP 中使用 OOP 从查询中检索数据

c++ - 在 WinDBG 中名称包含空格的重载函数处设置断点

c++ - 转发具有明确类型的引用行为

c# - 在 C# oop 中如何解释为什么基类可以采用派生类实例

java - 我应该如何解释接口(interface)和抽象类之间的区别?