ADT黑盒設計——C的抽象數據類型的設計與實現

C可以用於設計和實現抽象數據類型(ADT,abstract data type),因爲他可以限制函數和 數據定義的作用域。

這個技巧也被稱爲黑盒(black box )設計。

抽象數據類型的基本思想:模塊具有功能說明;模塊所執行的任務;接口說明;模塊的使用方法;
 模塊的用戶並不需要知道模塊實現的任何細節,並且
除了已經定義好的那些接口以外, 用戶不能一任何方式訪問模塊任何內容

   限制對模塊的訪問是通過static關鍵字的合理使用實現的,他可以限制對那些並非接口的函數和數據的訪問。
  例如:一個用於維護一個地址/電話號碼列表的模塊。模塊必須提供函數,根據一個制定的名字查找地址和電話號碼。

但列表存儲的方式依賴於具體的實現,並且這個信息爲模塊所私有客戶並不清楚,也不必清楚。

注意:
注意頭文件中不可以放變量的定義!!!一般情況下頭文件中只放變量的聲明,因爲頭文件要被其他文件包含(即#include),如果把定義放到頭文件的話,就不能避免多次定義變量,C++不允許多次定義變量,一個程序中對指定變量的定義只有一次,聲明可以無數次。不過有三個例外,一下三中實體的定義也可放到頭文件中。

1.值在編譯時就已知的const 變量的定義可以放到頭文件中 如:const int num(10);

2.類和結構體類型的定義可以放到頭文件中

3.inline 函數這三個實體可以定義在多個源文件中,只要在每個源文件中的定義相同。 參考------c++ primer

  是時間該看一個例子的時候了,下面的程序說明了這個模塊的一種可能的實現方法。

頭文件定義了一些由客戶使用的接口。

  /*filename : addrlist.h*/
  /*
  *地址模塊的聲明
  */
  
  /*
  *數據特徵
  *各種數據的最大長度(包括結尾的NUL字節)和地址的最大數量
  */
  #define NAME_LENGTH 30
  #define ADDR_LENGTH 100
  #define PHONE_LENGTH 11
  #define MAX_ADDRESSES 1000
  
  /*
  *接口函數
  *根據給出名字,查找對應的地址
  */
  char const *
  lookup_address(char const *name);
  /*給據給出的名字查找對應的電話號碼*/
  char const *
  lookup_phone(char const *name);

=================================================================================================

  /*file name : addrlist.c*/
  /*用於維護一個地址列表的抽象數據類型*/
  #include "addrlist.h"
  #include <stdio.h>
  
  /*
  *每個地址的三個部分分別保存於三個數字化的對應元素中
  *
  */
  staticchar name[MAX_ADDRESSES][NAME_LENGTH];
  staticchar address[MAX_ADDRESSES][ADDR_LENGTH];
  staticchar phone[MAX_ADDRESSES][PHONE_LENGTH];
  
  /*
  *在數組中查找一個名字返回查找的位置的下標
  *如查詢不到則直接返回-1
  */
  staticint
  find_entry(char const *name_to_find)
  {
   int entry;
   
   for(entry = 0; entry < MAX_ADDRESSES;entry ++)
    if(strcmp(name_to_find,name[entry]) == 0)
     return entry;
    return -1;
  }
   /*
   *給定一個名字查找並返回對應的地址
   *如果名字沒有找到直接返回一個NULL指針
   */
   char const *
   lookup_address(char const *name)
   {
    int entry ;
    
    entry = find_entry(name);
    if(entry == -1)
     return NULL;
    else
    return address[entry];
   }
   /*
   *根據給定的名字查找並返回對應的電話號碼,如名字不存在則返回NULL指針
   */
   char const *
   lookup_phone(char const *name)
   {
    int entry ;
    entry = find_entry(name);
    if (entry == -1)
     return NULL;
    else
     return phone[entry];
   }
   
   這個例子可以很好的說明黑盒的功能。黑盒通過規定特定的接口,來提供給外部用戶的訪問
在這個例子中,接口函數是lookup_address和lookup_phone。用戶不能直接訪問和模塊實現有關的
數據,如數組或輔助函數find_entry,因爲這些內容被聲明爲static

這種黑盒的概念使實現細節與外界隔絕,這就消除了用戶試圖直接訪問這些實現謝姐的誘惑,
這樣訪問模塊唯一可能的方法就是通過模塊所定義的接口。

這種開發模式是非常重要的,尤其是在大型項目規劃中,很多時候我們只考慮接口問題,
其中具體的實現細節我們可以暫不考慮,一提高團隊整體合作開發的速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章