代码的坏味道

前言

代码的坏味道出自马丁.福勒《重构-改善既有代码的设计》一书,说明你的代码不够好,需要重构才能让代码变成干净的代码。下文主要介绍常见的一些代码坏味道,而这些坏味道,不限定于某种语言。也就是说任何一种语言都可能出现下列的代码坏味道。

神秘命名(Mysterious Name)

看电影和看小说我们喜欢看一些神秘的文字猜测,喜欢玩一些文字游戏,但如果在阅读代码时,这样的体验就不太好了。我相信,对于一个开发人员来说,对于一个从命名上完全看不出这个类或方法是干什么的时候,那是有多么的痛苦。

整洁代码最重要的一环就是要一个好的名字,所以我们会深思熟虑给变量、方法、类、模块变名,使它们能够清楚的表明自己的功能和用法。就比如我们在MVC架构中,*DAO我们知道是表明要操作数据库了,*Service表明这是业务相关的操作。

但是,命名可以说是编程中最难的一件事情之一。正因为如此,可以说,改名可能是最常用的重构方法。如果方法改名、变量改名,甚至类改名。然而,很多人不愿意给程序元素改名,觉得不值得费这个劲,但好的名字能节省未来用在猜谜上的大量时间。你想想,在一个几百行代码中,变量命名都是aabbstr这种命名的时候,你有多么的抓狂就知道命名有多重要了。

改名不仅仅是修改名字而已。如果你想不出一个好的名字,说明这段代码就还有重构的空间。为了一个名字付出的纠结,能够推动我们对代码进行精简。

重复代码(Duplicated Code)

好吧,这又是我们经常干的事了,Ctrl CCtrl V是我们最常用的操作。复制代码一时爽,但是当我们修改重复代码时就很痛苦了,并且还要比较这二段代码是否是完全一样,看看是否有细微差别。

所以说,如果我们在一个以上的地方看到相同的代码结构,设法把它们合并为一吧,程序会变得更好。

幸运的是,很多的IDE都知道自动提示重复代码,只要看到重复代码,我们就可以思考如何去优化它们了。

过长函数

你是不是经常向其它同事抱怨哪个类有几百行,一上午都无法看完一个类。这又是一种典型的代码坏味道-过长函数。根据经验来看,活得最长、最好的程序,其中的方法都比较短。阅读各种优秀的开源项目也会发现其方法都比较短。其带来的很处是:更好的阐释力、更易于分享、更多的选择。

很多人会担忧,在一个方法中使用过多的小方法,会需要额外的开销。但现在几乎不用但心这个问题,现代的编程语言几乎都免除了进程内的方法调用开销。虽然,小方法(函数)对代码阅读者带来困扰,需要频繁的进行上下文切换。这就需要小方法(函数)有一个良好的命名,可以见名知意,见到方法(函数)就知道什么意思,根本不需要去看代码具体写了什么。

要把方法(函数)变短,一般只要找到适合集中在一起的部分,将它们提炼出来形成一个新的函数。

如何寻找需要提炼的方法(函数)呢?一个好的技巧就是:寻找注释。如果代码前方有一行注释,其就是在提示你可以把它们提炼成一个方法(函数),而且可以在注释的基础上给这个方法命名。就算只有一行代码,如果它需要以注释进行说明,那也值得把它提炼成方法。

条件表达式和循环表达式通常也是提炼的信号。

过长参数列表(Long Parameter List)

全局数据(Global Data)

可变数据(Mutable Data)

发散式变化(Divergent Change)

霰弹式修改(Shotgun Surgery)

依恋情结(Feature Envy)

数据泥团(Data Clumps)

基本类型偏执(Primitive Obsession)

重复的switch(Repeated Switches)

循环语句(Loops)

冗赘的元素(Lazy Element)

夸夸其谈通用性(Speculative Generality)

临时字段(Temporary Field)

过长的消息链(Message Chains)

中间人(Middle Man)

内幕交易(Insider Trading)

过大的类(Large Class)

异曲同工的类(Alternative Classes with Different Interfaces)

纯数据类(Data Class)

被拒绝的遗赠(Refused Bequest)

注释(Comments)


   转载规则


《代码的坏味道》 孤独如梦 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
待完成的文章 待完成的文章
zabbix一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 jmeterApache组织开发的基于Java的压力测试工具。
2019-06-03
下一篇 
【dubbo系列】 03-基于注解的配置 【dubbo系列】 03-基于注解的配置
03 dubbo 系列 | 基于注解的配置前文已经介绍了基于spring xml 配置 dubbo,本文将介绍基于注解的方式配置dubbo。要想支持注解的配置,dubbo的版本必须2.6.3版本以上。 provider 的配置 应用共享配置
2019-05-31
  目录