604
技術社區[雲棲]
C++編程規範之36:優先提供抽象接口
摘要:
偏愛抽象藝術吧:抽象接口有助於我們集中精力保證抽象的正確性,不至於受到實現或者狀態管理細節的幹擾。優先采用實現了抽象接口的設計層次結構。
應該定義和繼承抽象接口。抽象接口是完全由(純)虛函數構成的抽象類,沒有狀態(成員設計),通常也沒有成員函數實現。在抽象接口中避免使用狀態能夠簡化整個層次結構的設計。
應該遵守依賴倒置原理(DependencyInversion Principle ,DIP):
1.高層模塊buy應該依賴於低層模塊。相反,兩者都應該依賴抽象。
2 .抽象不應該依賴於細節。相反,細節應該依賴於抽象。
遵守DIP意味著層次結構應該以抽象類而不是具體類為根。抽象基類必須負責定義功能,而不是實現功能。換言之,策略不應該上推,而應該實現下放。
DIP設計的優點有:
1.更強的健壯性。係統中較不穩定的部分(實現)依賴於更穩定的部分(抽象)。健壯的設計就是能夠將修改限於局部的設計。相反,在一個脆弱的係統中,很小的修改也會以種種糟糕的方式傳播到係統意料不到的部分去。包含具體基類的設計正是如此。
2.更大的靈活性。基於抽象接口的設計通常更加靈活。如果能正確地建模抽象,那麼就能很容易地針對新的需求設計新的實現。相反,依賴於許多具體細節的設計是很難改變的,因為新的需求將會導致核心性的修改。
3.更好的模塊性。依賴於抽象的設計,其模塊性較好,因為它的依賴層次很簡單:高度可變的部分依賴於穩定部分,而不是相反。相反,設計如果含有混合了實現細節的接口,就很可能會出現複雜的依賴網,這樣一來,想要將這個設計作為一個單元插入到另一個係統中重新應用,就會變得困難。
於此相關的二次機會定律是這樣陳述的:需要保證正確的最重要的東西是接口。其他所有的東西以後都可以修改。如果接口弄錯了,可能再也不允許修改了。
通常,應該選擇公用虛擬析構函數以允許多態刪除,除非使用了諸如COM或者CORBA這樣的對象代理,它們使用的是另一種內存管理機製。
要對並非抽象接口的類進行多重繼承時要多加小心。雖然使用了多重繼承的設計具有很強的表達力,但還是很難保證正確,很容易出錯。尤其是這種設計中的狀態管理非常困難。
最後更新:2017-04-03 12:54:00