gpt4 book ai didi

java - 开闭原则与构造函数

转载 作者:行者123 更新时间:2023-11-30 07:57:24 27 4
gpt4 key购买 nike

学习“SOLID”原则 我想知道如果我需要向类添加更多扩展,是否可以修改构造函数,例如。商业逻辑。

据我所知,修改构造函数似乎违反了“开闭”原则,但如果我需要注入(inject)另一个类来执行某些逻辑怎么办?我如何在不修改构造函数的情况下执行此操作,并且通常,构造函数修改是否违反“开闭”原则?

让我们考虑一个例子。

有接口(interface)

public interface ShopFactory {
List<Discount> getDiscounts();
List<Sale> getSales();
}

只有一个实现(如果有人想将我的库添加为依赖项,可能还有其他实现)

public class CountableDefaultShopFactory implements ShopFactory {

Counter discountsCounter;
Counter salesCounter;

public DefaultShopFactory(Counter discountsCounter, Counter salesCounter) {
this.discountsCounter = discountsCounter;
this.salesCounter = salesCounter;
}

@Override
List<Discount> getDiscounts() {
discountsCounter.count();
return Discount.defaultDiscounts();
}

@Override
List<Sale> getSales() {
salesCounter.count();
return Sale.defaultSales();
}

}

所以这很简单。 CountableDefaultShopFactory 实现了 ShopFactory,覆盖了两个方法并依赖于一些 Counter 对象以计算每个方法被调用的次数。每个方法使用静态方法返回一些数据。

现在假设我被要求再添加一个方法,这次我需要从一些存储中获取数据,并且有一个服务可以从该存储中提供一些数据。在这种情况下,我需要在我的类中注入(inject)此服务以执行操作。

它看起来像这样:

public class CountableDefaultShopFactory implements ShopFactory {

Counter discountsCounter;
Counter salesCounter;
Counter couponsCounter;
CouponDAO couponDAO;

public DefaultShopFactory(Counter discountsCounter, Counter salesCounter, Counter couponsCounter, CouponDAO couponDAO) {
this.discountsCounter = discountsCounter;
this.salesCounter = salesCounter;
this.couponsCounter = couponsCounter;
this.couponDAO = couponDAO;
}

@Override
List<Discount> getDiscounts() {
discountsCounter.count();
return Discount.defaultDiscounts();
}

@Override
List<Sale> getSales() {
salesCounter.count();
return Sale.defaultSales();
}

@Override
List<Coupon> getCoupons() {
couponsCounter.count();
return couponDAO.getDefaultCoupons();
}

}

所以我不得不通过添加一个 Counter 类和
来修改我的构造函数 CouponDAO。没关系,我需要再添加一个名为 couponsCounterCounter,因为这是 ShopFactory 的可数实现。但是添加 CouponDAO 对我来说不太好。

我想知道是否有更好的解决方案如何做到这一点?

最佳答案

是的,它违反了 Open Closed,但也违反了 SRP,因为您现在已经给了全类不止一个改变的理由。

一个新的需求出现了,你可以扩展代码而不改变那里的内容并添加所有那些只被一个方法使用的新依赖项。 (如果你不介意,我会放弃工厂后缀):

public interface CouponShop extends Shop {
List<Coupon> getCoupons();
}

public class CountableCouponShop implements CouponShop {

public CountableCouponShop(Shop shop, Counter couponsCounter, CouponDAO couponDAO) {
//assign to fields
}

@Override
List<Discount> getDiscounts() {
return shop.getDiscounts(); //just delegate to the old implementation of shop
}

@Override
List<Sale> getSales() {
return shop.getSales();
}

@Override
List<Coupon> getCoupons() {
couponsCounter.count();
return couponDAO.getDefaultCoupons();
}
}

关于java - 开闭原则与构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41403053/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com