C語言的設計模式-接口隔離


接口隔離:

定義為客戶端不應該依賴它不需用的接口,在C語言中我們可以把頭文件看成一個模塊的接口,根據接口隔離原則也就是說這個頭文件中只能包含外部需要的接口,但在實際的項目中往往頭文件都不符合接口隔離原則。

1:內、外部接口的隔離:頭文件中通常包含了模塊內部接口(內部類型定義、內部接口聲明)和外部接口(外部接口聲明)

假設moudle模塊對外提供一個fun1接口,模塊內部實現需要定義一個結構類型,一般的實現如下:

/*moudle.h*/
typedef struct str_s str_t; struct str_s { int a; int b; }; void fun1();
/*moudle.c*/
#include "moudle.h"
void fun1() { str_t s = {0};
   TODO...
}

客戶端在使用接口的時候需要包含moudle.h文件,而該接口並不符合接口的隔離,其內部包含了客戶並不需要的一些定義。為了解決這個問題我們可以通過定義不同的頭文件來隔離接口,moudle.h定義外部的接口,moudle.inc定義內部接口

/*moudle.h*/
void fun1();
/*moudle.inc*/
typedef struct str_s str_t; struct str_s { int a; int b; };
/*moudle.c*/
#include "moudle.inc"
void fun1()
{
    str_t s = {0};
   TODO...
}

moudle.h包含外部模塊需要的接口,外部模塊包含moudle.h,moudle.inc包含內部模塊需要的接口,在模塊內部包含moudle.inc。通過查看模塊的.inc和.h文件,我們就可以清晰的理解模塊對外和對內提供了什么接口。

2:避免萬能頭文件的使用,在實際項目中我們經常可以看到一些頭文件包含了所有模塊的接口聲明,客戶端只需要包含這個頭文件就可以使用任何接口了。

/*global.h*/
#inlcude "moudle1.h"
#inlcude "moudle2.h"
#inlcude "moudle3.h"
....
#inlcude "moudlen.h"

可能帶來如下問題:

會顯著的增加編譯時間,如果項目大,可能大部分的編譯時間都花在展開頭文件(筆者一個項目測試80%左右的時間)。

不利於代碼的框架的理解,客戶端無法從包含的頭文件中清晰的看到依賴什么外部模塊。

3:如果沒有隔離接口可能會導致一些誤操作:

一個數據獲取模塊提供兩個接口分別從網絡和本地緩存獲取數據,后台管理模塊使用網絡接口定時獲取數據更新緩存,前台模塊使用緩存接口快速獲取數據顯示,由於沒有對接口隔離,后期的維護人員可能並不清楚開始的設計,在前台模塊中直接使用網絡接口來獲取數據顯示,導致界面延遲嚴重。如果一開始就把接口分離,給前台模塊提供本地緩存接口,給后台模塊提供網絡接口,就不會導致問題的出現。

轉載請注明原始出處:http://www.cnblogs.com/chencheng/archive/2013/01/06/2848296.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM