《代碼大全》三:變量
作用域
盡可能減小作用域
把對某一變量的引用集中放置。(研究人員認為把對某一變量的訪問放得越近,那麽對閱讀者精神壓力也就越小)
持久性
賦值時間 越是晚給變量賦值,代碼的靈活性便越大。
功能單一
使用數據時通常考慮的問題
一般數據
是否變量的作用域盡可能的小。
變量集中使用
每個變量有且只有一個功能
每個變量明確好定義
每個變量都用到了
全局變量
全局變量在程序中的任何地方都可以進行存取。即使使用全局變量是沒有危險的,使用它也絕非最好的編程
方法。
伴隨全局變量的常見問題
如果不加選擇的使用全局變量,或者不使用熱門就翻到很不方便,那你可能沒有充分意識到信息隱蔽和模塊化的好處。
最好盡可能使用子程序和模塊。
對全局數據的疏忽改變。
全局變量會損害模塊性和可管理性。
全局數據妨礙重新使用新的代碼。
怎麽樣降低全局數據帶來的危險
1)先使所有變量成為局部的,然後再根據需要把其中某一些改為全局。
2)區分全局和模塊。
3)建立使你一眼即可識別出全局變量的命名約定。(C# 采用微軟命名,如 mTestId)
4) 不要通過龐大的數據放入龐大的變量,同時又到處傳遞它來掩蓋你使用了全局變量的事實。
把什麽都放入一個巨大的結構,可能從字面上滿足了避免使用全局變量這準則,但這只是表面文章,事實
上這樣做,得不到任何真正模塊化的好處,如果你使用了全局便利的話,那就分開使用它,不要企圖用臃腫
的數據結構來掩蓋它。
5)用存取子程序來代替全局數據
優點:可以對數據進行集中控制,如果你以後找到了更合適的數據結構,那麽不必再每一處涉及到
數據的地方都進行修改,而只修改存取子程序就可以了,修改的影響可以被限制在存取子程序的內部。
怎樣存取子程序:將數據隱含在模塊中,編寫可以使你訪問並修改的子程序,數據所在模塊之外的子程序要求存取數據時,
應讓它通過存取子程序而不直接存取模塊內的數據。比如,假設有一個狀態變量你可以通過兩個存取子程序GetStatus(),SetStatus()來對
其進行存取操作。
不要把所有的全局數據都放在一個模塊:如果你把所有的全局數據都歸成一個大堆,並編寫對其存取的子程序,的確可以消除右
全局數據帶來的問題,但同時也拋棄了信息隱蔽和抽象數據類型所帶來的優點。編寫存取子程序之前,應
先考慮一下每一全局數據應屬於哪一個模塊,然後把這個全局數據,相應的存取子程序和其關聯的子程序
放入那個模塊。
把對數據的所有存取保持在同一抽象水平上:如果你用了某一存取子程序對某一數據進行了一項操作,那麽
對這一數據的其他操作也應通過存取子程序來實現。比如若是通過存取子程序來從數據結構總讀取數值的,那麽對該數據結構的
寫操作也應通過子程序來實現。
小結:
使用數據時通常要考慮的一些問題
I.一般數據
是否使變量的作用域盡可能的小。
是否把對變量的使用集中到了一起。
每個變量是否僅有且只有一個功能。
每個變量的含義都是明確的嘛,保證每個變量都沒有隱含的意義。
每一個變量都被用到了嘛。
II.全局變量
是否在迫不得已的情況下,才使某些變量成為全局的。
命名約定對全局,模塊,局部變量進行了區分。
是否說明了所有全局變量。(寫註釋)
程序中應該不含有偽全局變量(龐大而臃腫的數據結構)
是否用子程序代替全局數據。
是否存取子程序和數據組織層模塊而不是隨意歸成一堆的。
所有相互有聯系的存取子程序,其抽象程度都是一致的。
盡量減少變量的作用域。
把對變量的引用集中到一起,應盡量使用變量成為局部或者模塊的,避免使用全局變量。
使每個變量有且僅有一個功能。
並不是因為全局數據危險才去使用它們,之所以避免用它是因為可以用更好的技術代替它。
如果全局數據確實不可避免的話,應通過存取子程序來對其進行存取操作。存取子程序不僅具備全局
變量和功能,而且可以提供更多額功能(C# 屬性的使用)。
《代碼大全》三:變量