写点什么

改善代码质量的 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:073396
用户头像

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

关注

评论

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

带你动手设计一个高速公路多节点温度采集系统

华为云开发者联盟

云计算 物联网 华为云 企业号 2 月 PK 榜 华为云开发者联盟

BSN-DDC基础网络详解(三):注册门户账号和业务开通(1)

BSN研习社

京东力荐!深入理解高并发编程手册,GitHub上线3小时飙升榜首

Java 并发编程 高并发

飞书与钉钉的真正竞争在这

B Impact

ChatGPT:将一个「营销小助手」请回家

FinFish

AI AIGC ChatGPT

墨天轮发布数据库行业报告,亚信科技AntDB“超融合+流式实时数仓”开启新纪元

亚信AntDB数据库

数据库 AntDB 国产数据库 AntDB数据库 企业号 2 月 PK 榜

MQTT保留消息是什么?如何使用?

EMQ映云科技

物联网 IoT mqtt 企业号 2 月 PK 榜 保留消息

软件测试/测试开发 | app测试中常用的Android模拟器

测试人

android 软件测试 自动化测试 测试开发

火山引擎DataTester:在广告投放场景下的A/B实验实践

字节跳动数据平台

大数据 AB testing实战 企业号 2 月 PK 榜

借力英特尔® Smart Edge,灵雀云 ACP 5G 专网解决方案获得多维度优化加速

York

云原生 5G 系统架构 边缘计算 英特尔

在TitanIDE中使用ChatGPT辅助科研开发

行云创新

AI 云端开发 TitanIDE

Matic链矩阵公排智能合约挖矿dapp系统开发详情(案例演示)

开发微hkkf5566

LeetCode:240. 搜索二维矩阵 II,二分查找,详细注释

Lee Chen

JavaScript 算法 LeetCode

为什么面试 SaaS 产品经理一定要问权限管理?

产品海豚湾

产品经理 SaaS 权限管理 B端 产品面试

体验AI乐趣:基于AI Gallery二分类猫狗图片分类小数据集自动学习

华为云开发者联盟

人工智能 华为云 企业号 2 月 PK 榜 华为云开发者联盟

华为云API Arts:用“1+1+5”的模式,为你带来API-First体验

华为云开发者联盟

云计算 后端 华为云 企业号 2 月 PK 榜 华为云开发者联盟

软件测试/测试开发 | 想做App测试就一定要了解的App结构

测试人

软件测试 自动化测试 测试开发 app测试

分布式事务系统Seata的这些安保机制是否会让你更放心

Java 分布式 Spring Boot seata

MQTT持久会话与Clean Session详解

EMQ映云科技

物联网 IoT mqtt 企业号 2 月 PK 榜 持久会话

佛萨奇2.0智能合约矩阵公排系统开发源代码(可改链)

开发微hkkf5566

春种一粒粟:企业如何修炼好云原生内功?

脑极体

云原生

MQTT QoS 0,1,2介绍

EMQ映云科技

物联网 IoT mqtt QoS 企业号 2 月 PK 榜

微服务-常见配置中心工作原理

Java 微服务 配置中心

修改ctags让fzf.vim插件显示C,C++方法声明的标签

Geek_pwdeic

ctags fzf.vim

【NeurIPS 2022】视频动作识别,AFNet 用更低的成本接收更多数据

Zilliz

到底怎么理解分布式事务

苏宁基于 AI 和图技术的智能监控体系的建设

NebulaGraph

运维 图数据库

热点面试题:JS 中 call, apply, bind 概念、用法、区别及实现?

Immerse

JavaScript call apply bind 前端面试题

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