使用面向对象设计的困惑......需要帮助

时间:2011-01-18 16:00:10

标签: oop design-patterns class language-agnostic class-design

假设我们有一个Order类和OrderManagerService类。

订单类:[某些状态和方法作用于国家]

  1. 项目[]
  2. 状态
  3. OrderManagerService类:[没有状态。只遵循静态方法]

    1. createOrder
    2. getOrder
    3. 问题:假设我们在后面使用关系数据库。我们的目标是更新订单状态。那么,状态需要在DB中更新。我关心的是放置updateStatus方法的位置。

      1. 我应该调用OrderManagerService.getOrder,然后调用Order.updateStatus吗?
      2. 或创建一个新方法OrderManagerService.updateOrderStatus?
      3. 好吧,第一个选项似乎在封装之后。但是,我个人不喜欢它,因为我们可能最终从实体对象调用DAO层[也许,这可能没问题]。想知道什么是正确的设计选择,为什么?非常感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

选项2 - 创建一个新方法,如OrderManagerService.updateOrderStatus?

为什么?

您的服务层应该封装逻辑业务工作单元,在您的情况下,UOW是

  1. 从DB
  2. 获取订单
  3. 更新对象的状态
  4. 坚持更改
  5. 并且您将使用事务划分updateOrderStatus(...)。而且这项服务仍然是无国籍的。

答案 1 :(得分:0)

我认为OrderManagerService应该有一个Order类项数组。这样,您可以遍历每个项目并更新其中的状态。或者,如果您正在寻找访问单个订单商品,请通过订单类直接访问它并在那里更新。

在您使用当前设置的任何一种情况下,updateStatus()都应该在Order类中。

答案 2 :(得分:0)

observer pattern怎么样?

updateStatus()将在Order类中,OrderManagerService类将观察到它。

每当您更改状态(或任何其他)时,Manager都会看到它并在需要时执行某些操作(例如更新数据库中的状态)。

管理器可以在创建实例时绑定到Order并在getOrder()方法中返回它。

如果销毁订单的实例(仅关注非托管语言),您还可以实现一些方法从订单取消绑定管理器。

答案 3 :(得分:0)

由于你的问题的标题包含“使用面向对象的设计”,我将状态转换逻辑放在Order本身中,因为除了数据之外,对象应该封装行为。

让服务中包含的所有行为都可以比作Anemic Domain Model,由你来决定是否是一件坏事 - 对此有很多争论。

答案 4 :(得分:-1)

为什么有单独的OrderManagerService类?我把所有这些方法都塞进了Order。

(这可能不是理论上正确的或四合一的设计模式,但我不在乎,因为它会更有意义。)