学习'SOLID'原理我想知道如果我需要为类添加更多扩展,可以修改构造函数,例如 . 商业逻辑 .
从我所学到的,它看起来像修改构造函数我违反了'open-closed'原则,但是如果我需要注入另一个类来执行某些逻辑呢?如果没有构造函数修改,我怎么能这样做,一般来说,构造函数修改是否违反了'open-closed'原则?
我们来看一个例子吧 .
有一个界面
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
对象,以计算每个方法被调用的次数 . 每个方法都使用静态方法返回一些数据 .
现在让我们说我已经被要求添加一个方法,这次我需要从一些存储中获取数据,并且有一个服务从该存储提供一些数据 . 在这种情况下,我需要在我的类中注入此服务以执行操作 .
它看起来像这样:
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
. 我很好,我需要添加一个名为 couponsCounter
的 Counter
,因为这是 ShopFactory
的可数实现 . 但添加 CouponDAO
对我来说并不好看 .
我想知道有更好的解决方案如何做到这一点?
1 回答
是的,它违反了Open Closed,但也违反了SRP,因为你现在给了这个课程不止一个改变的理由 .
出现了一个新的要求,您可以扩展代码而不更改其中的内容,并添加仅由单个方法使用的所有新依赖项 . (如果你不介意,我会放弃工厂后缀):