「SOLID」の原則を学ぶ私はクラスにいくつかの拡張を追加する必要がある場合は、コンストラクタを変更することは大丈夫ですか?ビジネスの論理。コンストラクタのオープンクローズドの原理
私が学んだことは、コンストラクタを変更するように見えますが、私は 'オープンクローズ'の原則に違反しますが、ロジックを実行するために別のクラスを注入する必要がある場合はどうすればいいですか?どのようにしてコンストラクタの変更なしでこれを行うことができますか?一般に、コンストラクタの変更は 'オープンクローズ'の原則に違反しますか?
例を考えてみましょう。
だから、それは非常に簡単だ
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
を実装し、2つのメソッドをオーバーライドし、各メソッドが何回呼び出されたかをカウントするために、いくつかのCounter
オブジェクトに依存します。各メソッドは、静的メソッドを使用していくつかのデータを返します。
もう1つの方法を追加するよう依頼されましたが、今回は一部のストレージからデータを取得する必要があり、そのストレージからデータを提供するサービスがあります。この場合、操作を実行するためにこのサービスをクラスに注入する必要があります。
そしてこのようなルックスになるだろう:
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();
}
}
だから、私は1つの以上Counter
クラスを追加し、
CouponDAO
で私のコンストラクタを変更する必要がありました。私はCounter
をcouponsCounter
と呼びます。これは、ShopFactory
のカウント可能な実装なので、もう1つ追加する必要があります。しかし、CouponDAO
を追加しても私にとってはうまく見えません。
もっと良い解決方法があるのですか?
これらの「ファクトリー」は何になりますか? – weston