福州江閩儀器技術有限公司

技(jì)術交流(liu)

周立功(gōng):設計良(liang)好的程(chéng)序接口(kǒu)需注意(yi)的5個事(shì)項
來源(yuan):   發布時(shi)間:2025-12-16   浏覽(lǎn)量:66

周立(li)功教授(shou)數年之(zhī)心血之(zhi)作《程序(xù)設計與(yu)數據結(jie)構》,電子(zǐ)版已無(wú)償性分(fen)享到電(diàn)子工程(cheng)師與高(gao)校群🈲體(tǐ)。書本内(nei)容公✂️開(kai)後,在電(diàn)子行業(ye)掀起一(yī)片學習(xi)熱潮。經(jīng)周立功(gōng)教授授(shou)權,特對(dui)本書内(nei)容進行(hang)連載,願(yuan)共勉之(zhī)。

第一章(zhang)爲程序(xù)設計基(jī)礎,本文(wen)爲1.5.2/1.5.3共性(xìng)與可變(bian)性分析(xi):建立抽(chou)象和建(jian)立接口(kou)。

>>>> 1.5.2 建立抽(chou)象

抽象(xiang)化的目(mu)的是使(shi)調用者(zhě)無需知(zhī)道模塊(kuài)的内部(bù)🌂細節,隻(zhī)需要知(zhi)道模塊(kuài)或函數(shu)的名字(zi),因此将(jiang)其稱爲(wei)黑盒化(huà)。調用者(zhě)隻需要(yao)🙇🏻知道黑(hei)盒子的(de)輸入和(hé)輸🐆出,而(ér)過程的(de)細節是(shì)隐藏的(de)。由❌于建(jiàn)立了一(yi)個由黑(hēi)盒子組(zu)成的系(xi)統,因此(ci)複雜的(de)結構就(jiù)被🧑🏾‍🤝‍🧑🏼黑盒(hé)子隐🧑🏾‍🤝‍🧑🏼藏(cáng)起來了(le),則理解(jie)系統的(de)整體結(jié)構就變(biàn)得更容(róng)易了。

從(cóng)概念的(de)視角來(lái)看,建立(li)抽象關(guān)注的不(bú)是如何(he)實現,而(ér)是函數(shù)🌈要做什(shi)麽,過早(zao)地關注(zhù)實現細(xi)節,将實(shi)現細節(jiē)隐藏起(qi)來,進而(ér)幫助我(wǒ)們構建(jian)更易于(yu)修改的(de)軟件。因(yīn)此,我們(men)首先應(yīng)該選🌈擇(zé)一個具(ju)有描述(shù)性的符(fu)合需求(qiú)的名字(zì),雖然可(ke)以選擇(ze)的名字(zi)有swapByte、swapWord和swap,但(dàn)swap更簡潔(jié)更貼切(qiē)。其次,可(kě)以用一(yī)句話概(gài)‼️念性地(dì)描述swap的(de)數據抽(chōu)象——swap是實(shí)現兩個(ge)數據交(jiāo)換的函(han)數。

顯然(ran),調用者(zhě)僅需一(yi)般性地(di)在概念(nian)層次上(shang)與實現(xian)者交流(liú),因爲調(diào)用者的(de)意圖是(shi)如何使(shǐ)用swap()實現(xian)兩個數(shù)據🥵的交(jiāo)🌈換,所以(yi)無需準(zhun)确地知(zhi)道實現(xiàn)的細節(jie)。而具體(tǐ)如✍️何完(wán)成數據(ju)的交換(huan),這是在(zai)實現層(céng)次進行(háng)的。由此(ci)可見,将(jiāng)模塊的(de)目的與(yu)實現分(fen)離的抽(chou)象揭⛹🏻‍♀️示(shi)了問題(ti)的本質(zhì),并沒有(yǒu)提供解(jie)決方案(an)。隻說明(ming)需要做(zuò)什麽,并(bing)不會指(zhi)出如何(he)實❓現某(mou)個模塊(kuài)。隻要概(gai)念不變(biàn),調☎️用者(zhě)與實現(xian)細節的(de)變化就(jiu)徹底隔(gé)離了。當(dāng)某個模(mó)塊完成(cheng)編碼後(hou),隻要說(shuō)明該模(mo)塊的目(mu)的和參(cān)數就可(ke)以使用(yong)它,無需(xū)知道具(jù)體的實(shí)現。

