面向物件設計的11條原則
阿新 • • 發佈:2019-02-05
[size=large]面向物件設計是什麼?都包含了哪些內容?它所帶來的好處是什麼?需要你為之付出些什麼?在如今這個年代,問這些問題似乎顯得很愚蠢,因為這年頭幾乎每位軟體開發人員都知道如何使用某種面向物件程式語言。可是這個問題還是很重要,因為在我看來,絕大多數人在使用這些語言的時候並不知道為什麼,而且也不知該如何最充分的運用它們。
軟體業曾經爆發過的所有變革裡,其中曾經有兩個派系如此廣泛的深入人心,它們就是結構化程式設計和麵向物件程式設計。所有主流的現代程式語言都被它們兩個激烈的影響著。實際上,要想不像結構化和麵向物件程式設計的樣子來編寫程式都是一件難事。我們的主流程式語言都沒有goto,因此它們服從了結構化程式設計中最重要的禁令。我們的大多數主流程式語言都是基於類的,而且不支援在類以外定義函式或是變數,因此也避免了面向物件程式設計中最容易墜入的陷阱。
用這些程式語言所編寫的程式可能看起來是結構化的或是面向物件的,可是“看起來”是會欺騙人的。當今的程式語言經常不顧他們所從屬那種派系的程式語言的基本原則。我會在另篇blog中再探討結構化程式設計的原則,本篇,我想要談論的是面向物件程式設計的基本原則。
在1995年的三月,我寫了一篇文章並發表在comp.object上,那是我第一次寫OOD(譯註1)原則的文章,此後就一發不可收拾的寫了很多。你可以在我的PPP一書(譯註2)中看到它們,在object mentor的很多文章中也都有,其中就有那篇眾所周知的綱要(近期會譯為中文,請關注)。
這些原則著重於OOD中的依賴管理方面,而淡化抽象與建模方面。這並不是說OO在抽象方面不夠強大,或是OO不適合構建模型。當然有很多人都在使用OO的這些部分,只是這些原則集中關注於依賴管理。
依賴管理是我們每個人都要面對的問題,每當我們在螢幕面前開啟那些彼此糾結又令人作嘔的程式碼,我們就會遭受不良的依賴管理所帶來的惡果。不良的依賴管理導致程式碼難以改變,易被破壞,而且不可重用。實際上,我在PPP一書中談論過很多不同的設計壞味道,而這些都與依賴管理有關。從另一方面來說,如果依賴經過了良性的管理,程式碼就可以保持靈活性、健壯性和重用性。所以依賴管理和這些相關原則是程式設計師們渴求的讓軟體保持優良架構的基石。
頭五項原則是關於類設計的,它們是:
SRP,單一職責原則,一個類應該有且只有一個改變的理由。
OCP,開放封閉原則,你應該能夠不用修改原有類就能擴充套件一個類的行為。
LSP,Liskov替換原則,派生類要與其基類自相容。
DIP,依賴倒置原則,依賴於抽象而不是實現。
ISP,介面隔離原則,客戶只要關注它們所需的介面。
另外的六項是關於包的設計原則。在本文中,包是指一個二進位制的可釋出檔案,比如.jar檔案、或dll檔案,而不是Java包或是C++的名稱空間(譯註3)。
頭三項包原則是關於包內聚性的,它們會告訴我們該把什麼劃分到包中:
REP,重用釋出等價原則,重用的粒度就是釋出的粒度。
CCP,共同封閉原則,包中的所有類對於同一類性質的變化應該是共同封閉的。
CRP,共同重用原則,一個包中的所有類應該是共同重用的。
最後的三項原則是關於包之間的耦合性原則的,並且論述了評價系統中包結構優良與否的評判標準。
ADP,無環依賴原則,在包的依賴關係圖中不允許存在環。
SDP,穩定依賴原則,朝著穩定的方向進行依賴。
SAP,穩定抽象原則,包的抽象程度應該和其穩定程度一致。
譯註:
1,OOD,全稱Object Oriented Design,即面向物件設計。
2,PPP,即Bob大叔的著作《敏捷軟體開發 原則、模式與實踐》一書以及其相關書籍,因都有“原則、模式與實踐”,即Priciples, Patterns and Practices,故常簡稱為PPP。
3,名稱空間,原文為namespace,也譯作名字空間。它是一種特殊的作用域,它包含了處於該作用域內的所有標示符,且本身也用一個標示符來表示,這樣便於將一系列在邏輯上相關的標示符用一個標示符來組織。就Java程式語言來說,名稱空間是通過java包來表達的,所有程式碼都歸屬與一個包。來自其他包中的程式碼要通過指定包名來引用某項特定的標示符,例如,包java.lang中的String類要通過java.lang.String的形式引用。在C++中,名稱空間常用來避免命名衝突,儘管現今的C++語言對名稱空間做出了擴充套件,但過去的C++程式碼很少使用此項功能。
(原文連結網址:http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod; Robert C. Martin的英文blog網址: http://www.butunclebob.com/ArticleS.UncleBob)
作者簡介:Robert C. Martin是Object Mentor公司總裁,面向物件設計、模式、UML、敏捷方法學和極限程式設計領域內的資深顧問。他不僅是Jolt獲獎圖書《敏捷軟體開發:原則、模式與實踐》(中文版)(《敏捷軟體開發》(英文影印版))的作者,還是暢銷書Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主編,並與James Newkirk合著了XP in Practice。他是國際程式設計師大會上著名的發言人,並在C++ Report雜誌擔任過4年的編輯。
[/size]
軟體業曾經爆發過的所有變革裡,其中曾經有兩個派系如此廣泛的深入人心,它們就是結構化程式設計和麵向物件程式設計。所有主流的現代程式語言都被它們兩個激烈的影響著。實際上,要想不像結構化和麵向物件程式設計的樣子來編寫程式都是一件難事。我們的主流程式語言都沒有goto,因此它們服從了結構化程式設計中最重要的禁令。我們的大多數主流程式語言都是基於類的,而且不支援在類以外定義函式或是變數,因此也避免了面向物件程式設計中最容易墜入的陷阱。
用這些程式語言所編寫的程式可能看起來是結構化的或是面向物件的,可是“看起來”是會欺騙人的。當今的程式語言經常不顧他們所從屬那種派系的程式語言的基本原則。我會在另篇blog中再探討結構化程式設計的原則,本篇,我想要談論的是面向物件程式設計的基本原則。
在1995年的三月,我寫了一篇文章並發表在comp.object上,那是我第一次寫OOD(譯註1)原則的文章,此後就一發不可收拾的寫了很多。你可以在我的PPP一書(譯註2)中看到它們,在object mentor的很多文章中也都有,其中就有那篇眾所周知的綱要(近期會譯為中文,請關注)。
這些原則著重於OOD中的依賴管理方面,而淡化抽象與建模方面。這並不是說OO在抽象方面不夠強大,或是OO不適合構建模型。當然有很多人都在使用OO的這些部分,只是這些原則集中關注於依賴管理。
依賴管理是我們每個人都要面對的問題,每當我們在螢幕面前開啟那些彼此糾結又令人作嘔的程式碼,我們就會遭受不良的依賴管理所帶來的惡果。不良的依賴管理導致程式碼難以改變,易被破壞,而且不可重用。實際上,我在PPP一書中談論過很多不同的設計壞味道,而這些都與依賴管理有關。從另一方面來說,如果依賴經過了良性的管理,程式碼就可以保持靈活性、健壯性和重用性。所以依賴管理和這些相關原則是程式設計師們渴求的讓軟體保持優良架構的基石。
頭五項原則是關於類設計的,它們是:
SRP,單一職責原則,一個類應該有且只有一個改變的理由。
OCP,開放封閉原則,你應該能夠不用修改原有類就能擴充套件一個類的行為。
LSP,Liskov替換原則,派生類要與其基類自相容。
DIP,依賴倒置原則,依賴於抽象而不是實現。
ISP,介面隔離原則,客戶只要關注它們所需的介面。
另外的六項是關於包的設計原則。在本文中,包是指一個二進位制的可釋出檔案,比如.jar檔案、或dll檔案,而不是Java包或是C++的名稱空間(譯註3)。
頭三項包原則是關於包內聚性的,它們會告訴我們該把什麼劃分到包中:
REP,重用釋出等價原則,重用的粒度就是釋出的粒度。
CCP,共同封閉原則,包中的所有類對於同一類性質的變化應該是共同封閉的。
CRP,共同重用原則,一個包中的所有類應該是共同重用的。
最後的三項原則是關於包之間的耦合性原則的,並且論述了評價系統中包結構優良與否的評判標準。
ADP,無環依賴原則,在包的依賴關係圖中不允許存在環。
SDP,穩定依賴原則,朝著穩定的方向進行依賴。
SAP,穩定抽象原則,包的抽象程度應該和其穩定程度一致。
譯註:
1,OOD,全稱Object Oriented Design,即面向物件設計。
2,PPP,即Bob大叔的著作《敏捷軟體開發 原則、模式與實踐》一書以及其相關書籍,因都有“原則、模式與實踐”,即Priciples, Patterns and Practices,故常簡稱為PPP。
3,名稱空間,原文為namespace,也譯作名字空間。它是一種特殊的作用域,它包含了處於該作用域內的所有標示符,且本身也用一個標示符來表示,這樣便於將一系列在邏輯上相關的標示符用一個標示符來組織。就Java程式語言來說,名稱空間是通過java包來表達的,所有程式碼都歸屬與一個包。來自其他包中的程式碼要通過指定包名來引用某項特定的標示符,例如,包java.lang中的String類要通過java.lang.String的形式引用。在C++中,名稱空間常用來避免命名衝突,儘管現今的C++語言對名稱空間做出了擴充套件,但過去的C++程式碼很少使用此項功能。
(原文連結網址:http://www.butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod; Robert C. Martin的英文blog網址: http://www.butunclebob.com/ArticleS.UncleBob)
作者簡介:Robert C. Martin是Object Mentor公司總裁,面向物件設計、模式、UML、敏捷方法學和極限程式設計領域內的資深顧問。他不僅是Jolt獲獎圖書《敏捷軟體開發:原則、模式與實踐》(中文版)(《敏捷軟體開發》(英文影印版))的作者,還是暢銷書Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主編,並與James Newkirk合著了XP in Practice。他是國際程式設計師大會上著名的發言人,並在C++ Report雜誌擔任過4年的編輯。
[/size]