《代码整洁之道》-大师眼中的整洁代码是什么样

几个月前写了一篇文章"如何写出难以维护的代码",从中能大概了解到不好维护的代码是什么样,有哪些坏味道,那肯定有人会反问,难以维护的代码见的太多了,也知道长什么样,但是对于好维护的代码是什么样的比较模糊,带着这个问题,本人读完了世界软件开发大师马丁的《代码整洁之道》这本书,来了解下大师眼中的整洁代码画像是什么样的,相信能给你带来不一样的理解和感悟。

关于整洁代码,没有明确的定义,有多少程序员就有多少种定义。下面先看下几位大师是如何定义的。

C++语言发明者 Bjarne Stroustrup 提到:

代码应该优雅高效,代码逻辑应该直截了当,让缺陷难以隐藏尽量减少依赖关系,便于维护;按照某种分层策略完善错误处理,性能调到最优,不会让别人修改的更混乱整洁的代码只做一件事

《面向对象分析与设计》一书作者 Grad Booch 提到:

整洁的代码简单直接,如同散文一样优美从不隐藏设计者的意图,代码抽象干净利落,控制语句直截了当。

Eclipse 战略教父 Dave Thomas 这么定义:

整洁的代码应可由其他开发者阅读和增补,应当有单元测试和验收测试,使用有意义的命名,只提供一种而非多种做一件事的途径,只有尽量少的依赖关系,而且要明确地定义和提供清晰、尽量少的 API。

《修改代码的艺术》一书作者 Michael Feathers 定义:

整洁代码应该是特别在意代码的人才能写出来的,几乎没有改进的余地,作者各种情况都想到了,如果你想改进它,总会回到原点,总会赞叹写代码的人的专心和认真。

《极限编程实施》作者 Ron Jeffries 提出整洁代码:

能通过所有测试,没有重复代码,代码能体现设计理念,尽量减少类,方法以及函数。

综合以上几位大师对整洁代码的定义阐述,可以归纳总结一下整洁代码的画像:

1.体现设计理念,这个整洁代码特性在以上大师的定义里面多次提到了,Grady 提到整洁代码不会隐藏设计意图,Ron 提到整洁代码一看就知道采用了什么样的设计理念。体现设计理念看上去有点虚,但是实际上我认为是最重要的一点,所谓代码即设计,只要能回答代码为什么这么写,就说明你的代码有设计思想在里面,即便一行代码都能体现出设计理念,比如一个有意义的命名也是设计的一种表现。

2.没有重复代码,如果你两处代码相同或者大部分重复,说明代码不够整洁,同时说明代码没有去做好设计。消除重复代码意味着减少类和方法以及相关 API。

3.代码只做一件事,很多代码由于想做太多事,目的不明确,意图混乱,结果代码变得很糟糕,代码只做一件事,也称单一职责,这个几乎是很多软件设计里面经常提到的一个警句,这个原则看似很简单,但是实际上执行起来不是那么简单,或者说,一时坚持这个原则很容易,难的是一直坚持这个原则,如果始终能践行这个原则,代码整洁度能达到质的飞跃。

4.代码好阅读,关于阅读,Bjarne 用"优雅"来形容,优雅意味着优美雅致,所以在他看来,代码应该优美,给人以愉悦感,Grad 也提到代码应该像散文一样优美,让阅读的人看完一段想看下一段,能很明显的展现出解决问题的表达力和张力,阅读者会不停的发出"啊哈,应该这样来处理!"的感叹。反之,如果代码不好阅读,阅读者看完后还需要猜测所表达的意思,对所实现的功能持怀疑态度,甚至有心惊胆战的心理,会在心里不停的反问:"不会吧,这都可以在线上运行?"我们在修改代码或写新代码之前都要阅读周边代码,如果阅读代码很难,则写代码也会很难,据统计读代码和写代码时间比例是 10:1,编写代码的难度,取决于读周边代码的难度。要想干得快,要想早点做完,要想轻松写代码,先让代码易读吧。

5.代码好修改,Dave 提到整洁代码应该可以让其他开发者进行增补,也就是很容易进行功能的增加,毕竟很多系统代码都要不停的迭代更新,需要基于原代码进行增补,所以代码的易修改就显得格外的重要,试想如果一个开发者写的代码别人没法修改或者不敢改,那你说这隐患有多大。我们经常嘴巴提到的系统可维护性,实际上说的更具体点,更多的指的是代码的可修改方面。

将以上 5 点整洁代码的画像总结一句话:

体现设计理念,代码不重复,只做一件事,好阅读和修改!

相关推荐
..过云雨26 分钟前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
南山乐只1 小时前
【Spring AI 开发指南】ChatClient 基础、原理与实战案例
人工智能·后端·spring ai
努力的小雨2 小时前
从“Agent 元年”到 AI IDE 元年——2025 我与 Vibe Coding 的那些事儿
后端·程序员
源码获取_wx:Fegn08953 小时前
基于springboot + vue小区人脸识别门禁系统
java·开发语言·vue.js·spring boot·后端·spring
wuxuanok3 小时前
Go——Swagger API文档访问500
开发语言·后端·golang
用户21411832636023 小时前
白嫖Google Antigravity!Claude Opus 4.5免费用,告别token焦虑
后端
爬山算法4 小时前
Hibernate(15)Hibernate中如何定义一个实体的主键?
java·后端·hibernate
用户26851612107565 小时前
常见的 Git 分支命名策略和实践
后端
程序员小假5 小时前
我们来说一下 MySQL 的慢查询日志
java·后端