全局變量永遠是不受歡迎的,因爲它會帶來太多的問題,所以,諸如Java這樣的程序設計語言乾脆摒棄了全局變量。一旦我們有機會面對全局變量,想都不要想,幹掉它。
if (IDLE == g_status) { ... }
那個g打頭的傢伙就是全局變量,它就是我們的靶子。第一直覺,我們不要直接訪問全局變量,那就用函數把它封裝起來:
int getCurrentStatus() { return gStatus; }
於是,代碼變身了:
if (getCurrentStatus() == IDLE) { ... }
把變量封裝成函數,從某種角度說,這是一種進步。但我想說,這還不夠。這只是一種簡單的封裝,本質上來說,這與直接暴露數據差別不大,我們需要更好的封裝,通常的做法是封裝出行爲。行爲從哪來,從實際需求來。
就以上面這段代碼爲例,我們封裝了status,其實,它的目的是爲了與IDLE狀態相比較,這就是一種行爲,我們可以這樣封裝:
bool isCurrentStatus(int status) { return status == g_status; } if (isCurrentStatus(IDLE)) { ... }
還有一種修改方式,既然IDLE是一個固定的常量,索性把它也隱藏起來:
bool isIdle() { return IDLE == g_status; } if (isIdle()) { ... }
實際上,這種封裝出行爲的方式不僅僅適用於全局變量,把數據拿出來再用的情形也是經常可以見到的:
if (machine.getStatus() == IDLE) { ... }
封裝的方式同上面一樣,這裏選擇一種實現:
class Machine { ... bool isIdle() { return status == IDLE; } } if (machine.isIdle()) { ... }
封裝,就得封裝出個行爲來。
本文轉自infoq:http://www.infoq.com/cn/news/2012/05/ugly-code-11