【问题标题】:Refactoring some of my code重构我的一些代码
【发布时间】:2009-11-16 23:19:00
【问题描述】:

我有一个 SalesOrder 类,它被几种不同类型的销售订单继承。它有一个名为 ValidateItems(OrderItemList, itemAdditionalValidation) 的方法,该方法接收一个订单项目列表和一个用于对订单项目进行额外验证的委托。不同的销售订单各自定义自己的委托版本,然后在调用父 SalesOrder 类的 ValidateItems 时将其传入。委托接受一个 OrderItem 对象。 OrderItem 类有一个 Validate() 方法。 ValidateItems 方法遍历列表并对每个 OrderItem 调用 Validate,然后调用 itemAdditionalValidation 委托并将其传递给 OrderItem。

到目前为止,当我想验证商品时,我总是会创建将所有商品添加到相应订单中,然后订单会调用 ValidateItems 并处理所有验证。但是,现在我希望能够直接调用 OrderItem.Validate 而不创建订单,但是我不知道如何重构委托。基本上,我希望 OrderItem 能够根据它正在处理的 Order 类型知道要调用哪些委托。有任何想法吗?此外,任何关于如何改进我当前架构的提示都将不胜感激。

【问题讨论】:

    标签: oop refactoring


    【解决方案1】:

    每个特定的 SalesOrder 子类都提供一个 orderItem 验证器,由 ValidateItems() 方法使用?如果这是 SalesOrder 的方法,那么您不需要将 additionalValidator 作为参数传递,您已经可以使用它了。

    SalesOrder 也提供 isThisOrderItemValid(item) 方法似乎很合理。它将其验证器应用于提供的项目。或者可能是一个 addOrderItem(item) 方法,如果它有效则添加它,否则抛出异常。

    一旦我们将验证视为 SalesOrder 拥有,那么我就看不到问题了。委托或任何其他技术的使用是 SalesOrder 的实现细节。

    【讨论】:

    • 是的,但我需要能够在不将其放入订单的情况下自行验证订单商品。这样做的原因是我有一个表单,它应该在客户移动到下一个时验证订单项目的每一行,但我不希望它每次都验证订单中的所有订单项目。我只想在它发生时验证一个订单项目。
    • 实际上你的第二段很有意义。我会这样做的!
    【解决方案2】:

    我不完全确定我是否正确理解了您的问题,但作为一种猜测,也许您可​​以这样做:

    • 使用标记接口来声明您正在处理的 OrderItem 类型。例如,您可以有两种不同类型的 OrderItem:

      GoodOrderItemImpl implements GoodOrderItem { }
      BadOrderItemImpl implements BadOrderItem { }
      
    • GoodOrderItem 和 BadOrderItem 接口可能会扩展实际上具有方法 validate() 的接口 OrderItem;里面定义的

    • 然后您可以创建一些无所不知的类,该类知道哪种类型的附加验证器对应于所讨论的标记接口,例如

      public final class ValidatorGuru {
          // A map that maps GoodOrderItem.class with GoodOrderValidator and BadOrderItem.class with BadOrderValidator
      }
      
    • 然后,例如,当您要验证 GoodOrderItemImpl 时,您可以使用标记接口找出它使用 GoodOrderValidator 作为其附加验证器(即来自 ValidatorGuru),然后调用 goodOrder.validate();然后是 goodOrderValidator.validate(goodOrder);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多