OOP封裝 隔離變化

2021-10-14 15:21:11 字數 2411 閱讀 5731

封裝 —— 保護程式的隱私, 不該讓呼叫者知道的事,堅決不能暴露出來。

具體實現細節做法:

隱藏內部函式

隱藏內部函式的做法

禁用全域性變數

當把程式從單執行緒該為多執行緒,對併發的程式產生不利影響。更重的是直接使用全域性變數,會造成呼叫者和實現者之間的耦合。

——— 學習摘錄自《系統程式設計師成長計畫》

像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,在這個介面...