0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

程序設(shè)計(jì)技術(shù)之開閉原則(OCP)

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:佚名 ? 2017-09-14 14:49 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》以及《面向AMetal框架與接口編程(上)》,書本內(nèi)容公開后,在電子行業(yè)掀起一片學(xué)習(xí)熱潮。經(jīng)周立功教授授權(quán),本公眾號(hào)特對(duì)《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》一書內(nèi)容進(jìn)行連載,愿共勉之。

第二章為程序設(shè)計(jì)技術(shù),本文為2.4.3 開閉原則(OCP)。

>>> 2.4.3 開閉原則(OCP)

開閉原則(Open-Closed Princple,OCP)就是敏捷軟件開發(fā)的基本原則之一,一個(gè)模塊應(yīng)該“對(duì)擴(kuò)展開放,而對(duì)修改關(guān)閉?!北热?,一個(gè)USB端口可以擴(kuò)展,但不需要做任何修改就可以接受一個(gè)新的設(shè)備,因此,對(duì)于USB應(yīng)用設(shè)備來說,一臺(tái)有USB端口的計(jì)算機(jī)是擴(kuò)展開放而對(duì)修改關(guān)閉的。當(dāng)設(shè)計(jì)遵循OCP原則時(shí),它可以通過增加新的代碼來進(jìn)行擴(kuò)展,而不是修改已有的代碼。比如,即使某個(gè)模塊的內(nèi)部實(shí)現(xiàn)改變了,但對(duì)外的接口也不能變,其目的是隔離變化。OCP通常要求我們對(duì)軟件進(jìn)行抽象,因?yàn)橹挥芯哂泄残缘某橄蟮慕涌?,才?huì)有具體的實(shí)現(xiàn)的可能性。接口放在哪里呢?應(yīng)該放在用戶端,而不是實(shí)現(xiàn)的一方。

假設(shè)只允許將0~9之內(nèi)的value值push到棧中,即min=0,max=9。根據(jù)OCP原則,需要編寫一個(gè)調(diào)用push()功能的函數(shù)pushWithRangeCheck()。將其共性——范圍值的合法性判斷包含在函數(shù)體內(nèi),而可變的value值、min和max通過形參應(yīng)對(duì)。其函數(shù)原型為:

如果value值非法,則返回false;如果value值合法,則調(diào)用push()。此時(shí),如果棧不滿,則返回true,否則返回false,詳見程序清單 2.36。

程序清單 2.36 范圍值校驗(yàn)器范例程序(1)

由此可見,如果正確地應(yīng)用OCP,那么以后再進(jìn)行同樣的改動(dòng)時(shí),則只需要添加新的代碼,而不必改動(dòng)已經(jīng)正常運(yùn)行的代碼。如果僅需1-2種校驗(yàn)器,則上述方法非常簡(jiǎn)單明了。當(dāng)需要組合多種校驗(yàn)器一起使用時(shí),則上述方法傳遞的參數(shù)太多,而且每次push時(shí),都要傳遞允許的范圍參數(shù)。如果將min和max分離出來成為一個(gè)Range類型結(jié)構(gòu)體,即可避免以上問題:

根據(jù)OCP開閉原則,需要再編寫一個(gè)擴(kuò)展push功能的pushWithRangeCheck(),范圍值校驗(yàn)器范例程序詳見程序清單 2.37。

程序清單 2.37范圍值校驗(yàn)器范例程序(2)

如果再添加一個(gè)奇偶校驗(yàn)器,則需要判斷push到棧中的數(shù)據(jù)是否為偶數(shù),創(chuàng)建與之相應(yīng)的OddEven類型結(jié)構(gòu)體如下:

根據(jù)OCP開閉原則,還需要再編寫一個(gè)擴(kuò)展push功能的pushWithOddEvenCheck()。即:

為了避免用戶直接操作成員,則需要定義相應(yīng)的校驗(yàn)接口函數(shù)。即:

由于范圍值校驗(yàn)函數(shù)和偶數(shù)校驗(yàn)函數(shù)都有一個(gè)指向當(dāng)前對(duì)象的指針,因此可以將特殊的Range *pRange和OddEven *pOddEven泛化為void *pData。即:

無論是范圍值校驗(yàn)還是偶數(shù)校驗(yàn),其共性是對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn),因此可以共用一個(gè)函數(shù)指針。其函數(shù)原型如下:

為了便于閱讀,如程序清單 2.38所示展示了通用校驗(yàn)器的接口。

程序清單 2.38 通用校驗(yàn)器的接口(validator.h)

盡管無法預(yù)知將要支持什么校驗(yàn)器,但調(diào)用者知道,因此可以將范圍值校驗(yàn)器和奇偶校驗(yàn)器功能分離出來成為單獨(dú)的函數(shù),編寫一個(gè)通用的pushWithValidate()函數(shù),通過函數(shù)指針調(diào)用相應(yīng)的校驗(yàn)函數(shù),且不用在意具體校驗(yàn)器內(nèi)部的實(shí)現(xiàn),使用validator.h接口的通用校驗(yàn)器范例程序詳見程序清單 2.39。

程序清單 2.39通用校驗(yàn)器范例程序

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 開閉原則
    +關(guān)注

    關(guān)注

    0

    文章

    1

    瀏覽量

    900