函數(shu)抽象對(duì)團隊項(xiang)目非常(chang)重要,因(yin)爲在團(tuán)隊中必(bi)須使💋用(yong)其🐪他成(chéng)員編寫(xie)的模塊(kuai)。比如,編(bian)程語言(yan)本身自(zì)帶🌈的庫(kù)❌函數🧑🏾‍🤝‍🧑🏼,由(yóu)于🚶‍♀️已經(jīng)被預編(bian)譯,因此(ci)無法訪(fǎng)問它的(de)源代碼(ma)。同時庫(kù)函數不(bú)一定是(shì)用C編寫(xie)的,因此(cǐ)隻要知(zhi)道其調(diao)用規範(fàn),就可以(yi)在程序(xù)中毫無(wu)顧忌地(di)使用這(zhe)個函數(shù)。實際上(shàng),在使用(yong)scanf()函數的(de)過程中(zhong),我們考(kǎo)慮過scanf()是(shì)如何實(shí)現的嗎(ma)?無關緊(jǐn)要。盡管(guan)不同系(xi)統實現(xian)scanf()的方法(fǎ)可能不(bu)一樣,但(dan)其中🐆的(de)不同對(dui)于程🐅序(xù)員來說(shuo)是透明(míng)的。

>>>> 1.5.3 建立(lì)接口

接(jiē)口是由(you)公開訪(fǎng)問的方(fāng)法和數(shu)據組成(chéng)的,接口(kou)描⚽述了(le)與模💜塊(kuai)🔞交互的(de)唯一途(tu)徑。最小(xiao)化的接(jie)口隻包(bao)含對💘于(yu)接口的(de)任務非(fei)常重要(yào)的參數(shù),最小化(hua)的接口(kǒu)便于學(xué)習如何(he)與之交(jiāo)互,且隻(zhī)需要✂️理(lǐ)解少量(liàng)的參數(shù),同時易(yì)于擴展(zhan)和維護(hù),因此設(shè)計良好(hǎo)的接口(kou)💁是一項(xiang)重要🥵的(de)技能。

>>> 1. 函(han)數調用(yong)

(1)傳值調(diao)用

如何(he)調用swap()函(han)數呢?實(shí)參将值(zhí)從主調(diao)函數傳(chuan)遞給被(bei)調函數(shu),也許其(qi)調用形(xing)式是下(xia)面這樣(yàng)的:
swap(a, b);

一(yī)個變量(liàng)的有效(xiào)範圍稱(chēng)作它的(de)作用域(yu),變量的(de)作用域(yu)指可以(yǐ)通過變(biàn)量名稱(cheng)引用變(biàn)量的區(qū)域,在函(han)🚩數内部(bù)聲㊙️明的(de)♌變量✏️隻(zhī)在該函(han)數内部(bu)有效。當(dāng)主調函(han)數調用(yòng)子函🔞數(shu)時,主函(hán)數内🏒聲(sheng)明的變(bian)量在子(zǐ)函數内(nèi)無效,子(zǐ)函數内(nèi)聲明的(de)變🐅量也(ye)隻在該(gai)子函數(shu)⁉️内部有(yǒu)效。

