|
发表于 2014-9-29 10:21:19
|
显示全部楼层
將對全局變量的訪問,替換成用函數訪問,或者是放入結構體,這都無法從根本上解決問題。
等一下,甚麼問題?使用全局變量會導致甚麼問題?
看看StackOverFlow的人怎麼回答。
The problem with global variables is that since every function has access to these, it becomes increasingly hard to figure out which functions actually read and write these variables.
To understand how the application works, you pretty much have to take into account every function which modifies the global state. That can be done, but as the application grows it will get harder to the point of being virtually impossible (or at least a complete waste of time).
作爲一個長期維護寫得超爛的(臺灣人寫的)代碼的人,我可以描述下,當你發現機器運行不正常,是因爲有某箇全局變量被改寫,而你嘗試用全局搜索的方法,來找出改寫這箇全局變量的地方,卻發現修改這箇全局變量的地方竟然有500處的時候,是甚麼感受。哦,或者我不用舉例,你都已經明白了,因爲至少你是一個程序員。
考慮一下以下的例子。
- int cola_left;
- void display_how_many_cola(void)
- {
- printf("%d", cola_left);
- }
- void count_cola(void)
- {
- cola_left = count();
- }
复制代码
作爲一部自動販賣機,無論是顯示屏,還是內部的點貨員,都需要知道而今還剩下多少瓶可樂。如果你的功能僅限於此,那麼,很好,程序思路很清晰。但是如果日後,機器內部新增了一個促銷員,他根據庫存來決定售賣價格,這時就多一個人要瞭解這箇全局變量了。如果生意做大了,開始實行會員制,會員可以在缺貨的情況下仍然買到可樂,這時是不是需要增加一個人,去留意庫存情況?突然有一日,一個會員嚮你抱怨,說他買不到可樂。你質問會員管理員,他卻說“我在前一秒,明明見到還有1瓶可樂的,不知道怎麼的就不見了。”幾經週轉,纔發現是某個促銷員賣掉了這瓶可樂。雖然最終你仍然可以查出,但這不是很曲折麼?
這就是問題:如何纔能使你更輕鬆地檢查出,是誰在攪鬼,和怎麼防止日後有更多的人去搗亂。
- int salesman(int cola_on_sale)
- {
- return bottles_sold;
- }
- void vip_manager(int * cola_reserve)
- {
- }
- void main(void)
- {
- int cola = 10;
- while(1)
- {
- vip_manager(&cola);
- if(cola > how_many_vips)
- {
- cola -= salesman(cola - how_many_vips);
- }
- }
- }
复制代码
這樣做,不但減少了全局搜索cola這箇變量的結果,而且還從根本上限制了促銷員的權利。
當然,這衹是其中一種方法。但無論你做甚麼,都應該是讓你的程序變得更加容易讀,和更容易在出問題時找到原因。
請記住,全局變量爲甚麼不好。在你的工程裏,這種壞處存不存在。出問題時,需要多少時間去分析。和你可以通過甚麼途徑,去做得更好。 |
|