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

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

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

如何更好實現(xiàn)和使用易重用抽象接口

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:劉勇 ? 2017-11-20 09:23 ? 次閱讀

>>>1.5.4實現(xiàn)接口

為了描述事物的完整性和相對封閉性,“封裝”就提上了日程,細(xì)節(jié)從此不需要再去關(guān)注。而封裝的傳統(tǒng)定義是數(shù)據(jù)隱藏,如果還是這樣看待封裝,則具有很大的局限性。應(yīng)該將封裝視為任何形式的隱藏,即發(fā)現(xiàn)變化將其封裝。封裝不僅可以隱藏數(shù)據(jù),而且可以隱藏實現(xiàn)和隱藏設(shè)計等所有的細(xì)節(jié)。

如果以更寬泛的方式看待封裝,其優(yōu)點是能夠帶來一種更好的分解程序的方法,于是封裝層自然而然地就成為了設(shè)計需要遵循的接口。封裝不會妨礙人們認(rèn)識程序內(nèi)部具體是如何實現(xiàn)的,只是為了防止用戶寫出依賴內(nèi)部實現(xiàn)的代碼。進(jìn)而強迫用戶在調(diào)用程序時,僅僅依賴于接口而不是內(nèi)部實現(xiàn),使抽象的概念接口和實現(xiàn)分離,將大大降低軟件維護(hù)成本。

C語言中的*.c文件就是接口功能的具體實現(xiàn),即用戶不可見的內(nèi)部實現(xiàn),簡稱實現(xiàn)。一個接口可以有多個實現(xiàn),它在發(fā)布后還可以改變、升級,因為它的改變不會對調(diào)用程序產(chǎn)生影響。大多數(shù)時候,*.c和*.h是成對出現(xiàn)的,一般來說,將某個子模塊的聲明放在*.h文件中,而將具體的實現(xiàn)放在對應(yīng)的*.c文件中。*.c文件可以通過引用一個或多個*.h文件,達(dá)到共用各種聲明的目的,但是*.h文件不可以引用*.c文件。

其實軟件包就是一個用來描述定義一個庫的軟件,其中*.h文件作為庫的接口,而實現(xiàn)這個庫可能有一個或多個*.c文件,每個*.c文件包含1個或多個函數(shù)定義,軟件包就是由*.h文件和*.c文件所組成的。這是一種良好的風(fēng)格,適用于任何大型程序和小型程序。

假設(shè)開發(fā)一個由多個文件組成的大型程序pgm,這樣就需要在每個*.c文件的頂部都放上這樣一行:

#include "pgm.h" //用戶自己編寫的庫文件

由此可見,通過共性分析使設(shè)計具有比較強的內(nèi)聚,其價值就是實現(xiàn)緊湊的設(shè)計。從而使調(diào)用者無需關(guān)注實現(xiàn)的細(xì)節(jié),實際上是函數(shù)的實現(xiàn)與使用它們的函數(shù)解耦了,swap()接口的實現(xiàn)程序清單 1.17。

程序清單1.17swap數(shù)據(jù)交換接口的實現(xiàn)(swap.c)

1 #include "swap.h"

2 void swap(int *p1, int *p2)

3 {

4 int temp;

5

6 temp = *p1; *p1 = *p2; *p2 = temp;

7 }

當(dāng)p1和p2分別指向變量a和b時,則p1和p2存儲的值就是&a和&b,即可用*p1和*p2表示a和b的值。如果寫成以下這種形式:

temp = p1;

則交換的不是a的值,而是a的地址(p1的值就是a的地址)。而函數(shù)要交換的是a和b的值,不是它們的地址。因此需要使用*運算符和指針,該函數(shù)才能訪問存儲在這些位置的值并改變它們。即指針允許將局部變量的地址傳給函數(shù),然后在函數(shù)中修改局部變量。

由此可見,當(dāng)將問題的“共性和可變性”分離開來,經(jīng)過簡化后發(fā)現(xiàn),穩(wěn)定不變的相同的處理部分(temp = *p1; *p1 = *p2; *p2 = temp;)都包含在抽象的模塊中,可變性分析所發(fā)現(xiàn)的變化的變量a和b由外部傳遞進(jìn)來的參數(shù)應(yīng)對。從軟件設(shè)計學(xué)角度來看,共性和可變性分析原理自然而然地成為了面向過程編程的理論基石。