由于(yu)傳遞給(gei)函數的(de)是變量(liang)的替身(shen),因此改(gǎi)變函數(shù)參🏃‍♀️數對(duì)原始變(biàn)量沒有(you)影響。當(dāng)變量傳(chuán)遞給函(han)數時,變(biàn)量的值(zhí)📧被複制(zhi)給函數(shù)參數。由(you)此可見(jiàn),通過“傳(chuán)值調用(yong)”方式交(jiāo)換a、b的值(zhí),無🈲法改(gai)變主調(diao)函數相(xiang)應變量(liang)的值。

(2)傳(chuan)址調用(yòng)

如果希(xī)望通過(guo)被調函(hán)數将更(geng)多的值(zhí)傳回主(zhu)調函數(shù)而改變(bian)主調函(han)數中的(de)變量,則(ze)使用“傳(chuan)址調用(yong)”——将🈲&a、&b作爲(wei)實參傳(chuan)遞給形(xing)參。其調(diào)用形式(shì)如下:
swap(&a, &b);

利(lì)用指針(zhen)作爲函(hán)數參數(shu)傳遞數(shù)據的本(běn)質,就是(shì)在主調(diao)函🈲數和(hé)⭐被調函(hán)數中,通(tong)過不同(tong)的指針(zhēn)指向同(tong)💜一内存(cun)地址訪(fǎng)問相同(tong)的内存(cun)區域,即(ji)它們背(bèi)後共享(xiǎng)相同的(de)内存,從(cong)而實現(xian)數據♈的(de)傳遞和(he)交換。

>>> 2. 函(hán)數原型(xíng)

函數原(yuán)型是C語(yǔ)言的一(yi)個強有(you)力的工(gōng)具,它讓(ràng)編譯器(qì)捕🌈獲在(zai)使用函(han)數時可(kě)能出現(xiàn)的許多(duō)錯誤或(huò)疏漏。如(rú)果編譯(yi)器沒有(you)發現㊙️這(zhe)些問題(tí),就很難(nan)察覺出(chu)來。函數(shù)原型包(bāo)括函數(shù)返回值(zhi)的類型(xing)、函數名(míng)和形參(cān)列表(參(cān)數的數(shu)量✌️和每(mei)個參🧑🏽‍🤝‍🧑🏻數(shu)的類型(xíng)),有了這(zhè)些信息(xī),編譯器(qi)就可以(yǐ)檢查函(han)數調用(yong)與函數(shu)原型是(shi)否匹配(pèi)?比如,參(cān)數的數(shu)量是否(fou)正确?參(cān)數的類(lèi)型是否(fou)匹配?如(ru)果類型(xíng)不匹配(pei),編譯器(qì)會🐕将實(shí)參的類(lèi)型轉換(huan)成形參(cān)的類型(xing)。

(1)函數形(xíng)參

通過(guò)程序清(qīng)單 1.15可以(yi)看出,其(qi)相同的(de)處理部(bu)分是2個(gè)int類值的(de)交換代(dai)碼,因此(ci)可以将(jiang)數據交(jiāo)換代碼(ma)移到🏃‍♂️swap()函(hán)數的實(shí)現中,其(qi)可變的(de)數據由(yóu)外部傳(chuan)進來的(de)參數應(ying)對。由于(yú)&a是指向(xiàng)int類🔞型變(biàn)量a的指(zhǐ)針,&b是指(zhǐ)向int類型(xíng)🔞變量b的(de)指針,因(yin)此必須(xu)将p1、p2形參(can)聲明爲(wei)指向int *類(lei)型的指(zhi)針變量(liang),即必須(xu)将存儲(chu)int類型值(zhi)變量的(de)地址作(zuo)爲實參(can)賦給指(zhǐ)針形參(can),實參與(yu)形參才(cái)能匹配(pei)。其函數(shù)原型進(jìn)化⛷️如下(xià):
swap(int *p1, int *p2);

(2)返回值(zhí)的類型(xing)

