衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何更好實現和使用易重用抽象接口

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

>>>1.5.4實現接口

為了描述事物的完整性和相對封閉性,“封裝”就提上了日程,細節從此不需要再去關注。而封裝的傳統定義是數據隱藏,如果還是這樣看待封裝,則具有很大的局限性。應該將封裝視為任何形式的隱藏,即發現變化將其封裝。封裝不僅可以隱藏數據,而且可以隱藏實現和隱藏設計等所有的細節。

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

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

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

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

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

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

程序清單1.17swap數據交換接口的實現(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 }

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

temp = p1;

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

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

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

有時我們并不關心指針所指向的變量的類型,此時可以使用并不指定具體數據類型的泛型指針void *。通常只允許相同類型的指針之間進行轉換,但泛型指針能夠轉換為任何類型的指針,反之亦然。比如,C標準庫中的memcpy()函數它將一段數據從內存中的一個地方復制到另一個地方。由于memcpy()可能用于復制任何類型的數據,因此將它的指針參數設定為void指針是非常合理的。比如,此前的swap()函數,可以將它的參數改為void指針,則swap()就變成了一個可以交換任何類型數據的通用交換函數,詳見程序清單1.18。

程序清單1.18swap()函數(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使用接口

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

程序清單1.19 swap數據交換函數范例程序

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 }

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8694

    瀏覽量

    151928
  • 封裝
    +關注

    關注

    127

    文章

    7997

    瀏覽量

    143413

