魔數(代碼大全第12章:基本數據類型)

        
        魔數,有時候是神祕數字(Magic Number),讓你困惑激動,可能會像瓊斯一樣,通過III、VII、X去探險;更多時候則是魔鬼數字(Devil Number),讓你痛不欲生,可能會和沃爾特一樣,對23產生病態。
        本文列出,自己以前常用的魔數,及改進方式。
        1. 數組長度
        常用:最常用的是定義一個臨時字符數組,如char a[8],用於存儲字符串。一開始由於用完就扔,怎麼方便怎麼來。
        後果:後面改變功能後,會用來賦值或做其他的,如循環,sprintf,strcpy,memcpy,由於忘記考慮有效長度,很容易造成“段錯誤”(Segmentation fault)和其他神祕錯誤。
        改進:C++中字符串常規使用string,不用char;其他類型數組常用vector。特殊的數據處理中必須用char時,用宏定義或常量定義數組長度。拷貝時用snprintf,strncpy,memncpy,使用宏定義、常量定義的長度,避免重複魔數,或超出範圍。
       
        2. 公式係數
        常用:有的變量,使用公式來計算,公式中使用了很多魔數。
        後果:出現問題時,不知道是公式錯誤,還是公式參數錯誤。
        改進:公式中有的係數本身就是魔數,沒有合適的描述。建議可直接使用魔數,但做好詳細具體註釋。註釋應包括:添加人,日期,公式來源,公式意義,並強調魔數不能改。作爲有瑕疵,也有“熊出沒”告示牌的代碼存在。
       
        3. 返回值
        常用:受linux應用程序影響,自己編寫或第3方的一些函數或程序的返回值,0表示正常,-X表示錯誤。
        後果:有-1或0的魔數,與常規應用程序返回不同,引起歧義。
        改進:一是,應用再封裝一層接口,把-1、0等當成內部實現,註釋清楚。二是直接使用,但每個使用的魔數,必須做好詳細具體的註釋,包括添加人,返回值意義,爲什麼如此使用,還有其他哪些值。作爲例外但有特殊理由說明的代碼存在(最好告知參考資料)。
       
        4. 其他
        用法:因爲懶惰,完全沒有理由的魔數。如文件名長度、數據緩衝區大小、等待時間、失敗重啓次數等等。
        後果:只知道這裏有個數值,改動了會錯誤,爲什麼,不知道,只能保持。形成岩漿流(Lava Flow)代碼.
        改進:使用配置項、變量、常量、枚舉、宏定義等,替換。
       
        5. 其他:神祕字符,神祕字符串,神祕邏輯通道,神祕函數...
        常用:界面中的顯示字符在代碼中硬編碼;選項的參數在代碼中指定;一個if中無數的==、||、!=、<、>組成的邏輯迷宮;七、八層縮進做成的子母迷糊套等等。。。
        後果:通常都是由於匆忙和懶惰造成,種下這個瓜,會得到回報的。不是不報,時候未到。
        改進:拆分和組織是不二法門。拆分到數據庫、配置文件、其他文件、其他函數中;通過過程,模式,註釋,文檔,把它們的關係建立起來,順藤摸瓜,瓜熟蒂落。
       
        寫代碼不是寫小說
        我們從小看小說:情節跌宕起伏、懸念層出不窮、角色千奇百怪、道路峯迴路轉、兵器匪夷所思、修煉天人合一。我們上學練寫作文:修辭手法、文散形不散、除詩歌外不限、要有積極向上的中心思想、不要流水賬。
        我們工作寫代碼、寫工作日誌:具體、量化、可讀;不要二義性,不要驚喜,要KISS,要八股文。要如同財務般精確的流水賬。
        
         參考資料
        1. 代碼大全,第12章:基本數據類型。
        2. 反模式,5.4Lava Flow(岩漿流)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章