实用经验 43 同魔鬼数字说再见
魔鬼數(shù)字,也被稱為幻數(shù)。指的是那些上下文里出現(xiàn)的字面常量。魔鬼數(shù)字可以是數(shù)字,也可以使字符串。
魔鬼數(shù)字最主要的問題不是他影響程序的功能,而是他沒有抽象語義,影響程序的可讀性。當(dāng)我們閱讀和維護程序時,我們不得不一個個地搞清楚每個光禿禿的數(shù)字到底代表了什么意思。沒錯,通過這種方式我們確實也可以勉強度日。但是為了讀懂代碼,我們付出了很多的精力。但是有時我們理解的可能還不是很準(zhǔn)確。
在代碼中使用魔鬼數(shù)字(沒有具體含義的數(shù)字、字符串等)將會導(dǎo)致代碼難以理解,應(yīng)該將數(shù)字定義為名稱有意義的常量。將數(shù)字定義為常量的最終目的是為了使代碼更容易理解,所以并不是只要將數(shù)字定義為常量就不是魔鬼數(shù)字了。如果常量的名稱沒有意義,無法幫助理解代碼,同樣是一種魔鬼數(shù)字。在個別情況下,將數(shù)字定義為常量反而會導(dǎo)致代碼更難以理解,此時就不應(yīng)該強求將數(shù)字定義為常量。 我們看下面這段代碼:
//這里的一些10分別代表什么意思??class Portfolio{//...Contact *contracts_[10];char id_[10];};......for (int i = 0; i < 10; ++i)...魔鬼數(shù)字的另一個不那么顯而易見的壞處就是它會以意想不到的方式降低它所代表的類型的精度。例如:4000, 它實際類型是平臺相關(guān)的。
另一個字面常量帶來的潛在威脅來源于它們沒有地址。
給幻數(shù)起一個名字。作為一個指導(dǎo)原則,除了0和1之外,程序里出現(xiàn)的任何數(shù)大概都可以算作幻數(shù),它們應(yīng)該有自己的名字。例如,下面這個例子:
class Portfolio {//...enum {maxContracts = 10, idLen = 10};Contact *contracts_[maxContracts];char id_[idLen];};在其所在作用域有著明確含義的枚舉常量,有著不占空間,也沒有任何運行期成本的巨大優(yōu)點。
把數(shù)定義為常數(shù),不要定義為宏。C語言的傳統(tǒng)方式是使用#define行來對付魔鬼數(shù)字。C語言預(yù)處理程序是一個強有力的工具,但是它又有些魯莽。使用宏進行編程是一種很危險的方式,因為宏會在背地里改變程序的詞法結(jié)構(gòu)。我們應(yīng)該讓語言去做正確的工作(C預(yù)處理命令本身不是C語言的組成部分)。
在c/c++里,整數(shù)常數(shù)可以用枚舉語句聲明。在C++里,任何類型都可以使用const聲明的常數(shù):
const int MAXROW = 24, MAXCOL = 80;C語言也有const值,但是他們不能用作數(shù)組的界。這樣,enum就是C中唯一可用的選擇了。而C++無此限制,你可以盡情使用const值,享受const值給你帶來的方便。
請謹(jǐn)記
- 避免在程序中出現(xiàn)魔鬼數(shù)字,因為這樣可提高程序的可讀性
總結(jié)
以上是生活随笔為你收集整理的实用经验 43 同魔鬼数字说再见的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android笔记25】Android
- 下一篇: 【教程】VMware创建虚拟机教程