C語言的設計模式 單一職責

2022-07-16 21:45:18 字數 1925 閱讀 3053

單一職責原則:

通常的定義是只專注於做一件事和僅有乙個引起它變化的原因。對於介面、實現、函式級別往往我們比較容易關注單一職責,大家談的也比較多,但對於返回值、引數可能不會有太多的人關注。但往往就是這些不符合單一職責原則的設計可能導致一些很難發現的bug。看看下面這段**:

pbuf = (byte*)realloc( pbuf, size);

if( pbbuf !=null )

可能很多人一眼看上去並沒有什麼問題,先讓我們看看這個庫函式的定義:

函式簡介

原型:extern

void *realloc(void *mem_address, unsigned int

newsize);

語法:指標名=(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)。功能:先判斷當前的指標是否有足夠的連續空間,如果有,擴大mem_address指向的位址,並且將mem_address返回,如果空間不夠,

先按照newsize指定的大小分配空間,將原有資料從頭到尾拷貝到新分配的記憶體區域,而後釋放原來mem_address所指記憶體區域,同時

返回新分配的記憶體區域的首位址。即重新分配儲存器塊的位址。

返回值:如果重新分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

正常情況下pbuf是新空間的位址沒有任何問題,但我們考慮下如果分配失敗了呢,pbuf會被賦值成null,pbuf原指向的位址空間就沒有指標指向了,造成了記憶體洩露。這種問題往往很難定位。熟悉realloc機制的人可能對這個問題很不屑,認為高手不會犯這些錯誤。但我們可以想下有沒有辦法設計乙個好的介面讓菜鳥也寫出不會出錯的**呢。假設這個庫函式的介面是這樣的呢:

函式簡介

原型:extern

flag realloc(void **ppmem_address, unsigned int

newsize);

語法:返回值 =(資料型別*)realloc(要改變記憶體大小的指標名,新的大小)。

返回值:如果重新分配成功則返回指true(ppmem_address儲存新分配空間位址),否則返回false(ppmem_address儲存老空間位址)。

相信任何乙個使用這個介面的人都會寫出下面的**:

if( true ==realloc( &pbuf, size))

else

為什麼有人會犯pbuf = (byte*)realloc( pbuf, size);這種錯誤?因為他只關注了realloc返回值是乙個位址,沒有關注該返回值還有錯誤識別的功能,換句話來說這個庫函式的返回值不具備單一職責,導致了可能的錯誤使用。如果使用改進後的介面,因為返回值只有乙個判斷分配成功與否的功能,相信沒有人還會用錯。

我們再仔細看看我們新的介面,總覺得似乎有什麼地方還是不對,看到void **ppmem_address可能要想一下明白,這個引數既是入參又是出參,它承擔了原始位址的輸入和新位址的輸出,這不又違反了單一職責嗎?好吧我們再改進一下:

函式簡介

原型:extern flag realloc(void *pin_mem_address,void **ppout_mem_address, unsigned int

newsize);

語法:返回值 =(資料型別*)realloc(要改變記憶體大小的指標名,新的記憶體指標名,新的大小)。

返回值:如果重新分配成功則返回指true,否則返回false。

現在這個介面就算乙個初次看到的人也應該大概知道什麼意思,相信也不會寫出什麼帶bug的**,因為函式的引數、返回值都具有單一的功能,通過返回值來判斷分配成功與否,通過出參來獲取位址。一切看起來都很清晰。

在c庫中還有很多類似的函式,如果當初的設計人員能多考慮單一職責,也許現在的系統中就會少了很多隱藏的bug,介面永遠是給別人使用的,一定要把使用者當成傻瓜,也許才能設計出好的介面。

設計模式 單一職責原則

單一職責原則解釋 就乙個類而言,應該只有乙個引起它變化的原因。我們有時候在做程式設計的時候,很自然而然的會給乙個類增加這樣那樣的功能,比如 我們要做乙個 會給這樣乙個default.aspx.cs後台檔案加入演算法的 資料庫訪問的sql語句,業務邏輯的 等等都寫到這個類檔案中,這就意味著,無論任何需...

設計模式 單一職責原則

單一職責原則srp single responsibility principle,又稱單一功能原則,規定乙個類應該只有乙個發生變化的原因。所謂職責是指類變化的原因。如果乙個類有多於乙個的動機被改變,那麼這個類就具有多於乙個的職責。而單一職責原則就是指乙個類或者模組應該有且只有乙個改變的原因。如果乙...

設計模式 單一職責原則

維根斯坦說世界可以分解為事實,而事實又分解為原子事實,原子事實 由物件組成 不可再分.那這裡很明顯的就是我們無法有乙個標準來確定啥是原子事實.有些人覺得乙個原子事實實際上可以再分,另一些人可能覺得不可分。架構不斷 srp single responsibilities principle 的定義 就...