聲明函(han)數時必(bì)須聲明(ming)函數的(de)類型,帶(dài)返回值(zhi)的函數(shu)類型應(ying)該與其(qí)返回值(zhí)類型相(xiang)同,而沒(mei)有返回(huí)值的函(hán)數應該(gāi)聲明爲(wèi)void。類型聲(sheng)明是函(hán)數定義(yi)的一部(bù)分,函數(shù)類型指(zhǐ)的是返(fan)回值的(de)類型,不(bu)🔞是函數(shù)參數♊的(de)類型。

雖(sui)然可以(yǐ)使用return返(fǎn)回值,但(dan)return隻能返(fǎn)回一個(gè)值給主(zhu)調函數(shu)✂️。比如,如(rú)果返回(huí)值爲整(zhěng)數,則函(han)數返回(huí)值的類(lèi)型爲int。當(dāng)返回值(zhi)爲int類型(xing)時,如果(guo)返回值(zhí)爲負數(shu),則表示(shì)失敗;如(ru)果返😘回(hui)值爲非(fēi)負數🐉,則(zé)表示成(chéng)功。當返(fǎn)回值爲(wei)bool類型時(shí),如果返(fǎn)回值爲(wèi)false,則表示(shi)失敗,如(rú)果返回(huí)值爲true,則(zé)表示🌏成(cheng)功。當返(fǎn)回值爲(wei)指針類(lèi)型時,如(ru)果返回(huí)值爲NULL,則(ze)表示失(shī)敗,否則(zé)返回💞一(yī)個有效(xiao)的指針(zhen)。

如果利(lì)用指針(zhen)作爲參(can)數傳遞(di)給函數(shù),不僅可(ke)以向函(han)數傳入(rù)數❓據,而(ér)且還可(ke)以從函(hán)數返回(huí)多個值(zhi)。因❗爲函(hán)數的調(diao)用者和(he)函數都(dou)可以使(shi)用指向(xiang)同一内(nèi)存地址(zhi)🤩的指針(zhen),即使用(yong)同一塊(kuai)内存,所(suo)✌️以使用(yòng)指針作(zuo)爲函數(shu)參數時(shí)就🚩是對(dui)同一數(shù)據進行(hang)讀寫操(cāo)作🌐。這樣(yàng)不僅可(ke)以傳入(ru)數據🛀🏻,還(hai)可以通(tong)過在函(han)數内部(bu)修改這(zhe)些數據(ju),将函數(shu)的結果(guo)傳出給(gei)調用者(zhě)。

當函數(shù)的實參(cān)是指針(zhēn)變量時(shí),有時希(xi)望函數(shù)能通過(guò)指針指(zhi)向别處(chu)的方式(shi)改變此(cǐ)變量,則(zé)需要使(shǐ)用指向(xiang)指針🔞的(de)指針作(zuò)爲形參(can)。

由于swap()無(wu)返回值(zhí),因此swap()返(fan)回值的(de)類型爲(wei)void,其函數(shu)原型如(ru)🈲下:
void swap(int *p1, int *p2);

這是一(yi)個不斷(duan)叠代優(you)化的過(guò)程,用戶(hu)隻需要(yào)知道“函(han)數名、傳(chuan)入函數(shu)的參數(shu)和函數(shu)返回值(zhi)的類型(xíng)”,就💞知道(dao)如何有(you)效地調(diao)用相應(yīng)的函數(shù)。

>>> 3.  依賴倒(dao)置原則(zé)

在面向(xiàng)過程編(bian)程中,通(tōng)常的做(zuo)法是高(gāo)層模塊(kuài)調用✍️低(dī)🔆層🌈模塊(kuài),其目的(de)之一就(jiù)是要定(ding)義子程(cheng)序層次(ci)結構。當(dāng)🈲高層模(mo)塊依賴(lài)于低層(céng)模塊時(shí),對低層(céng)模塊的(de)改動會(huì)直接影(ying)響高層(céng)🈲模塊,從(cong)而迫使(shǐ)它們依(yī)次做出(chū)修改。如(rú)果高層(céng)模塊獨(dú)立于低(dī)層模塊(kuai),則高層(ceng)模塊更(geng)容易重(zhong)🐕用,這就(jiu)是分層(céng)架構設(she)計的核(he)心原則(ze)🔞,即依賴(lài)倒置原(yuan)則(Dependence Inversion Principle,DIP):

