写点什么

重构和代码异味——通往更整洁的代码

  • 2016-09-26
  • 本文字数:2156 字

    阅读完需:约 7 分钟

重构可以让代码更整洁,更易于理解和维护。“代码异味(code smells)”的辨别需要实践和经验:设计不良的表征说明代码存在更深层次的问题。工具可以帮助我们逐步重构,并防止破坏代码。

SwanseaCon 2016 大会上,Codurance 实习生 Halima Koundi 探讨了重构和代码异味。InfoQ 正以 Q&A、综述和文章等形式对大会进行跟踪报道。

Koundi 引用了 Martin Fowler 对代码异味的定义

代码异味是一种表象,它通常对应于系统中更深层次的问题。

如果重视不够,没有适当地维护或改进代码,那么代码质量就会下降。在演讲中,Koundi 总结了不同类型的代码异味,并阐述了如何辨别它们。她提到的其中一类代码异味是“面向对象滥用”;这类异味和面向对象设计的不完全或错误实现有关。辨别“面向对象滥用”异味有助于找出可能违反面向对象设计原则、可以导致错误的对象行为的代码。

Koundi 提到的另外一类代码异味是“变更障碍”,即代码的一处变更(例如,实现一个新特性或者调整一个现有特性)会影响许多类,需要对整个代码进行大量的修改。“平行继承层次”或“发散式变更”就是这类代码异味的例子。

Koundi 演示了如何使用 Jetbrains 的 ReSharper 安全地重构代码。在演示过程中,她示范了当需要添加新的支付方法时如何调整代码。她阐述了如何逐步重构代码以及如何确保所做的变更不会破坏代码。

演讲结束后,InfoQ 采访了 Koundi,内容涉及当前存在的不同类型的代码异味、开发人员如何辨别代码异味、消除代码异味的原则、代码重构实践、开发人员如何确保所做的变更不会破坏代码、什么时候应该重构及什么时候不应该重构、重构带来的好处。

InfoQ:代码异味有哪些不同的类型?

Halima Koundi:代码异味有多种类型。部分代码异味反复出现是因为开发人员不注意以及代码库的抽象不够;这包括过长的方法、过长的参数列表等。其他的代码异味是因为面向对象原则的不完全或糟糕实现,例如,“拒绝继承(Refused Bequest)”就是这样一种异味,该情况说明我们已经引入了错误的抽象。

向系统添加噪音的代码是另外一类。例如,即使不删除,你也应该减少代码中的注释,而为方法取一个更有意义的名字。无用的代码应该删除——即使你认为稍后可能需要。

InfoQ:开发人员如何辨别代码异味?

Koundi:代码异味可以通过代码的可见特征、有形特征和无形特征来辨别。可见特征包括:过长的方法或函数体、过长的参数列表、变量多次成组出现且模式类似——这些是职责混乱抽象缺失的表征。对于有形特征,一个例子是变更需要查看并修改许多文件。无形特征是当你提出类似这样的问题,“既然我需要的行为并不相同,我为什么还要继承这个父类”。

代码异味的辨别需要实践和经验。有许多方法和套路可以帮助你实践。代码异味是表征;它们通常说明你破坏了某些设计原则。了解这些原则有助于你理解代码库的问题。

InfoQ:消除代码异味的一般原则是什么?

Koundi:重构是指改变代码的设计,而不改变代码的行为。重构是平台无关的。代码异味是糟糕设计的表征。我的建议是,读下 Martin Fowler 的著作《重构:改善既有代码的设计》。需要注意的是,重构为抽象概念并不总是正确的方式,因为那会增加系统的复杂度,而且本身可能会变成代码异味。代码有可能不是特别复杂,并不能从一定程度的抽象受益。

InfoQ:您谈了重构代码的实践并进行了演示。您能举几个例子说明下如何重构代码吗?

Koundi:我发现,有两种非常强大而又相当简单的重构方法。

  • 方法提取:假如你有一些函数,它们做了太多的事情,而你希望能够让代码更简单易读,则可以按照算法的操作步骤把算法分解,并把每个操作都提取到自己的方法中,然后根据它们的行为命名这些方法。
  • 方法重命名:表现力不够的代码难以使用。例如,你发现,在查看一个方法时,你花了 10 多分钟才弄清楚它在做什么。如果你找到了一种更好的方法来描述代码的行为,那么你应该重命名那个方法,前提是该方法没有作为一个公共 API 暴露。

