封裝全局變量

全局變量永遠是不受歡迎的,因爲它會帶來太多的問題,所以,諸如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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章