● 高層(ceng)模塊不(bu)應該依(yī)賴低層(céng)模塊,兩(liǎng)者都應(ying)該依賴(lai)🌍于抽象(xiàng)接口;

● 抽(chōu)象接口(kou)不應該(gāi)依賴于(yú)細節,細(xì)節應該(gai)依賴抽(chōu)象接口(kǒu)。

當在分(fen)層架構(gòu)中使用(yong)依賴倒(dǎo)置原則(ze)時,将會(huì)發現“不(bu)🎯再存在(zai)分層”的(de)概念了(le)。無論是(shi)高層還(hái)是低層(ceng),它🌂們都(dōu)依賴于(yú)抽象接(jie)口,好像(xiàng)将整個(ge)分層架(jià)構推平(ping)一樣。

其(qi)實從“Hello World”程(chéng)序開始(shi),我們就(jiu)已經在(zài)使用stdio.h包(bao)含的“抽(chou)象接口(kǒu)”了🤩,即🔞以(yǐ)後凡是(shì)用#include文件(jiàn)的擴展(zhan)名叫.h(頭(tóu)文件)。如(ru)果源代(dài)碼中要(yao)🔴用到stdio标(biāo)準輸入(rù)輸出函(han)數時,那(nà)麽就要(yào)包含這(zhe)個頭文(wen)件,比如(rú),“scanf("%d",&i);”函數,其(qí)目的是(shi)告訴編(bian)譯器要(yao)使用stdio庫(kù)。庫是一(yī)種工具(jù)的集合(he),這些工(gong)具是由(yóu)⛱️其它程(chéng)序員編(bian)寫的,用(yong)于實現(xian)特定的(de)功能。盡(jin)管實現(xiàn)者無需(xū)關心用(yòng)戶将如(rú)何使用(yòng)庫,且不(bú)會直接(jiē)開放源(yuán)代碼給(gei)用戶使(shi)用,但必(bi)須給用(yong)戶提供(gong)調用函(hán)數所需(xu)要的信(xìn)息。顯📞然(rán)隻要将(jiāng)頭文件(jiàn)開放給(gěi)用戶🍉,即(jí)可讓用(yong)戶了解(jie)接口✊的(de)所有細(xì)節,詳見(jian)程序清(qīng)單 1.16。

程序(xu)清單 1.16 swap數(shu)據交換(huan)接口(swap.h)
1     #ifndef  _SWAP_H
2     #define  _SWAP_H
3     // 前(qián)置條件(jian):實參必(bi)須是int類(lei)型變量(liàng)的地址(zhǐ)
4     // 後置條(tiáo)件:p1、p2作爲(wei)輸出參(cān)數,改變(bian)主調函(hán)數中相(xiàng)應的變(bian)量
5     void swap(int *p1, int *p2);
6     // 調用(yong)形式:swap(&a, &b)
7     #endif

其(qí)中,每個(gè)頭文件(jian)都指出(chu)了一個(ge)用戶可(kě)見的外(wài)部函數(shù)接口,主(zhǔ)❤️要包括(kuo)函數名(ming)、所需的(de)參數、參(can)數的類(lèi)⭐型和返(fǎn)回❤️結果(guo)的類型(xing)。其中,swap是(shì)庫的名(ming)字,程序(xù)清單 1.16(1~2)與(yu)(8)是幫助(zhù)編譯器(qi)記錄它(ta)所讀取(qu)的接口(kou),當寫一(yī)個接口(kou)時,必須(xu)包含#ifndef、#define和(hé)#ednif。#include行部分(fen)僅♈當接(jie)口本身(shen)需要其(qi)❌它庫時(shi)才使用(yòng),它由标(biāo)準🏃的#include行(hang)組成。程(chéng)👣序清單(dan) 1.16(6)接口⭕項(xiàng)表示庫(kù)輸出的(de)函數的(de)原型、常(chang)量和類(lèi)型等。不(bu)管你是(shi)否理解(jiě),這些行(háng)是接口(kǒu)的模闆(pǎn)文件,這(zhè)就是信(xin)息🔆隐藏(cang)。

