导致程序崩溃的代码显然是错了,但崩溃并不是衡量程序问题的唯一指标。代码里的通常会隐藏一些漏洞或不可读的代码
代码的坏味道指的是一种揭示潜在问题的代码模式。这种坏味道并不意味着一定存在问题,但它说明该优化程序的时候了。
几种常见的代码坏味道:
- 重复代码
- 魔数
- 注释掉的代码和死代码
- 打印调试
- 带有数字后缀的变量
- 本该是函数或者模块的类
- 嵌套列表解析式
- 空的except块和糟糕的错误信息
坏味道代码带来的问题
1、重复代码
重复的代码之所以被认为有问题,是因为它使修改代码变得困难:对重复代码的一个副本做出修改,就必须对重复代码的每一个副本都做出修改。如果你忘了在某个地方进行修改,或者对不同副本进行了不同的修改,程序可能就会出错。重复代码长期维护来说是一种噩梦。
2、魔数
魔数没有表明数字的目的,降低了代码的可读性,使其难以维护,而且容易出现难以察觉的拼写错误。比如下面的例子;
expiration = time.time() + 604800
这段代码中的数字,我们就不知道为何意。
3、注释掉的代码和死代码
注释过的代码和死代码都是代码的坏味道,因为它们会形成误导,让程序员认为这些代码是程序的可执行部分。
4、打印调试
打印调试是指在程序中临时调用print()显示变量的值,然后重新运行程序的做法。很多人误认为打印调试快速简单,但实际上为了获得用以修复错误的信息,通常需要多次重复运行程序。这种调试效率实际很低。
5、带有数字后缀的变量
这样的变量名,数字后缀并不能很好地描述这些变量所包含的内容以及它们之间的差异。
6、嵌套列表解析式
列表解析式是创建复杂列表值的一种简单方法。嵌套列表解析式(或者集合/字典解析式)在少量的代码中包含了大量的复杂性,降低了代码可读性。
优化坏味道的方法
1、重复代码
解决重复代码的方法是去重,简单地说,通过把代码放在一个函数或者循环中,使其在代码中只出现一次。
2、魔数
解决方法是使用常量替代魔数。
3、注释掉的代码和死代码
需要删除它们,并使用版本控制系统,比如使用Git或者Subversion来跟踪变化。
4、打印调试
解决方法是利用调试器或者为程序设置日志文件。使用调试器可以逐行运行程序中的代码并检查所有变量,可能看起来这么做比简单地插入print()调用要慢,但从长远看更能节省时间。
日志文件可以记录程序的大量信息,能够用来比较一次运行产生的信息和以往运行的信息。
5、带有数字后缀的变量
如果在一系列的变量中使用数字后缀,那么可以考虑用某种数据结构代替它们,比如列表或字典。
6、嵌套列表解析式
最好的办法是把列表解析式扩展到一个或者多个for循环中。
最后,我们要正视代码的坏味道,有些代码的坏味道根本不是真正的坏味道。举两个例子,
1、函数应该仅在末尾处有一个return语句。
2、函数最多只能有一个try语句。
以上这些都算不上坏味道,因此我们在实际工作中,要识别坏味道。