物件導向設計的11原則--你稱得上OO專家麼?(專自CSDN)
物件導向設計是什麼?都包含了哪些內容?它所帶來的好處是什麼?需要你為之付出些什麼?在如今這個年代,問這些問題似乎顯得很愚蠢,因為這年頭幾乎每位軟體開發人員都知道如何使用某種物件導向程式語言。可是這個問題還是很重要,因為在我看來,絕大多數人在使用這些語言的時候並不知道為什麼,而且也不知該如何最充分的運用它們。
軟體業曾經爆發過的所有變革裡,其中曾經有兩個派系如此廣泛的深入人心,它們就是結構化程式設計和麵向物件程式設計。所有主流的現代程式語言都被它們兩個激烈的影響著。實際上,要想不像結構化和麵向物件程式設計的樣子來編寫程式都是一件難事。我們的主流程式語言都沒有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)。
頭三項包原則是關於包內聚性的,它們會告訴我們該把什麼劃分到包中:
最後的三項原則是關於包之間的耦合性原則的,並且論述了評價系統中包結構優良與否的評判標準。
譯註:
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年的編輯。
相關文章
- 物件導向OO原則物件
- 物件導向的設計原則物件
- 物件導向設計原則物件
- 物件導向設計原則,以及包的設計原則物件
- 物件導向的基本設計原則物件
- 物件導向設計原則概述物件
- 物件導向設計(OOD)原則物件
- 開閉原則——物件導向程式設計原則物件程式設計
- 物件導向設計原則之開閉原則物件
- Java中物件導向的設計原則Java物件
- 物件導向的編碼設計原則物件
- The Principles of OOD 物件導向設計原則物件
- 物件導向設計原則和模式物件模式
- 2.物件導向設計原則物件
- 物件導向之旅-設計與設計原則物件
- 物件導向設計原則之合成複用原則物件
- 物件導向設計原則之介面隔離原則物件
- 物件導向設計原則之里氏代換原則物件
- 【設計原則】物件導向程式設計的六大原則物件程式設計
- 物件導向設計的6大原則物件
- 物件導向設計6大原則物件
- 物件導向設計原則&設計模式分類物件設計模式
- 前端設計模式(0)物件導向&&設計原則前端設計模式物件
- 物件導向設計原則之單一職責原則物件
- 61條物件導向設計的經驗原則物件
- 七種常見的物件導向設計原則物件
- JavaScript 的物件導向(OO)JavaScript物件
- 我學設計模式 之 物件導向設計原則設計模式物件
- 翻譯 | The Principles of OOD 物件導向設計原則物件
- 物件導向之六大設計原則物件
- 物件導向設計原則之迪米特法則物件
- SOLID:物件導向設計的前五項原則Solid物件
- 物件導向設計的六大原則(SOLID原則)-——里氏替換原則物件Solid
- 物件導向程式設計(OOP)的七大原則物件程式設計OOP
- OO幾條設計原則
- 上層告知,下層請求——物件導向混搭函式式設計(OO專家Michael Feathers的奇思妙想)物件函式
- 設計模式(一)——物件導向六大原則設計模式物件
- 實驗1:UML與物件導向程式設計原則物件程式設計