封裝 —— 保護程式的隱私
, 不該讓呼叫者知道的事,堅決不能暴露出來。
具體實現細節做法:
隱藏內部函式
隱藏內部函式的做法:
禁用全域性變數
當把程式從單執行緒該為多執行緒,對併發的程式產生不利影響。更重的是直接使用全域性變數,會造成呼叫者和實現者之間的耦合。
——— 學習摘錄自《系統程式設計師成長計畫》
像c++具有oop語法糖的程式語言中可以直接使用虛函式/純虛函式來隔離變化。
對於c語言沒有這樣的語法糖。
而c語言中也有隔離變化
的法寶 ----函式指標
。可以當作c語言的虛函式。
不止在oop起大作用,在簡單的程式中也可以很好的起到隔離變化的作用。
簡單的隔離變化示例:檢測風扇兩種狀態
剛開始的函式:
void
fand_detect
(void)}
else
break;}
case fan_is_stop:
}else
break;}
}}
可以看出上述程式兩種狀態下的檢測**是類似,變化的地方有if (fan_detect_input() == fan_run)
,fstatus = fan_is_stop;
senderrcode(ccu_fan_is_stop)
;
使用函式指標隔離變化
,修改程式如下:
static
void
_fanisstopcallback
(void
)static
void
_fanisruncallback
(void
)static
void
_fan_detect
(enum fanlevel level, uint16_t maxcount,
void
(*callback)
(void))
}else
}void
fand_detect
(void
)case fan_stop_state:
}}
避免了寫兩段類似的重複的程式。
抽象fan:
struct abstractfan
;static
inline
void
_abfan_detect
(struct abstractfan *thiz, uint8_t level, uint16_t maxcount)
else}}
else
}static
inline
void
abfan_detect
(struct abstractfan *thiz)
case fan_is_stop:}}
static
inline
void
abfan_setstatus
(struct abstractfan *thiz, uint8_t status)
fan類:
struct fan
//構建注入依賴的抽象介面
static
inline
void
fan_init
(struct fan *thiz,
struct abstractfan *f)
static
inline
void
fan_dectect
(struct fan *thiz)
例項化偽**:
static
void
_detect
(struct abstractfan *thiz, uint8_t *status)
static
void
_run
(struct abstractfan *thiz)
static
void
_stop
(struct abstractfan *thiz)
static
struct abstractfan abfan =
;static
struct fan fan;
void
main
(void
)}
…emm…有點複雜…微控制器上還是用函式指標當函式引數的方法隔離好 OOP 物件和封裝
面向過程和物件導向的區別是 面向過程的核心是函式,以功能為中心,實現了函式級別的 重用。物件導向的核心是封裝了屬性和方法 行為 的類,以資料為中心,實現了類級別的 重用,物件導向因為採用了類,所以具有繼承和多型特徵,可以進一步重用 和簡化程式設計,而面向過程沒有。物件導向設計的過程就是抽象的過程,分...
封裝變化(三)
設想這樣乙個需求,我們需要為自己的框架提供乙個負責排序的元件。目前需要實現的是氣泡排序演算法和快速排序演算法,根據 面向介面程式設計 的思想,我們可以為這些排序演算法提供乙個統一的介面isort,在這個介面中有乙個方法sort 它能接受乙個object陣列引數。對陣列進行排序後,返回該陣列。介面的定...
封裝變化 Part Three
filed under design pattern bruce zhang 6 35 pm 設想這樣乙個需求,我們需要為自己的框架提供乙個負責排序的元件。目前需要實現的是氣泡排序演算法和快速排序演算法,根據 面向介面程式設計 的思想,我們可以為這些排序演算法提供乙個統一的介面isort,在這個介面...