本文**:
介面隔離:
定義為客戶端不應該依賴它不需用的介面,在c語言中我們可以把頭檔案看成乙個模組的介面,根據介面隔離原則也就是說這個標頭檔案中只能包含外部需要的介面,但在實際的專案中往往標頭檔案都不符合介面隔離原則。
1:內、外部介面的隔離:標頭檔案中通常包含了模組內部介面(內部型別定義、內部介面宣告)和外部介面(外部介面宣告)
假設moudle模組對外提供乙個fun1介面,模組內部實現需要定義乙個結構型別,一般的實現如下:
/*moudle.h*/
typedef struct str_s str_t;
struct str_s
;void fun1();
/*moudle.c*/
#include "moudle.h"
void fun1()
; todo...
}
客戶端在使用介面的時候需要包含moudle.h檔案,而該介面並不符合介面的隔離,其內部包含了客戶並不需要的一些定義。為了解決這個問題我們可以通過定義不同的標頭檔案來隔離介面,moudle.h定義外部的介面,moudle.inc定義內部介面
/*moudle.h*/
void fun1();
/*moudle.inc*/
typedef struct str_s str_t;
struct str_s
;
/*moudle.c*/
#include "moudle.inc"
void fun1()
; 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:如果沒有隔離介面可能會導致一些誤操作:
乙個資料獲取模組提供兩個介面分別從網路和本地快取獲取資料,後台管理模組使用網路介面定時獲取資料更新快取,前台模組使用快取介面快速獲取資料顯示,由於沒有對介面隔離,後期的維護人員可能並不清楚開始的設計,在前台模組中直接使用網路介面來獲取資料顯示,導致介面延遲嚴重。如果一開始就把介面分離,給前台模組提供本地快取介面,給後台模組提供網路介面,就不會導致問題的出現。
介面與工廠(設計模式)
介面是實現多重繼承的途徑,而生成遵循某個介面物件的經典方式就是工廠方法設計模式。這種方式與直接呼叫建構函式的不同,我們在工廠物件呼叫的是建立方法,該工廠的方法將生成介面的某個實現類的物件。理論上,通過這種方式,我們的 將完全與介面的實現分離,這就使得我們可以透明地將某個實現替換為另乙個實現。下面我們...
C語言設計模式
專案的成功是偶然的,但是專案的失敗卻有很多原因,管理混亂 需求混亂 設計低劣 質量差 測試不到位等等。就軟體企業而言,沒有比優秀的文化和出色的企業人才更重要的了。從軟體設計層面來說,一般來說主要包括三個方面 1 軟體的設計受眾,是小孩子 老人 女性,還是專業人士等等 2 軟體的基本設計原則,以人為本...
C語言設計模式 模板模式
模板方法模式是基於繼承的 復用基本技術,可以將相同的 放在父類中,而將不同的方法實現放在不同的子類中。在模板方法模式中,準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來讓子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現...