注意,編寫代碼必須遵循結(jié)構(gòu)化編程規(guī)則,即每個函數(shù)、函數(shù)中的每個代碼塊都應(yīng)該只有一個入口、一個出口。實際上,只有在大函數(shù)中,這些規(guī)則才會有明顯的好處。剛開始寫代碼時,都會冗長而復(fù)雜。有太多的縮進(jìn)和嵌套循環(huán),有過長的參數(shù)列表,甚至還會有重復(fù)的代碼。需要不斷打磨這些代碼,分解函數(shù)、修改名稱、消除重復(fù),并保證測試通過。

有時我們并不關(guān)心指針?biāo)赶虻淖兞康念愋停藭r可以使用并不指定具體數(shù)據(jù)類型的泛型指針void *。通常只允許相同類型的指針之間進(jìn)行轉(zhuǎn)換,但泛型指針能夠轉(zhuǎn)換為任何類型的指針,反之亦然。比如,C標(biāo)準(zhǔn)庫中的memcpy()函數(shù)它將一段數(shù)據(jù)從內(nèi)存中的一個地方復(fù)制到另一個地方。由于memcpy()可能用于復(fù)制任何類型的數(shù)據(jù),因此將它的指針參數(shù)設(shè)定為void指針是非常合理的。比如,此前的swap()函數(shù),可以將它的參數(shù)改為void指針,則swap()就變成了一個可以交換任何類型數(shù)據(jù)的通用交換函數(shù),詳見程序清單1.18。

程序清單1.18swap()函數(shù)(void_data_swap.c)

1 #include

2 #include

3

4 int swap(void *x, void *y, int size)

5 {

6 void *temp;

7

8 if((temp = malloc(size)) == NULL)

9 return -1;

10 memcpy(temp, x, size); memcpy(x, y, size); memcpy(y, temp, size);

11 free(temp);

12 return 0;

13 }

>>>1.5.5使用接口

只要傳入待交換的變量的地址,即可確定如何通過接口調(diào)用它們,詳見程序清單1.19。

程序清單1.19 swap數(shù)據(jù)交換函數(shù)范例程序

1 #include

2 #include "swap.h"

3

4 int main(int argc, char *argv[])

5 {

6 int a = 1, b = 2;

7

8 printf("%d, %d\n", a, b);

9 swap(&a, &b);

10 printf("%d, %d\n", a, b);

11 return 0;

12 }

由此可見,抽象的接口隱藏了它的內(nèi)部細(xì)節(jié),用戶不再依賴具體的實現(xiàn)代碼,而是依賴于抽象接口。抽象的接口幾乎沒有細(xì)節(jié),沒有什么需要變化的,使抽象和細(xì)節(jié)彼此隔離,因此抽象的接口非常容易被重用,其深刻地揭示了抽象的生命力。

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

    關(guān)注

    33

    文章

    8279

    瀏覽量

    150033
  • 封裝
    +關(guān)注

    關(guān)注

    125

    文章

    7605

    瀏覽量

    142182

原文標(biāo)題:周立功:實現(xiàn)和使用易重用的抽象接口

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

收藏 人收藏

    評論

    相關(guān)推薦

    MSPM0-高級控制計時器有助于實現(xiàn)更好的控制和更好的數(shù)字輸出

    電子發(fā)燒友網(wǎng)站提供《MSPM0-高級控制計時器有助于實現(xiàn)更好的控制和更好的數(shù)字輸出.pdf》資料免費下載
    發(fā)表于 08-28 11:30 ?0次下載
    MSPM0-高級控制計時器有助于<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>更好</b>的控制和<b class='flag-5'>更好</b>的數(shù)字輸出

    AWTK 開源串口屏開發(fā)(14) - 界面重用

    把界面再拷貝一份。但是如果界面有多份,維護(hù)是一件麻煩的事情。今天我來介紹一下界面重用的問題。1.功能用同一個空調(diào)界面實現(xiàn)兩臺空調(diào)的設(shè)置。有兩臺空調(diào)客廳空調(diào)臥室空調(diào)
    的頭像 發(fā)表于 03-23 08:23 ?257次閱讀
    AWTK 開源串口屏開發(fā)(14) - 界面<b class='flag-5'>重用</b>

    usb-c接口是什么意思 pd接口和usb接口哪個更好

    USB-C接口是一種連接標(biāo)準(zhǔn),它提供了高速數(shù)據(jù)傳輸和充電功能,廣泛應(yīng)用于各種設(shè)備,包括電腦、手機、平板電腦、外接顯示器和其他外圍設(shè)備。PD接口(Power Delivery)是一種充電協(xié)議,它可
    的頭像 發(fā)表于 01-31 17:01 ?6628次閱讀

    FreeRTOS如何刪除clib支持和抽象rtos?

    我目前在我的項目中使用FreeRTOS,但只使用了其最少的功能。 我需要刪除 clib 支持和抽象 rtos,只保留 FreeRTOS。 這是為了實現(xiàn)更輕的應(yīng)用程序并最大限度地減少依賴關(guān)系。 我怎么能那樣做?
    發(fā)表于 01-25 06:19

    傳感器抽象框架有哪些

    傳感器抽象框架是一種用于開發(fā)和管理傳感器網(wǎng)絡(luò)的軟件架構(gòu)。它提供了一種抽象和整合的方式來處理傳感器節(jié)點、傳感器數(shù)據(jù)和傳感器網(wǎng)絡(luò)的通信。本文將詳細(xì)介紹傳感器抽象框架的背景、設(shè)計原則、實施方式以及應(yīng)用領(lǐng)域
    的頭像 發(fā)表于 12-28 14:08 ?487次閱讀

    java抽象類可以有構(gòu)造函數(shù)嗎

    Java 中,抽象類是一種不能直接實例化的類,它通常用作其他類的父類或接口實現(xiàn)類。抽象類可以包含抽象方法和非
    的頭像 發(fā)表于 11-21 10:23 ?669次閱讀

    java抽象類可以有普通方法嗎

    Java中的抽象類可以有普通方法,但它也可以有抽象方法。抽象類是一種中間狀態(tài),介于普通類和接口之間。它允許定義方法的具體實現(xiàn),同時也可以定義
    的頭像 發(fā)表于 11-21 10:22 ?1259次閱讀

    如何理解java中的抽象

    Java中的抽象類是一種特殊的類,無法被實例化,只能被繼承。它是一個中間層的類,位于具體類和接口之間,用于定義通用的屬性和方法,并提供一些默認(rèn)的實現(xiàn)。抽象類經(jīng)常被用來作為其他類的基類,
    的頭像 發(fā)表于 11-21 10:16 ?476次閱讀

    java接口是特殊的抽象類嗎

    的區(qū)別。 首先,從語法和定義上來看,接口抽象類是不同的。接口是用interface關(guān)鍵字定義的,而抽象類是用abstract關(guān)鍵字定義的。根據(jù)Java語法,一個類只能繼承自一個父類,
    的頭像 發(fā)表于 11-21 10:07 ?537次閱讀

    抽象類可以實現(xiàn)接口

    詳細(xì)介紹抽象類和接口的概念,以及抽象類是否能夠實現(xiàn)接口的問題。 首先,讓我們先來了解一下抽象類和
    的頭像 發(fā)表于 11-21 09:49 ?1047次閱讀

    Java中抽象類和接口的介紹

    Java是一種面向?qū)ο蟮木幊陶Z言,提供了抽象類和接口兩種機制來幫助開發(fā)人員組織和管理代碼。本文將詳細(xì)介紹Java語言中抽象類和接口的概念、特點、使用方式以及它們之間的區(qū)別和聯(lián)系。
    的頭像 發(fā)表于 11-21 09:47 ?391次閱讀

    java接口抽象類的區(qū)別

    接口抽象類的區(qū)別,包括定義、實現(xiàn)、字段、構(gòu)造函數(shù)、繼承、多態(tài)、默認(rèn)方法等方面。 定義 接口表示一種契約,它只是一種規(guī)范或協(xié)議,定義了類應(yīng)該包含哪些方法以及它們的簽名,但沒有提供方法的
    的頭像 發(fā)表于 11-21 09:45 ?447次閱讀

    SystemC TLM中的接口

    SystemC TLM中的接口 在SystemC TLM中,接口是一個C++的抽象類。抽象類中的所有方法都是用“=0”標(biāo)識表示的純虛函數(shù)。C++不允許創(chuàng)建
    的頭像 發(fā)表于 11-02 15:54 ?646次閱讀

    TLM抽象模型介紹

    (1)OCP-IP TLM抽象模型 OCP-IP(Open Core Protocol International Partnership)是推動IP核接口標(biāo)準(zhǔn)化的國際組織。OCP-IP提出了一個4
    的頭像 發(fā)表于 11-02 14:57 ?608次閱讀
    TLM<b class='flag-5'>抽象</b>模型介紹

    AUTOSAR架構(gòu)MCAL、服務(wù)層、ECU抽象層介紹

    1 微控制器抽象層(MCAL) AUTOSAR CP的微控制器抽象層(MCAL)是AUTOSAR軟件架構(gòu)中的一個重要組成部分,它提供了對底層硬件的抽象和訪問接口,以
    的頭像 發(fā)表于 10-27 15:36 ?5647次閱讀