1

我最近读到调用类 **Manager* 是一件坏事,因为它们的名称不准确,并且它们可能成为上帝的对象。但是,为处理同一业务对象的不同类的多个不同方法提供“Manager”作为包装器是否是一种好习惯?

假设我的调用者想要与订单交互。将各种方法混合到一个 **Manager* 类中是否更好,该类只会将它们委托给适当的类,或者让调用者自己使用适当的类。

所以

OrderManager orderManager = new OrderManager();
orderManager.cancelOrder(order); -> delegates to OrderShredder
orderManager.sendOrder(order, destination); -> delegates to OrderSender

或者

new OrderShredder().cancelOrder(order);
new OrderSender().sendOrder(order, destination);

那些比简单委托更多的类呢(它们使用多个委托,以正确的顺序执行它们或根据委托的某些结果选择下一条路径)。这些类型的方法(如下所示)可以在某种管理器类中吗?

public Order makeOrder(List<Product> products, Customer customer) {
    BigDecimal orderValue = this.productPriceCalculator.calculatePrice(products, customer);
    Order order = this.orderCreator.createOrder(products, customer, orderValue);
    boolean orderIsOk = this.orderValidator.validate(order);
    if (orderIsOk) {
        OrderStatistics orderStatistics = this.orderEvaluator.evaluate(order);
        boolean orderValueIsBigEnough = orderStatistics.isValueBigEnough();
        if (orderValueIsBigEnough) {
            this.orderSender.sendInformationAboutOrderSomewhere(order, orderStatistics);
        }
    }
    else {
        throw OrderNotOkException(order);
    }

    return order;
}

public void cancelOrders(Customer customer) {
    List<Order> customerOrders = this.ordersStorage.getOrders(customer);
    for (Order order : customerOrders) {
        orderShredder.cancelOrder(order);
    }
}
4

1 回答 1

0

为什么您认为需要将业务逻辑 放入业务逻辑对象

new OrderShredder().cancelOrder(order);

怎么样

order.cancel()

并且实际上不在乎这个调用本身是否调用OrderShredder(如果你真的需要这个)?这是对对象的命令,你告诉它要做的事情。它是怎么做的,你不在乎。

运行 service/manager/whatever 类的方法并查看第一个参数的静态类型。尝试通过实际分配行为来使业务逻辑对象了解它们自己,从而消除这些类。

对于事物的命名方面:有一篇非常好的文章,关于将语言学应用于命名问题的鼬鼠词(不幸的是不是免费的德语)。我不记得确切的细节,但论点是,以-eror结尾-or的实词是名词化动词,通常应该尝试摆脱这些,而不仅仅是Manag-er.

于 2012-05-11T06:17:01.237 回答