設計原則 不要為了復用而使用繼承

2021-09-06 11:41:12 字數 3017 閱讀 3215

為什麼要得出這個結論:在單實現繼承模型下,你復用了乙個基類的實現,就不能復用其它基類的實現了,介面繼承 + 擴充套件型別(mixin)可以很好的解決這個問題。 

下面我會演示:待重構的重複**-》用繼承消除重複-》用擴充套件類(mixin)消除重複-》ruby的鴨子型別 + mixin的實現(元程式設計可以更牛叉,有機會再說)。

注意:出庫單倉儲和入庫單倉儲的「根據編號獲取單據」重複了。

類圖

入庫單 : aggregate

2729}30

31class

出庫單 : aggregate

32

1112

inte***ce irepositorywhere

t : aggregate

1316

17class repository: irepository18

where

t : aggregate

1924}25

26class

倉庫單據基類 : aggregate

2729}30

31class

入庫單 : 倉庫單據基類

3233

class

出庫單 : 倉庫單據基類

3435

class 倉庫單據倉儲基類: repository36

where

t : 倉庫單據基類

3742}43

44class 入庫單倉儲 : 倉庫單據倉儲基類《入庫單》

4546

class 出庫單倉儲 : 倉庫單據倉儲基類《出庫單》

47 }

我對了嗎?沒有多型,只是為了復用就引入繼承,是否合理呢?

類圖

倉庫單據基類 : aggregate

2729}30

31class

入庫單 : 倉庫單據基類

3233

class

出庫單 : 倉庫單據基類

3435

static

class

倉庫單據基類倉儲擴充套件

3642

}43 }

**

1

#coding: utf-823

class

aggregate

4end56

class

repository

7def

where(condition)

8end

9end

1011

class c倉庫單據基類

12attr_accessor :單據編號

13end

1415

class c入庫單

16end

1718

class c出庫單

19end

2021

module c倉庫單據基類倉儲擴充套件

22def

根據編號獲取單據(單據編號)

23return self.where()

24end

25end

2627

class c入庫單倉儲

28include c倉庫單據基類倉儲擴充套件

29end

3031

class c出庫單倉儲

32include c倉庫單據基類倉儲擴充套件

33 end

ruby正統的支援了mixin,鴨子型別天生具備泛型的特點,比泛型強大,元程式設計更是牛叉(本文沒有體現)。

做一件事如果只有乙個選擇,就說明有問題了,多思考幾個方案,折中後考慮乙個方案。

不要為了專案而專案

為了專案而專案,是很多人讓我吃驚的習慣,類似的例子還有為了創業而創業。為了創業而創業什麼意思呢?發達國家很多人,是先有了乙個激動人心的想法和思路,然後為了實現這個想法,發覺必須要創業才能實現它。而中國很多人不是這樣,中國很多人是先想著當老闆賺錢,覺得要賺錢必須創業,然後再去想創業該做什麼好呢?其實我...

不要為了重用迴圈結構耦合太多邏輯

迴圈結果變數 我們書寫乙個迴圈邏輯的時候,如果迴圈完成後,還有邏輯要執行,需要結果變數來持有結果。string findresult null for string str stringlist 其他 使用findresult 此處只是簡單輸出 system.out.println findresu...

不要為了吃而吃要學會追尋美食

很多人覺得吃飯無外乎吃飽而已,甚至很多人為了健美吃飯以能量為單位,這我是做不到的。我覺得吃飯是挺大的事情,如果不能追求美食這天大的事,那生活就好像被什麼切割了一般。渴望尋找志同道合的人,雖然我不是個孤僻的人,但必須承認,我還是更喜歡在各種朋友圈裡只有幾塊零星的發言,沒有特別撞擊的點能夠值得聊很久。發...