2016-12-30 79 views
1

學習'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 implements 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修改我的構造函數。我很好,我需要再添加一個Counter,調用couponsCounter,因爲這是ShopFactory的可數實現。但加入CouponDAO對我來說並不好。

我想知道有沒有更好的解決方案如何做到這一點?

+0

什麼使這些工廠? – weston

回答

3

是的,它違反了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(); 
    } 
} 
+0

謝謝你的回答。你能解釋一下爲什麼它會波動SRP? – user3127896

+0

正如我所說,你現在已經給了班級一個以上的理由來改變 – weston

+0

我只看到一個原因,即增加一個方法,其他方法是什麼? – user3127896