原文標(biāo)題:周立功:敏捷軟件開發(fā)的基本原則——開閉原則(OCP)

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SOLID設(shè)計(jì)原則

    設(shè)計(jì)原則(SOLID)使用各個(gè)原則的首字母組成了一個(gè)單詞:SOLID。SRP:Single Responsibility Principle,單一職責(zé)原則OCP:Open Close
    發(fā)表于 11-08 07:44

    單片機(jī)程序中的六個(gè)設(shè)計(jì)原則分別是哪些

    片頭在上一篇文章中已經(jīng)介紹了“單一職責(zé)原則”在單片機(jī)程序中的使用,并以“環(huán)形緩存”作為介紹切入點(diǎn),因?yàn)椤碍h(huán)形緩存”在應(yīng)用中比較多,所以在介紹“開閉原則”時(shí)依然以它作為介紹切入點(diǎn)。六個(gè)設(shè)
    發(fā)表于 03-01 06:06

    《C/ C++/ Java 程序設(shè)計(jì)經(jīng)典教程》

    《C/ C++/ Java 程序設(shè)計(jì)經(jīng)典教程》(Deitel 著) ●集作者幾十年程序設(shè)計(jì)經(jīng)驗(yàn)精華,從軟件工程的原理強(qiáng)調(diào)結(jié)構(gòu)化程序設(shè)計(jì)方法,追求
    發(fā)表于 04-08 02:10 ?398次下載

    JAVA程序設(shè)計(jì)教程

    JAVA程序設(shè)計(jì)教程
    發(fā)表于 04-10 14:46 ?0次下載
    JAVA<b class='flag-5'>程序設(shè)計(jì)</b><b class='flag-5'>之</b>教程

    PIC單片機(jī)學(xué)習(xí)知識(shí)程序設(shè)計(jì)(二)

    上文中我們講述了PIC單片機(jī)基礎(chǔ)學(xué)習(xí)程序設(shè)計(jì)(一),接下來將繼續(xù)為大家講解PIC單片機(jī)程序設(shè)計(jì)(二),供大家學(xué)習(xí)。
    發(fā)表于 06-27 11:50 ?5863次閱讀

    DSP基帶碼發(fā)生器程序設(shè)計(jì)與仿真

    DSP基帶碼發(fā)生器程序設(shè)計(jì)與仿真,很好的DSP自學(xué)資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-15 17:42 ?4次下載

    DSP頻率計(jì)程序設(shè)計(jì)與仿真

    DSP頻率計(jì)程序設(shè)計(jì)與仿真,很好的DSP自學(xué)資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-15 17:42 ?6次下載

    PLC可編程控制器小車呼叫程序設(shè)計(jì)

    西門子PLC可編程控制器小車呼叫程序設(shè)計(jì),感興趣的小伙伴們可以看看。
    發(fā)表于 07-26 14:09 ?2次下載

    面向?qū)ο蟮?b class='flag-5'>程序設(shè)計(jì)總結(jié)與過程化程序設(shè)計(jì)有什么區(qū)別?

    面向?qū)ο?b class='flag-5'>程序設(shè)計(jì)(簡(jiǎn)稱OOP)技術(shù)最近幾年在計(jì)算機(jī)領(lǐng)域得到了迅猛發(fā)展,它是程序設(shè)計(jì)方法的一場(chǎng)革命。與傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)(面向過程程序設(shè)計(jì)
    發(fā)表于 09-19 14:12 ?0次下載
    面向?qū)ο蟮?b class='flag-5'>程序設(shè)計(jì)</b>總結(jié)與過程化<b class='flag-5'>程序設(shè)計(jì)</b>有什么區(qū)別?

    Java程序設(shè)計(jì)Java安全技術(shù)網(wǎng)絡(luò)編程的詳細(xì)資料說明

    本文檔詳細(xì)介紹的是Java程序設(shè)計(jì)Java安全技術(shù)網(wǎng)絡(luò)編程的詳細(xì)資料說明主要內(nèi)容包括了:1 安全基本知識(shí) ,2 Java的安全模型 ,3 Java的密碼學(xué)結(jié)構(gòu)
    發(fā)表于 02-26 14:15 ?6次下載
    Java<b class='flag-5'>程序設(shè)計(jì)</b><b class='flag-5'>之</b>Java安全<b class='flag-5'>技術(shù)</b>網(wǎng)絡(luò)編程的詳細(xì)資料說明

    單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)例閃爍的LED

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C語(yǔ)言程序設(shè)計(jì)實(shí)例閃爍的LED程序和工程文件免費(fèi)下載。
    發(fā)表于 02-01 16:45 ?5次下載

    《嵌入式軟件設(shè)計(jì)方法》--設(shè)計(jì)原則

    設(shè)計(jì)原則(SOLID)使用各個(gè)原則的首字母組成了一個(gè)單詞:SOLID。SRP:Single Responsibility Principle,單一職責(zé)原則;OCP:Open Close
    發(fā)表于 11-03 15:36 ?12次下載
    《嵌入式軟件設(shè)計(jì)方法》--設(shè)計(jì)<b class='flag-5'>原則</b>

    C語(yǔ)言程序設(shè)計(jì)第四講結(jié)構(gòu)化程序設(shè)計(jì)選擇

    C語(yǔ)言程序設(shè)計(jì)第四講結(jié)構(gòu)化程序設(shè)計(jì)選擇
    發(fā)表于 12-22 10:34 ?0次下載

    高質(zhì)量程序設(shè)計(jì)指南C++C語(yǔ)言

    高質(zhì)量程序設(shè)計(jì)指南C++C語(yǔ)言
    發(fā)表于 01-07 11:46 ?0次下載

    c語(yǔ)言程序設(shè)計(jì)概述

    電子發(fā)燒友網(wǎng)站提供《開源硬件-開發(fā)者智慧c語(yǔ)言程序設(shè)計(jì)(帶書簽).pdf》資料免費(fèi)下載
    發(fā)表于 11-20 10:25 ?1次下載
    c語(yǔ)言<b class='flag-5'>程序設(shè)計(jì)</b>概述