C語言--“高內聚,低耦合”編程思想

1、定義

高內聚低耦合,是軟件工程中的概念,是判斷設計好壞的標準,主要是面向對象的設計,主要是看類的內聚性是否高,耦合度是否低。

2、概念

耦合性:也稱塊間聯繫。指軟件系統結構中各模塊間相互聯繫緊密程度的一種度量。模塊之間聯繫越緊密,其耦合性就越強,模塊的獨立性則越差。模塊間耦合高低取決於模塊間接口的複雜性、調用的方式及傳遞的信息。

內聚性:又稱塊內聯繫。指模塊的功能強度的度量,即一個模塊內部各個元素彼此結合的緊密程度的度量。若一個模塊內各元素(語名之間、程序段之間)聯繫的越緊密,則它的內聚性就越高。

所謂高內聚是指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。

對於低耦合,粗淺的理解是:一個完整的系統,模塊與模塊之間,儘可能的使其獨立存在。也就是說,讓每個模塊,儘可能的獨立完成某個特定的子功能。模塊與模塊之間的接口,儘量的少而簡單。如果某兩個模塊間的關係比較複雜的話,最好首先考慮進一步的模塊劃分。這樣有利於修改和組合。

3、如何實現

c語言面向過程,通常使用回調的方法。c++面向對象,要實現高內聚、低耦合,需要使用接口技術。

要做到高內聚低耦合,設計模塊時需要做到:
      (1)各個模塊之間的功能必須明確;
      (2)各個功能模塊間實現的功能不可以有交叉;
      (3)不允許出現模塊間的相互調用;
      (4)如果必須出現模塊間調用,那麼只允許單向調用,即A可以調用B,B不可以調用A。

      C語言中常見的形式(1)--函數接口:

儘量避免使用全局變量,不使用全局變量那又如何進行模塊間的數據傳遞呢?例如在別的模塊中(例如LED顯示)想要知道按鍵的狀態或設置按鍵的狀態,一般的思想是不是定義一個keyFlag全局變量呢?然後再LED顯示模塊和按鍵模塊中都去直接操作keyFlag,這樣就提高了模塊間的耦合度;

這樣做還有很多弊端,假設哪天需要按鍵模塊引入到別的工程中使用,但是工程中已經定義了全局按鍵變量爲keyStatus或是沒有定義,那這個時候我們又怎樣去獲取按鍵的狀態呢?是改全局名稱或重新定義全局變量,是不是都很麻煩?

所以在按鍵模塊中定義兩個函數供外部調用就可以了:

u8_t  get_key_status(void)
{
    return  key_flag;
}

void  get_key_status(u8_t  flag)
{
    key_flag = flag;
}

需要知道按鍵狀態的模塊只需要調用以上兩個函數就可以了,並不需要關心按鍵模塊中定義的按鍵狀態的變量名是什麼,這樣就減少了全局變量的使用!

C語言中常見的形式(2)--函數指針:

軟件通常有後臺日志的記錄功能,用log函數實現,主業務用business函數表示:

void log()
{
	printf("Logging...\n");
}


void business()
{
	while(1)
	{
		sleep(1);
		printf("Deal Business...\n");
		log();
	}
}


int main()
{
	business();
	return 0;
}

現在需要對後臺日誌功能進行升級,該如何實現?

一般人的想法是這樣:再寫一個函數log2,然後business中log改爲log2,這樣不就可以了?

但是你想想,主業務代碼怎能輕易改動?因爲一個小小的功能而要改變主要的業務代碼,這樣不是顯得智商很捉急?

換一種思路,使用回調:

#include <stdio.h>
#include <unistd.h>
 
void log1()
{
	printf("1 Logging...\n");
}
 
void log2()
{
	printf("2 Logging...\n");	
}
 
void business( void (*f)() )
{
	while(1)
	{
		sleep(1);
		printf("Deal Business...\n");
		f();
	}
}
 
int main()
{
	business(log1);
	return 0;
}

business函數接受一個函數指針,該指針指向的函數沒有參數,返回值爲void,符合log函數的原型。business中只要f()即可調用相應的函數。

當需要使用log1時,向business傳log1、要使用升級後的log2時,傳入log2即可。

這樣做就business函數並不需要所傳入數據的變化,只關心自身的功能就行,具體傳入什麼數據待用戶調用的時候讓用戶決定,這樣就提高了函數的通用性和靈活性。

(PS:https://blog.csdn.net/scottly1/article/details/34074723https://blog.csdn.net/Chum_yang/article/details/82835610感謝這兩位博主的思想和總結,因圖時間,引用了他們的案例,表示感謝~~)

 

 

 

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