>>> 4. 前/後置(zhì)條件

處(chu)理信息(xī)隐藏還(hái)涉及到(dao)另一個(gè)技術,那(nà)就是使(shǐ)用前🍉置(zhi)條件和(hé)後置條(tiáo)件描述(shù)函數的(de)行爲。在(zai)編寫一(yi)個完整(zhěng)的函數(shù)定義💞時(shi),需要描(miáo)述該函(han)數是如(rú)何執行(háng)計算的(de)。但在使(shi)用函數(shu)時,隻需(xu)考慮該(gāi)函數能(neng)做什麽(me),無需知(zhi)道是如(ru)何完成(chéng)的。當不(bú)知道函(han)數是如(rú)何實現(xiàn)時,就是(shi)在使用(yòng)一種名(míng)爲過程(chéng)抽象的(de)信息👄隐(yin)藏形式(shi),它抽象(xiàng)掉的是(shì)函數如(ru)何工作(zuo)的細節(jie)。計算機(ji)科學家(jiā)使用“過(guò)程”表示(shi)任意指(zhi)令集,因(yīn)此使用(yòng)術👅語過(guò)程抽象(xiang)。過程👨‍❤️‍👨抽(chōu)象是一(yī)種強大(dà)的工具(jù),使得我(wǒ)們一次(ci)隻考慮(lǜ)一個而(er)不是所(suǒ)有的函(han)數,從而(er)使㊙️問題(ti)求解簡(jian)單化。

爲(wei)了使描(miao)述更準(zhǔn)确,則需(xū)要遵循(xún)固定的(de)格式,它(tā)包含兩(liang)👄部分信(xìn)息:函數(shù)的前置(zhì)條件和(he)後置條(tiao)件。前置(zhi)條件就(jiu)是調用(yòng)該函數(shu)必🥵須成(cheng)立的條(tiáo)件,當函(hán)數被調(diào)用時,該(gāi)語句給(gei)出要求(qiú)爲真的(de)條件。除(chú)非前置(zhì)條件爲(wei)真,否‼️則(ze)無法保(bao)證函數(shù)能正确(què)執行。在(zài)調用swap()函(han)🛀數時,實(shi)參必須(xu)是int類型(xing)變💋量的(de)地址,這(zhe)是調用(yong)者的❓職(zhi)責。通常(chang)在函數(shù)開始處(chu)檢查是(shi)否滿足(zú)?如果不(bu)滿足,說(shuo)明調用(yòng)代碼有(you)問題,抛(pao)出一個(gè)異常。

後(hou)置條件(jiàn)就是該(gai)操作完(wan)成後必(bì)須成立(lì)的條件(jian),當函數(shù)調用時(shi),如果函(han)數是正(zheng)确的,而(ér)且前置(zhì)條件爲(wei)❤️真,那麽(me)該函數(shu)調用将(jiang)可以執(zhí)行完成(cheng)。當函數(shu)調用完(wán)成後👈,後(hou)置條件(jiàn)爲真。如(rú)果不滿(mǎn)足後置(zhì)條件,則(ze)說💁明業(yè)務邏輯(ji)有問題(ti)。

前(qian)後置條(tiao)件不隻(zhī)是概括(kuo)地描述(shu)函數的(de)行爲,聲(sheng)明這些(xiē)條件應(yīng)該是設(shè)計任何(hé)函數的(de)第一步(bu)。在開始(shi)🙇🏻考慮某(mou)個函數(shu)的算法(fǎ)和代碼(ma)之前,應(yīng)該寫出(chu)該函🐉數(shù)的原🈲型(xing),其中🚩包(bāo)括函數(shu)的返♌回(huí)類型㊙️、名(míng)稱和參(can)數列表(biǎo),最後緊(jin)跟一個(gè)🏃‍♀️分号。直(zhi)接來自(zì)于用✨戶(hù)的輸入(ru)不能作(zuò)爲前置(zhi)條件,通(tong)常前/後(hòu)置條件(jiàn)都可以(yi)轉化爲(wèi)assert語句。編(biān)寫函數(shu)原型時(shí),應該✉️以(yi)注釋的(de)形式描(miao)述該函(han)數的前(qián)置條件(jian)和後置(zhi)條件。

事(shi)實上,前(qian)置條件(jiàn)和後置(zhi)條件在(zai)使用函(han)數的程(chéng)序員和(hé)編寫函(han)數的程(chéng)序員之(zhi)間形成(chéng)了一個(gè)契約,也(ye)就是爲(wèi)什麽需(xū)要這個(gè)函數?接(jiē)口通過(guo)前置條(tiáo)件和🌈後(hou)置條件(jiàn)以契🤩約(yuē)的形式(shi)表達需(xu)求,承諾(nuò)在滿足(zu)前置條(tiáo)件時開(kāi)始,按照(zhao)程序的(de)流🧑🏽‍🤝‍🧑🏻程運(yùn)行,系統(tong)就能到(dao)達後置(zhì)條件。

雖(suī)然注釋(shì)是一種(zhǒng)很好的(de)溝通形(xing)式,但在(zai)代碼可(ke)以傳遞(dì)意圖的(de)地方不(bú)要寫注(zhu)釋。因爲(wèi)代碼解(jie)釋做了(le)🌏什麽,再(zai)注釋也(ye)沒有什(shi)麽🛀🏻用處(chu),相反注(zhu)釋要說(shuō)明爲什(shí)麽會這(zhe)樣寫代(dài)碼?

接(jiē)口僅需(xū)指明用(yong)戶調用(yòng)程序可(kě)能調用(yòng)的标識(shí)符,應🧑🏽‍🤝‍🧑🏻盡(jin)🤟可能地(dì)将算法(fa)以及一(yī)些與具(jù)體的實(shi)現細節(jiē)無關的(de)信息隐(yǐn)藏起來(lai),這樣用(yòng)戶在調(diào)用程序(xù)時也就(jiu)不必依(yī)賴特定(ding)的實現(xiàn)細節了(le)。當接口(kou)一旦發(fā)布後,也(yě)就不能(neng)改變了(le),因爲改(gai)變接口(kou)勢必引(yin)起用戶(hu)程序的(de)改變。如(ru)果此前(qián)定☎️義的(de)接口滿(man)🏒足不了(le)需求✊,怎(zen)麽辦?隻(zhi)能擴展(zhan)新的接(jiē)口,但不(bu)能修改(gai)或廢除(chu)原有的(de)接口🐕,這(zhe)就是“對(dui)修改關(guān)閉,對擴(kuò)展開放(fàng)”的開閉(bi)原則(Open-Closed Princple,OCP)。顯(xian)然,依賴(lai)倒置原(yuán)則更加(jiā)精确的(de)定義就(jiù)是面向(xiàng)接口的(de)編程,它(ta)是實現(xian)開閉🧡原(yuán)則的重(zhòng)要途徑(jìng)。如果DIP依(yi)賴倒置(zhi)原則沒(méi)有實現(xian),就别想(xiǎng)實現對(duì)擴展開(kāi)放,對修(xiu)改關閉(bì)。

总 公 司(sī)急 速 版(bǎn)WAP 站H5 版无(wú)线端AI 智(zhi)能3G 站4G 站(zhan)5G 站6G 站
 ·
·
·
 
·
·