重构我的一些代码

时间:2009-11-16 23:19:01

标签: oop refactoring

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我不完全确定我是否正确理解你的问题,但也许你可以尝试这样做:

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

    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);