今天在寫c++程式的時候,有乙個使用了三年多的模型,大概是這樣的:
有乙個介面捕獲需要主視窗的滑鼠事件的時候,那麼他就需要從imouseevent繼承介面,然後像registerevent(imouseevent *event)註冊,如果有滑鼠事件,主視窗會通過呼叫虛函式來通知這個介面
我們一般的**是這樣的:
class myui:public imouseevent
myui *ui = new myui();
mainui->registerevent( ui );
這樣有兩個壞處:
1.把事件處理機制混合在視窗裡面了,隨著**的增加,滑鼠模式的處理會更加複雜,這點在現在的維護上已經體現出來了
2.myui不得不依賴imouseevent介面
想起來上次面試的時候,對方問我設計模式的問題,我一直不是很注重設計模式,可能跟我的工作有關,我更多的是在處理邏輯而不是設計,所以那次回來後我一直在想,我們的**寫得越久越難維護是不是跟我不注重設計模式有關,設計模式有乙個單一原則,能否把滑鼠處理事件移動出去,這樣就變成
class myuimouseevent:public imouseevent
然後利用組合
class myui
這樣的話,滑鼠事件對介面所進行的邏輯處理會在myuimouseevent裡面處理,看起來起碼比以前更清爽多了,也實現了單一職責(雖然我不知道這個是不是)
但是這樣的話myuimouseevent還是必須依賴於imouseevent,因為開發環境已經切換到vs2010了,開始支援bind和function系列函式了,通過這兩個函式,我們可以利用function和bind取代虛函式,而且減少標頭檔案依賴
比如在.h裡面
class myuimouseevent
myuimouseevent的標頭檔案不會產生任何的依賴,而是在cpp裡面通過bind和function繫結,然後提供新的registerevent介面專門註冊這一些列函式,三個標頭檔案沒有產生任何的依賴,比之前好多了
因為程式已經變得很大了,經常改動乙個標頭檔案的東西,一大堆的檔案都要重新編譯,所以最近越來越注意如何減少標頭檔案依賴
來自為知筆記(wiz)
為什麼優先使用組合而不是繼承
繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封裝...
為什麼要優先使用組合 而不是繼承?
繼承具有如下優點 實現新的類非常容易,因為基類的大部分功能都可以通過繼承關係自動賦予派生類 修改或者擴充套件繼承來的實現非常容易 只要修改父類,派生的類的行為就同時被修改了。初學物件導向程式設計的人會認為繼承真是乙個好東西,是實 現復用的最好手段。但是隨著應用的深入就會發現繼承有很多缺點 繼承破壞封...
單一職責原則
定義 不要存在多於乙個導致類變更的原因。通俗的說,即乙個類只負責一項職責。問題由來 類t負責兩個不同的職責 職責p1,職責p2。當由於職責p1需求發生改變而需要修改類t時,有可能會導致原本執行正常的職責p2功能發生故障。解決方案 遵循單一職責原則。分別建立兩個類t1 t2,使t1完成職責p1功能,t...