前言
代码的坏味道出自马丁.福勒《重构-改善既有代码的设计》一书,说明你的代码不够好,需要重构才能让代码变成干净的代码。下文主要介绍常见的一些代码坏味道,而这些坏味道,不限定于某种语言。也就是说任何一种语言都可能出现下列的代码坏味道。
神秘命名(Mysterious Name)
看电影和看小说我们喜欢看一些神秘的文字猜测,喜欢玩一些文字游戏,但如果在阅读代码时,这样的体验就不太好了。我相信,对于一个开发人员来说,对于一个从命名上完全看不出这个类或方法是干什么的时候,那是有多么的痛苦。
整洁代码最重要的一环就是要一个好的名字,所以我们会深思熟虑给变量、方法、类、模块变名,使它们能够清楚的表明自己的功能和用法。就比如我们在MVC架构中,*DAO
我们知道是表明要操作数据库了,*Service
表明这是业务相关的操作。
但是,命名可以说是编程中最难的一件事情之一。正因为如此,可以说,改名可能是最常用的重构方法。如果方法改名、变量改名,甚至类改名。然而,很多人不愿意给程序元素改名,觉得不值得费这个劲,但好的名字能节省未来用在猜谜上的大量时间。你想想,在一个几百行代码中,变量命名都是aa
、bb
、str
这种命名的时候,你有多么的抓狂就知道命名有多重要了。
改名不仅仅是修改名字而已。如果你想不出一个好的名字,说明这段代码就还有重构的空间。为了一个名字付出的纠结,能够推动我们对代码进行精简。
重复代码(Duplicated Code)
好吧,这又是我们经常干的事了,Ctrl C
和Ctrl V
是我们最常用的操作。复制代码一时爽,但是当我们修改重复代码时就很痛苦了,并且还要比较这二段代码是否是完全一样,看看是否有细微差别。
所以说,如果我们在一个以上的地方看到相同的代码结构,设法把它们合并为一吧,程序会变得更好。
幸运的是,很多的IDE都知道自动提示重复代码,只要看到重复代码,我们就可以思考如何去优化它们了。
过长函数
你是不是经常向其它同事抱怨哪个类有几百行,一上午都无法看完一个类。这又是一种典型的代码坏味道-过长函数。根据经验来看,活得最长、最好的程序,其中的方法都比较短。阅读各种优秀的开源项目也会发现其方法都比较短。其带来的很处是:更好的阐释力、更易于分享、更多的选择。
很多人会担忧,在一个方法中使用过多的小方法,会需要额外的开销。但现在几乎不用但心这个问题,现代的编程语言几乎都免除了进程内的方法调用开销。虽然,小方法(函数)对代码阅读者带来困扰,需要频繁的进行上下文切换。这就需要小方法(函数)有一个良好的命名,可以见名知意,见到方法(函数)就知道什么意思,根本不需要去看代码具体写了什么。
要把方法(函数)变短,一般只要找到适合集中在一起的部分,将它们提炼出来形成一个新的函数。
如何寻找需要提炼的方法(函数)呢?一个好的技巧就是:寻找注释。如果代码前方有一行注释,其就是在提示你可以把它们提炼成一个方法(函数),而且可以在注释的基础上给这个方法命名。就算只有一行代码,如果它需要以注释进行说明,那也值得把它提炼成方法。
条件表达式和循环表达式通常也是提炼的信号。