設計模式之開閉原則

西漢楊雄在其所著《太玄》一書中寫道:知固而不知革,物失其則;知革而不知固,物失其均。如果楊雄同志生在當世,他的話便不會這麼難懂,其意思就是:做事的時候,要聽“爺爺的話”,但又不能全聽,而不知改進。全聽“爺爺的話”便失去了事之常法,不聽“爺爺的話”便失去了這件事原本的意義。

楊雄死後兩千多年,我們的軟體業蓬勃發展,可惜他的後輩沒能好好聽“老爺爺的話”,反倒是一個夷人告訴我們一個與楊雄的話有異曲同工之妙的軟體發展哲理:Softwareentities should be open for extention, but closed for modification.

這句話就是傳說中的“開-閉原則”--Open-ClosedPrinciple,又寫作:OCP。被稱為物件導向可複用設計(OOD)的第一塊基石。

曾聽一個畢業的師兄抱怨:那幫子白癡領導,啥都不懂,想起來什麼說什麼,他說一句話,我們得改半天。是!我也有體會。

所有的軟體系統都有一個共同的性質:隨著時間的流逝,需求會發生變化。這時候我們就能看到“開-閉原則”的價值所在。

満足“開-閉原則”的軟體系統有兩個很好很強大的優點:
一 在原有系統基礎上擴展新的功能滿足軟體新的需求而不需要重新設計。使系統保持一定的靈活性。
二 原系統的高層,即抽象層不能改變,系統保持一定的穩定性,延續性。

另一個角度的“開-閉原則”

通常我們設計軟體的時候我們會考慮:什麼會導致軟體設計發生變化?

謬矣!

我們應考慮:允許什麼發生變化,而不讓這一變化導致系統重新設計。也就是考慮:什麼可能會發生變化,並找到一個系統的可變因素將之封裝起來。

這就是另一個角度的“開-閉原則”也叫:對可變性的封裝原則(Principleof Encapsulation of Variation),簡稱:EVP。

EVP的勸誡歸納為兩點:
一 一種可變性不應分佈在代碼的各個角落而應封裝在一個物件裡。一種可變性在系統中的不同表像,在代碼中體現為:同一繼承結構層次中的具體子類。
繼承應該被看作封裝變化的方法,而不要看之為從一般物件衍生特殊物件的方法。
二 一種可變性不應當與另一種可變性混合在一起。故當看到一個系統的類圖中繼承層次超過兩層,那這個系統就是一個有問題的系統,它違背了EVP,當該部分需求變化時,就會導致重新設計,得不償失。

讀到這裡我們應該能感覺到要滿足“開-閉原則”,其關鍵就是抽象化。也就是系統的抽象層。所謂的層,聽起來還真是楊雄的“太玄”,其實就是一幫子抽象類別,放在一個檔裡頭,那這就是系統的抽象層。這個東西叫起來玄,不過設計一個系統時候,還是很有助於思考的。

寫了這麼多“開-閉原則”,最後想說一句:追求完美是悲劇!OCP的描述,是完美的,完美的東西在這個世界上是不存在的,所以設計軟體的時候儘量滿足OCP就是了;完全滿足,那是留給下一代的問題。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值