写点什么

改善代码质量的 6 种重构模式

  • 2014-02-04
  • 本文字数:1404 字

    阅读完需:约 5 分钟

Kumar 是位涉猎广泛的软件工程师,对很多技术领域都有非常高的热情,如 Java/JEE、PHP、.NET、C/C++ 等程序设计语言、移动编程语言、应用安全、云计算、API、移动应用、Google Glass、大数据等等,其 Twitter 帐号是 @eajitesh。近日,Kumar 撰写了一篇文章,谈到了常见的代码坏味道以及改善代码质量的6 种重构模式,并对每种重构模式的使用场景进行了详尽的论述与讨论。

最近一段时间,我参与了几次代码审查,发现了5 种出现次数较多的代码坏味道,总结如下:

1. 过大的类:由于开发者没能很好地理解“单一职责原则”这一编码规则而导致类的规模过于庞大。由于在同一个类中存在着完成各种不相关功能的各种方法,因此这样的类随着时间的流逝会变得越来越大。

2. 过长的方法:由于如下几个原因,我们发现有些方法显得太长了:

  • 在同一个方法中,几个代码块实现了不相关 / 多个功能。这主要是由于开发者不理解单一职责原则所导致的。
  • 同一个方法中存在多个条件。我们发现在过长的方法中,这种情况是非常普遍的。这可以归结为由于开发者缺乏对 McCabe 代码复杂度和单一职责原则概念的理解所造成的。

3. 方法参数:有时方法会彼此传递几个参数进行相互的调用。这时,如果修改了参数列表中的一个参数,那就需要修改几个方法签名。

4. 遍布在各处的字面常量:有一些程序员新手会使用字面常量值(大多数是数字),在使用的时候心里对这些常量值有着确切的定义,但却没有将其赋给具名的常量。这会严重降低代码的可读性和可理解性。

5. 含糊不清的方法名:很多时候,下面这样的方法名会严重影响到代码的可读性与可理解性:

  • 没有任何意义、含糊不清的名字
  • 只是一个技术上的名字,与问题域没有任何关联关系。

根据上面所讨论的代码坏味道,下面给出可以有效解决这些问题的 6 种重构模式,合理使用这些模式能够帮你解决大多数的代码质量问题并成为一名更优秀的开发者。

1. 抽取类与移动方法:如上所述,诸如过大的类等代码坏味道可以通过将类划分为恰当数量的小类来解决。在这些新类中,我们需要将原来的类中的一些属性和方法移动过来。除此之外,有时类中还会包含大量的方法,这些方法会被其他类所用,这种方法也可以移动到恰当的新类当中。

2. 抽取方法:就像上面所介绍的,诸如过长的方法这种代码坏味道可以通过将原来方法中的代码抽取到新方法中来解决。

3. 分解条件:很多时候,过长的方法实际上包含了过多的条件语句(if-else)。我们应该将这些条件抽取出来放到单独的方法当中,这会让代码的可读性与可理解性上一个新台阶。

4. 引入参数对象 / 保留整个对象:在代码审查过程中,我发现将多个参数传递到方法中是一个很普遍的现象。如果要增加或是删除方法中的参数,那这么做就会引发问题。在这种情况下,我们建议将相关的参数组织为一个对象(引入参数对象),将对象而不是单独的参数传递到方法中去。

5. 使用符号常量代替魔数:对于那些有确切含义并在很多地方使用的字面常量值来说,你应该将其赋给具名的常量。这会增强代码的可读性与可理解性。

6. 重命名方法:含糊不清的方法名会影响到代码的可读性。我们应该使用有意义的方法名,与业务领域的术语相关,并且能够帮助开发者理解业务上下文中的代码。这是需要技巧的,需要开发者与业务分析师紧密配合来清楚地理解代码所要满足的业务需求。有趣的是,这种重构模式看起来似乎很简单,但实际上却经常被很多开发者所忽视。值得一提的是,很多 IDE 都提供了重命名这个重构选项,值得你尝试一下。

2014-02-04 12:073382
用户头像

发布了 88 篇内容, 共 272.6 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

Zookeeper通信协议详解

tunsuy

zookeeper TCP/IP 通信协议

Zookeeper的数据剖析

tunsuy

zookeeper 日志分析 事务 快照 数据恢复

组合模式应用

yupi

windows使用docker运行mysql等工具(二)安装运行mysql

Java旅途

MySQL Docker

第三周作业

晨光

第三周总结

晨光

良心推荐 | LeetCode(力扣),算法、数据结构的学习良伴

YoungZY

算法

区块链改变数字营销与广告市场

CECBC

区块链技术 广告业 精准投放 去中介 公开透明

架构师训练营 第三周 命题作业

RZC

第三周手写单例模式(饿汉模式)

吴建中

极客大学架构师训练营

Oracle SQL调优系列之看懂执行计划explain

Nicky.Ma

sql

让你眼前一亮的 10 大 TS 项目

阿宝哥

Java typescript 开源 大前端 Web

[架构师训练营] Week01 -学习总结

谭方敏

架构师是怎样炼成的-3-2-设计模式

闷骚程序员

第三周-设计模式-学习总结

吴建中

极客大学架构师训练营

太赞了!一份适合程序员的精选面试题清单。

JackTian

GitHub 开源 编程 程序员 面试

产品失败了,产品经理要不要承担责任?

涛哥 数字产品和业务架构

产品经理

windows使用docker运行mysql等工具(一)windows安装docker

Java旅途

MySQL Docker

组合设计模式编码&手写单例模式

吴建中

极客大学架构师训练营

【非原创】微服务设计

Axe

手写单例模式

yupi

面向对象设计模式课程小结

梅子黄时雨

极客大学架构师训练营

极客大学架构师训练营 框架开发 模式与重构 JUnit、Spring、Hive核心源码解析 第6课

John(易筋)

spring 极客时间 极客大学 极客大学架构师训练营 JUnit

极客大学架构师训练营 系统架构 第7课 听课总结

John(易筋)

极客时间 系统架构 高并发 极客大学 极客大学架构师训练营

极客大学架构师训练营 框架开发 第三次作业

John(易筋)

极客时间 设计模式 极客大学 极客大学架构师训练营 框架开发

架构师训练营 第三周 学习总结

RZC

一个汉字占几个字节你真的记住了吗?

Java旅途

架构师训练营第三周作业和小记

tuuezzy

架构师 极客大学架构师训练营

rodert单排学习redis进阶【白银一】

JavaPub

Java nosql redis

Zookeeper集群模式启动

tunsuy

zookeeper 源码分析 socket 分布式集群

架构师训练营第四周

Melo

改善代码质量的6种重构模式_架构_张龙_InfoQ精选文章