原文標題:周立功:實現和使用易重用的抽象接口

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LabVIEW抽象消息使用教程(上)

    自學LabVIEW的Actor FrameWork的消息與抽象消息的時候肯定會覺得非常模糊。小編將給大家帶來一個有關抽象消息的教程,分為上下兩期,本期將帶領大家創建Actor中的方法并為方法創建對應的消息。
    的頭像 發表于 01-03 14:22 ?283次閱讀
    LabVIEW<b class='flag-5'>抽象</b>消息使用教程(上)

    利用FPGA實現USB 2.0通信接口

    USB?2.0接口實現方式 利用FPGA來實現USB 2.0接口的方式一般有兩種,一是借助外圍的USB接口芯片,二是FPGA內部
    的頭像 發表于 12-30 13:59 ?775次閱讀
    利用FPGA<b class='flag-5'>實現</b>USB 2.0通信<b class='flag-5'>接口</b>

    創新榮獲2024全球電子成就獎年度微控制器/接口產品獎

    近日,在Aspencore 2024全球電子成就獎(WEAA)頒獎典禮中,旗下基于RISC-V內核的GD32VW553系列雙模無線微控制器榮獲“年度微控制器/接口產品”獎,這是兆創新連續第7年獲得此項殊榮,充分展現了公司在產品創新和技術研發領域的領先地位和卓越實力。
    的頭像 發表于 11-06 11:52 ?364次閱讀

    智能選擇ADC/DAC可實現更好的軟件定義無線電設計

    電子發燒友網站提供《智能選擇ADC/DAC可實現更好的軟件定義無線電設計.pdf》資料免費下載
    發表于 10-21 09:59 ?0次下載
    智能選擇ADC/DAC可<b class='flag-5'>實現</b><b class='flag-5'>更好</b>的軟件定義無線電設計

    使用ADC12_A實現熱電偶接口

    電子發燒友網站提供《使用ADC12_A實現熱電偶接口.pdf》資料免費下載
    發表于 10-18 10:13 ?0次下載
    使用ADC12_A<b class='flag-5'>實現</b>熱電偶<b class='flag-5'>接口</b>

    單CPU 雙項目開發實現更好的維護性和可行性應用說明

    電子發燒友網站提供《單CPU 雙項目開發實現更好的維護性和可行性應用說明.pdf》資料免費下載
    發表于 09-12 09:42 ?0次下載
    單CPU 雙項目開發<b class='flag-5'>實現</b><b class='flag-5'>更好</b>的維護性和可行性應用說明

    通無線DTU騰訊云通信實例

    通無線DTU騰訊云通信實例(基于MQTT)優——產品優,服務優,價格優——安裝,使用,維護通——通訊技術專家,精于通訊,萬物互通
    的頭像 發表于 08-30 11:45 ?409次閱讀
    優<b class='flag-5'>易</b>通無線DTU騰訊云通信實例

    MSPM0-高級控制計時器有助于實現更好的控制和更好的數字輸出

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

    克服設計難題-實現高性能接口

    電子發燒友網站提供《克服設計難題-實現高性能接口.pdf》資料免費下載
    發表于 08-28 09:41 ?0次下載
    克服設計難題-<b class='flag-5'>實現</b>高性能<b class='flag-5'>接口</b>

    串行外設接口的菊花鏈實現

    電子發燒友網站提供《串行外設接口的菊花鏈實現.pdf》資料免費下載
    發表于 08-27 09:45 ?1次下載
    串行外設<b class='flag-5'>接口</b>的菊花鏈<b class='flag-5'>實現</b>

    RJ45接口與以太網接口的區別

    在當今的計算機網絡世界中,RJ45接口和以太網接口是兩個常見的術語,它們在網絡通信中扮演著不可或缺的角色。然而,盡管它們都與網絡連接有關,但它們在定義、功能和應用上存在明顯的區別。本文將詳細探討RJ45接口和以太網
    的頭像 發表于 05-29 16:33 ?4889次閱讀

    鴻蒙語言TypeScript學習第15天:【聯合類型】

    接口是一系列抽象方法的聲明,是一些方法特征的集合,這些方法都應該是抽象的,需要由具體的類去實現,然后第三方就可以通過這組抽象方法調用,讓具體
    的頭像 發表于 04-14 09:49 ?640次閱讀
    鴻蒙語言TypeScript學習第15天:【聯合類型】

    實踐GoF的23種設計模式實現:橋接模式

    也即,將抽象部分和實現部分進行解耦,使得它們能夠各自往獨立的方向變化。
    的頭像 發表于 04-14 09:30 ?520次閱讀
    實踐GoF的23種設計模式<b class='flag-5'>實現</b>:橋接模式

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

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

    用 WeLink 連接每一位員工,加速打造“數字立德”

    供應鏈管理、人力資源管理等企業管理領域。2020 年,立德攜手華為云 WeLink,從立德實際業務需求出發,打造全連接數字立德,實現效率和業務雙提升。
    的頭像 發表于 02-28 20:56 ?590次閱讀
    用 WeLink 連接每一位員工,加速打造“數字<b class='flag-5'>易</b>立德”
    百家乐官网破战| 博之道百家乐官网的玩法技巧和规则 | 大发888免费游戏| 百家乐博赌城| 百家乐赢钱海立方| 巴特百家乐官网的玩法技巧和规则| 百家乐官网赌机凤凰软件| 宁波市| 开户娱乐城送20彩金| 老虎机控制器| 迪威百家乐娱乐平台| 百家乐二游戏机| 伯爵百家乐官网赌场娱乐网规则 | 宁津县| 淘金盈娱乐城| 大发888游戏平台17| 威尼斯人娱乐场骗人| 最好百家乐的玩法技巧和规则 | 百家乐官网真人游戏| 送彩金百家乐官网的玩法技巧和规则| 百家乐官网最新投注方法| 百家乐官网模拟投注器| 富民县| 易博彩票网| 金凤凰平台| 百乐坊娱乐城噢门| 大发888游戏官方下载| 赌球记| 太阳城娱乐小郭| 威尼斯人娱乐场 老品牌值得您信赖| 破解百家乐真人游戏| 百家乐投注庄闲法| 百家乐真人娱乐注册| 百家乐视频聊天软件| 百家乐轮盘怎么玩| 百家乐相对策略| 百家乐走势图研究| 百家乐客户端LV| 百家乐现场投注平台| 百家乐视频游戏注册| 百家乐波音平台开户导航|