就像我所演示的那样,工具和重构知识本身一样重要。了解开发环境让你可以更轻松、更迅速、更安全地执行重构。Matthew Butt 整理了一系列的重构截屏视频。他在视频中演示了如何通过简单的步骤重构代码。

InfoQ:开发人员怎么做才能确保他们正在进行的重构不会破坏代码?

Koundi:在开始重构之前,有几个方面需要确认。

  • 你可以核实系统的其他部分不受重构影响。这是通过测试完成的。
  • 关于如何使用这段代码,有一份清晰的文档。那份文档是由测试提供的。
  • 你所重构的系统部分不会遭受衰退。你猜,那是谁的工作?测试!

在重构代码之前,一定要确保自己已经有了各种测试。

InfoQ:什么时候应该重构?什么时候不应该?

Koundi:重构,像编写测试一样,应该成为同一个特性实现活动的一部分。它不是一个独立的活动。当你希望修改代码,而代码本身尚未做好变更准备时,重构它。重构是测试驱动开发(TDD)的一个重要步骤。

代码审查也是重构执行的上佳选择。

另一方面,为了实现“完美的代码”而在整个代码库上进行大量低价值的重构被称为镀金。这有损于代码整洁,因为它削弱了重构的真实性需求,盲目地为了重构而重构。如果代码正常,就不需要修改,不要碰他。

InfoQ:重构可以带来什么好处?

Koundi:重构的目标是更整洁的代码,就是说,重构旨在让代码更容易理解,降低变更成本。

查看英文原文: Refactoring and Code Smells – A Journey Toward Cleaner Code

2016-09-26 19:006111
用户头像

发布了 1008 篇内容, 共 449.1 次阅读, 收获喜欢 346 次。

关注

评论

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

TiKV存储节点计划内外停机,如何去处理?

TiDB 社区干货传送门

故障排查/诊断 TiKV 底层架构 7.x 实践

单条记录大小增长倍数和ibd文件大小的增长倍数不成正比

GreatSQL

数据库 greatsql

“JVM” 上的AOP:Java Agent 实战

阿里技术

Java spring 阿里 aop

华为云重磅参会 KubeCon China 2024,精彩议程揭晓 !

华为云原生团队

云计算 容器 云原生

Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程

汀丶人工智能

人工智能 大模型 xinference

sync-diff-inspector比对表结构,索引

TiDB 社区干货传送门

TCL 实业 x TiDB丨从分销转向零售,如何考虑中台建设和数据库选型?

TiDB 社区干货传送门

从 MySQL 迁移到 TiDB:使用 SQL-Replay 工具进行真实线上流量回放测试 SOP

TiDB 社区干货传送门

谈一谈数据虚拟化的技术核心和应用架构

Aloudata

RP Data Fabric 逻辑数据编织

火山引擎ByteHouse助力车企实现高性能数据分析

字节跳动数据平台

大数据 数据仓库 云原生 Clickhouse

【技术分享】用AWS EC2搭建WordPress

伊克罗德信息科技

亚马逊云科技 EC2 MYSCALE

智谱AI与和鲸科技签署战略合作协议,共拓大模型产业应用与人才培养新未来

ModelWhale

人工智能 大模型 ChatGLM

新增姿态估计标注,以及模型应用优化|ModelWhale 版本更新

ModelWhale

鉴权 模型应用 模型服务

数业智能心大陆 AI解答如何应对焦虑

心大陆多智能体

智能体 焦虑 AI大模型 心理健康 数字心理

全球化浪潮下的数据库革新:嘉里物流 TiDB 实践价值的设想

TiDB 社区干货传送门

亚信安慧AntDB-M聚合下推—加速你的数据分析查询

亚信AntDB数据库

AntDB

AI驱动的商品企划软件 零售企业市场致胜的智能化利器

第七在线

HTAP 数据库在国有大行反洗钱场景的应用

TiDB 社区干货传送门

​​万界星空科技低代码云mes,更适合中小企业的mes系统

万界星空科技

低代码 低代码平台 mes 云mes 万界星空科技

1688代采集运系统:跨境电商世界的神奇魔法棒

tbapi

1688代采系统 1688代采集运系统

从0到1:AI与低代码如何推动企业创新

天津汇柏科技有限公司

低代码 AI 人工智能

万亿城商行如何借助 TiDB 构建面向未来的金融核心系统

TiDB 社区干货传送门

实践案例

重构和代码异味——通往更整洁的代码_JetBrains_Ben Linders_InfoQ精选文章