天天看点

魔数(代码大全第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(岩浆流)。

继续阅读