周立功教授數年之心血之作《程序設計與數據結構》以及《面向AMetal框架與接口的編程(上)》,書本內容公開后,在電子行業掀起一片學習熱潮。經周立功教授授權,本公眾號特對《程序設計與數據結構》一書內容進行連載,愿共勉之。
第二章為程序設計技術,本文為2.4.3 開閉原則(OCP)。
>>> 2.4.3 開閉原則(OCP)
開閉原則(Open-Closed Princple,OCP)就是敏捷軟件開發的基本原則之一,一個模塊應該“對擴展開放,而對修改關閉。”比如,一個USB端口可以擴展,但不需要做任何修改就可以接受一個新的設備,因此,對于USB應用設備來說,一臺有USB端口的計算機是擴展開放而對修改關閉的。當設計遵循OCP原則時,它可以通過增加新的代碼來進行擴展,而不是修改已有的代碼。比如,即使某個模塊的內部實現改變了,但對外的接口也不能變,其目的是隔離變化。OCP通常要求我們對軟件進行抽象,因為只有具有共性的抽象的接口,才會有具體的實現的可能性。接口放在哪里呢?應該放在用戶端,而不是實現的一方。
假設只允許將0~9之內的value值push到棧中,即min=0,max=9。根據OCP原則,需要編寫一個調用push()功能的函數pushWithRangeCheck()。將其共性——范圍值的合法性判斷包含在函數體內,而可變的value值、min和max通過形參應對。其函數原型為:
如果value值非法,則返回false;如果value值合法,則調用push()。此時,如果棧不滿,則返回true,否則返回false,詳見程序清單 2.36。
程序清單 2.36 范圍值校驗器范例程序(1)
由此可見,如果正確地應用OCP,那么以后再進行同樣的改動時,則只需要添加新的代碼,而不必改動已經正常運行的代碼。如果僅需1-2種校驗器,則上述方法非常簡單明了。當需要組合多種校驗器一起使用時,則上述方法傳遞的參數太多,而且每次push時,都要傳遞允許的范圍參數。如果將min和max分離出來成為一個Range類型結構體,即可避免以上問題:
根據OCP開閉原則,需要再編寫一個擴展push功能的pushWithRangeCheck(),范圍值校驗器范例程序詳見程序清單 2.37。
程序清單 2.37范圍值校驗器范例程序(2)
如果再添加一個奇偶校驗器,則需要判斷push到棧中的數據是否為偶數,創建與之相應的OddEven類型結構體如下:
根據OCP開閉原則,還需要再編寫一個擴展push功能的pushWithOddEvenCheck()。即:
為了避免用戶直接操作成員,則需要定義相應的校驗接口函數。即:
由于范圍值校驗函數和偶數校驗函數都有一個指向當前對象的指針,因此可以將特殊的Range *pRange和OddEven *pOddEven泛化為void *pData。即:
無論是范圍值校驗還是偶數校驗,其共性是對輸入參數進行校驗,因此可以共用一個函數指針。其函數原型如下:
為了便于閱讀,如程序清單 2.38所示展示了通用校驗器的接口。
程序清單 2.38 通用校驗器的接口(validator.h)
盡管無法預知將要支持什么校驗器,但調用者知道,因此可以將范圍值校驗器和奇偶校驗器功能分離出來成為單獨的函數,編寫一個通用的pushWithValidate()函數,通過函數指針調用相應的校驗函數,且不用在意具體校驗器內部的實現,使用validator.h接口的通用校驗器范例程序詳見程序清單 2.39。
程序清單 2.39通用校驗器范例程序
-
開閉原則
+關注
關注
0文章
1瀏覽量
915
原文標題:周立功:敏捷軟件開發的基本原則——開閉原則(OCP)
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論