敏捷開發大家談(五)--敏捷開發的設計原則
二、敏捷開發的設計原則
關於敏捷開發的設計原則:
單一職責原則SRP:Single Responsibility Principle
開放封閉原則OCP:Open-Close Principle
Liskov替換原則LSP:Liskov Substitution Principle
依賴倒置原則DIP:Dependency Invertion Principle
介面隔離原則ISP:Interface Separate Principle
關於包的設計原則:
重用釋出等價原則REP:Reuse Equivalence Principle
共同重用原則CRP:Common Resue Principle
共同封閉原則CCP:Common Close Principle
無環依賴原則ADP:Acyclic Dependency Principle
穩定依賴原則SDP:Stabilization Dependency Principle
穩定性度量公式:I=Ce/(Ca+Ce) (I:不穩定度,Ce:輸入耦合度,Ca:輸出耦合度)
I取值範圍在【0,1】,I=0表示具有最大穩定度;iI=1標識具有最大不穩定度
穩定抽象原則SAP:Stabilization Abstract Principle
GOF說--基於物件組合的設計會有更多的物件(而有較少的類)。
如果單純的看這裡,你會明白似乎類較少符合物件導向的邏輯。
但是且慢,我們知道物件導向有一條原則叫單一職責原則--SRP。
這樣好像類多又是物件導向思想的體現。
其實最重要的是GOF中的這句話--且系統的行為將依賴物件間的關係而不是被定義在某個類中。
所以類的多少並不是問題的關鍵,是否職責單一也不是大問題,
最重要的是你現在的那些職責是都多少是不能被別的職責通過某種方式所代替的。
在BOB大叔那裡定義職責是變化的原因,因此就可以認為這些變化的原因應該是不可代替的,
也可以說你不能由這個原因推匯出別的原因。
只要這個原因間可以做到相互關聯,那麼你就可以把由於這些變化而引起變化的類組合起來,
而不是把他們規定在新的類中。
開放封閉原則OCP:Open-Close Principle
一個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。
因此在進行物件導向設計時要儘量考慮介面封裝機制、抽象機制和多型技術。
該原則同樣適合於非物件導向設計的方法,是軟體工程設計方法的重要原則之一。
我們以收音機的例子為例,講述物件導向的開閉原則。
我們收聽節目時需要開啟收音機電源,對準電臺頻率和進行音量調節。
但是對於不同的收音機,實現這三個步驟的細節往往有所不同。
比如自動收縮電臺的收音機和按鈕式收縮在操作細節上並不相同。
因此,我們不太可能針對每種不同型別的收音機通過一個收音機類來實現(通過過載)這些不同的操作方式。
但是我們可以定義一個收音機介面,提供開機、關機、增加頻率、降低頻率、增加音量、降低音量六個抽象方法。
不同的收音機繼承並實現這六個抽象方法。
這樣新增收音機型別不會影響其它原有的收音機型別,收音機型別擴充套件極為方便。
此外,已存在的收音機型別在修改其操作方法時也不會影響到其它型別的收音機。
圖1是一個應用OCP生成的收音機類圖的例子:
Liskov替換原則LSP:Liskov Substitution Principle
子類應當可以替換父類並出現在父類能夠出現的任何地方。
我們以學生為例,夜校生為學生的子類,因此在任何學生可以出現的地方,夜校生均可出現。
這個例子有些牽強,
一個能夠反映這個原則的例子時圓和橢圓,圓是橢圓的一個特殊子類。
因此任何出現橢圓的地方,圓均可以出現。但反過來就可能行不通。
關於敏捷開發的設計原則:
單一職責原則SRP:Single Responsibility Principle
開放封閉原則OCP:Open-Close Principle
Liskov替換原則LSP:Liskov Substitution Principle
依賴倒置原則DIP:Dependency Invertion Principle
介面隔離原則ISP:Interface Separate Principle
關於包的設計原則:
重用釋出等價原則REP:Reuse Equivalence Principle
共同重用原則CRP:Common Resue Principle
共同封閉原則CCP:Common Close Principle
無環依賴原則ADP:Acyclic Dependency Principle
穩定依賴原則SDP:Stabilization Dependency Principle
穩定性度量公式:I=Ce/(Ca+Ce) (I:不穩定度,Ce:輸入耦合度,Ca:輸出耦合度)
I取值範圍在【0,1】,I=0表示具有最大穩定度;iI=1標識具有最大不穩定度
穩定抽象原則SAP:Stabilization Abstract Principle
GOF說--基於物件組合的設計會有更多的物件(而有較少的類)。
如果單純的看這裡,你會明白似乎類較少符合物件導向的邏輯。
但是且慢,我們知道物件導向有一條原則叫單一職責原則--SRP。
這樣好像類多又是物件導向思想的體現。
其實最重要的是GOF中的這句話--且系統的行為將依賴物件間的關係而不是被定義在某個類中。
所以類的多少並不是問題的關鍵,是否職責單一也不是大問題,
最重要的是你現在的那些職責是都多少是不能被別的職責通過某種方式所代替的。
在BOB大叔那裡定義職責是變化的原因,因此就可以認為這些變化的原因應該是不可代替的,
也可以說你不能由這個原因推匯出別的原因。
只要這個原因間可以做到相互關聯,那麼你就可以把由於這些變化而引起變化的類組合起來,
而不是把他們規定在新的類中。
開放封閉原則OCP:Open-Close Principle
一個模組在擴充套件性方面應該是開放的而在更改性方面應該是封閉的。
因此在進行物件導向設計時要儘量考慮介面封裝機制、抽象機制和多型技術。
該原則同樣適合於非物件導向設計的方法,是軟體工程設計方法的重要原則之一。
我們以收音機的例子為例,講述物件導向的開閉原則。
我們收聽節目時需要開啟收音機電源,對準電臺頻率和進行音量調節。
但是對於不同的收音機,實現這三個步驟的細節往往有所不同。
比如自動收縮電臺的收音機和按鈕式收縮在操作細節上並不相同。
因此,我們不太可能針對每種不同型別的收音機通過一個收音機類來實現(通過過載)這些不同的操作方式。
但是我們可以定義一個收音機介面,提供開機、關機、增加頻率、降低頻率、增加音量、降低音量六個抽象方法。
不同的收音機繼承並實現這六個抽象方法。
這樣新增收音機型別不會影響其它原有的收音機型別,收音機型別擴充套件極為方便。
此外,已存在的收音機型別在修改其操作方法時也不會影響到其它型別的收音機。
圖1是一個應用OCP生成的收音機類圖的例子:
Liskov替換原則LSP:Liskov Substitution Principle
子類應當可以替換父類並出現在父類能夠出現的任何地方。
我們以學生為例,夜校生為學生的子類,因此在任何學生可以出現的地方,夜校生均可出現。
這個例子有些牽強,
一個能夠反映這個原則的例子時圓和橢圓,圓是橢圓的一個特殊子類。
因此任何出現橢圓的地方,圓均可以出現。但反過來就可能行不通。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3433/viewspace-269190/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 敏捷開發大家談(三)敏捷
- 敏捷開發大家談(二)敏捷
- 敏捷開發大家談(一)敏捷
- 敏捷開發大家談(四)敏捷
- 敏捷軟體開發:原則,模式,實踐敏捷模式
- 敏捷開發大家談(三)--敏捷開發技術在電子商務軟體中的應用(2)敏捷
- 【敏捷開發】結對程式設計敏捷程式設計
- [原]敏捷開發-每日站會敏捷
- [原]敏捷開發-故事與估算敏捷
- 敏捷開發敏捷
- SCRUM敏捷開發規則一欄Scrum敏捷
- [敏捷開發實踐](1) 認識敏捷開發敏捷
- 敏捷宣言的第五項原則敏捷
- 淺談一下“敏捷開發”敏捷
- [原]敏捷開發-專案啟動敏捷
- 敏捷開發框架敏捷框架
- 敏捷開發理解敏捷
- scrum敏捷開發Scrum敏捷
- 淺談軟體開發模型之瀑布開發和敏捷開發模型敏捷
- 敏捷開發--Scrum開發模型敏捷Scrum模型
- 敏捷軟體開發:原則、模式與實踐讀書摘要敏捷模式
- LeaRun敏捷開發框架快速設計表單敏捷框架
- 領域驅動設計與敏捷開發敏捷
- 敏捷開發的那些事敏捷
- 敏捷開發入門敏捷
- 敏捷開發簡介敏捷
- 敏捷開發相關敏捷
- 敏捷式開發管理敏捷
- 初識敏捷開發敏捷
- 【筆記】敏捷開發筆記敏捷
- 敏捷開發與jira敏捷
- 敏捷開發過程敏捷
- 黑客和敏捷開發黑客敏捷
- 敏捷開發(XP,SCRUM)敏捷Scrum
- 《敏捷軟體開發 原則、模式與實踐》的讀書筆記敏捷模式筆記
- 也談專案經理與敏捷開發敏捷
- MSN群每週線上討論:談談敏捷開發敏捷
- 敏捷開發和傳統開發的區別?以及敏捷開發管理工具的推薦敏捷