我最近读过,调用类** 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);
}
}
答案 0 :(得分:0)
为什么您认为需要将业务逻辑 而非纳入业务逻辑对象?
new OrderShredder().cancelOrder(order);
怎么样
order.cancel()
实际上并不关心这个调用本身是否会调用OrderShredder
(如果你真的需要这个)?这是对象的命令,即tell it things to do。它是如何做的,你不在乎。
运行service / manager /上的任何类的方法,看一下第一个参数的静态类型。尝试通过实际分配行为来使业务逻辑对象意识到自己来消除这些类。
对于事物的命名方面:有一种非常好的article about weasel words(遗憾的是不是免费的德语)应用语言学来命名问题。我不记得确切的细节,但争论的结果是以-er
或-or
结尾的实质内容是名词化的动词,人们通常应该试图摆脱这些,而不是只是Manag-er
。