1、盡量用局部變量替代全局變量。如果用局部變量能實現功能,最好用局部變量。
2、在函數僅僅只是要用到某個全局變量,而無需改動時,就將全局變量通過形參傳遞進來,變成局部變量使用。并在定義時使用const。這是避免全局變量在函數中被意外的改動。如在判斷語句中將'=='誤寫成'='。這時首先因為在函數內的是局部變量所以即使出錯也不會影響全局變量和其他函數或模塊。其次因為定義的是const類型,當發生意外改動時,編譯器會發出錯誤信息或警報,這也就是讓你的程序自動糾錯。這種情況應發生在對模塊內的全局變量的調用,而對于其他模塊的全局變量應通過模塊接口調用。
3、中斷中使用的全局變量,在其他函數內要使用時一定要進入臨界區(也就是關閉中斷)。如果是使用操作系統的話,則在所有使用到與其他任務共享的全局變量的地方都要進臨界區。
4、對于僅在某個函數內使用的全局變量就用靜態局部變量替代。
5、應盡量避免直接操作或調用其他模塊的變量。需要調用或修改其他模塊的變量時,可以通過那個模塊提供的操作接口函數進行操作。比如某個模塊有一個全局的計數值Count,則可以提供函數接口:GetCount()、SetCount()或ReloadCount()。這樣一來,其他模塊要調用Count時就通過這些指定的函數接口。這樣可以降低模塊間的耦合程度。另外如果嫌接口用函數實現過于復雜或是影響速度,則可以用帶參數的宏定義實現。如:
#define GetCount() (Count)
#define SetCount(num) (Count=(num))
#define ReloadCount() (Count=0)
這樣,使用時與函數調用一樣,但沒有函數調用時的開銷。另外,功能變化是可以將宏定義改成函數,而無需改動調用語句。
6、每個模塊內的全局變量應該用靜態全局變量,一來其他模塊無法直接調用這些變量;二來命名空間不會重疊,在實現一個模塊時無需考慮某個全局變量的名稱是否已被其他模塊使用。如在模塊A中定義靜態變量 static unsigned char Count;在B模塊中,仍可以定義靜態變量 static unsigned char Count;這兩個Count不會相互影響,但是如果定義的是全局變量則不然。
7、模塊間的耦合性就是指當修改其中某個模塊時會影起其他模塊運行結果發生不可預料的變化。如果模塊間是通過直接調用對方內部的全局變量來實現交互,則兩個模塊間的耦合性將會變得復雜而且難以控制。而模塊間的交互通過一個統一的接口函數來實現,使得模塊都無需知道對方模塊內部的具體實現(這也就是面向對象里面的封裝)。當某個模塊內的實現發生改寫或升級時,只要確保模塊接口不變即可。這就大大降低兩模塊間的耦合。在規劃設計模塊時就應認真考慮好模塊的接口,以及與其他模塊的調用關系。所以要記住編程原則:針對接口編程,而不是針對實
現。
8、函數的功能要單一,也就是高內聚性。如果某個函數需要調用很多個全局變量,則說明函數的內聚性不夠高,可以考慮將函數拆分成幾個功能更單一的函數。
9、要記住編程是一種平衡的藝術。沒有程序可以做到十全十美,省空間、速度快、易擴展、易維護、低耦合、功能強大這些是不可能同時兼得的。如要提高程序的可維護性,就必須在性能方面(空間和速度)做出一點犧牲。至于如何平衡,就要看項目的具體要求了。
|