《代码整洁之道》:5大基本要点
常常有小伙伴推荐罗伯特·C·马丁的《代码整洁之道(Clean Code)》。今天我们就来了解一下这本书,它值不值得一看?
关于此书
《代码整洁之道》出版于2008年,近年来,一直被列为“亚马逊最畅销的五本书”之一。本书作者被亲切地称为“Bob叔叔”,他也是《敏捷宣言》的原作者之一,资历非常丰富。本书在Goodreads上平均评分为4.4(评分人数超13,000)。可以说,这是一本程序员的必读书。
本文将本书精简为五个要点。
1. 尊重抽象
图片:abstraction(抽象)图源: Abstruse Goose
《代码整洁之道》中写到:如果要确保函数仅做一件事,则需要确保每个函数的语句都位于同一抽象层次。
为说明这一点,马丁用了以下示例(出自FitNesse):
- public String render() throws Exception
- StringBuffer html =new StringBuffer("<hr");
- if (size >0)
- html.append(" size="").append(size + 1).append("\"");
- html.append(">");
- return html.toString();
在GitHub上查看no_abstraction.java源代码
这里至少混合了两个抽象层次。第一个是固定大小的hr标签的高级概念,第二个是处理实际标签构造的低级语法细节。为了说明这一点,对代码进行更清晰地重构,如下所示:
- public String render() throws Exception
- {
- HtmlTag hr =new HtmlTag("hr");
- if (extraDashes >0)
- hr.addAttribute("size", hrSize(extraDahses));
- return hr.html();
- }
- private String hrSize(int height)
- {
- int hrSize = height +1;
- return String.format("%d", hrSize);
- }
在GitHub上查看abstraction.java源代码
注意:
- Render()函数现在仅负责构建hr标签
- 将构建标签的底层详细信息的任务转给HtmlTag模块
- 大小格式被抽象为独立的函数
马丁认为:
“分离抽象层次是重构最重要的功能之一,也是最难实现的功能之一。” |
当然,在以后的代码中,我会有更多考虑。
2. 整洁代码关乎规则,要花大量精力
我不希望本文仅是列出编写整洁代码的要点和规则。对本书而言这也无甚作用——因为采取教条式的教学方法是远远不够的。
相反,在本书中马丁呼吁发展强烈的个人原则感,且不断说明将“脏代码”变整洁所需的努力和职责。本书将其称为“代码感”,它要求“严格使用艰难获得整洁代码的大量小技巧。”
“整洁代码并非遵循一组规则编写的。不可能因为学习一套金规玉律就成为软件大师。专业精神和手工艺来自于推动规则形成的价值。” —罗伯特·C·马丁(RobertC. Martin)
就个人而言,我没什么自信,所以很喜欢这种说法。就连Bob叔叔都坚信编写代码是一份需要严肃自律的工作,要花费大量精力,真是极大的安慰。为了真正擅于整洁代码,我们需要迭代我们作为程序员的个人开发以及代码的开发。
3. 代码尽量精简
“函数的首要规则是体积小。第二规则是使其尽可能地变小。” ——罗伯特·C·马丁
这里有两个含义:
- 函数本身应该简短——几乎不超过20行,大多数情况下少于10行
- 函数应尽可能不要采用参数
简洁函数能增加代码的易读性。这也使我们倾向于编写功能单一高效的函数。
对于类,他也有类似的看法。他建议使用“职责”而非“代码行”来衡量类的大小。即一个类应该只有一个职责。这就是所谓的“单一职责原则”(SRP)。
保持代码简短是“分划”策略,如果一个大文件包含大量冗长而复杂的代码,则可以将该文件分为多个模块,将模块分为多个函数,再将函数分为多个子函数,直至看到代码逻辑和任务。
4. 编程是工艺
我时常认为,将编程喻为建筑和构造并不恰当。因为程序员不会做一个完整的设计,从头开始建基,再一步步搭建直至完工。
编程的步骤是:先画草图,再反复添加细节。程序员要做的是修改、完善和扩展——这些都在各抽象层次上完成,直到软件满足要求为止。而软件永远不会真正完成。
这就是《代码整洁之道》的中心思想。贯穿全书的要点是:软件是一门艺术,做软件就像“画画”。作者认为编程的本质是一门工艺。
图片:“ Good Code(好代码)” 网站:xkcd
但如何让编程从单纯地写代码变成“工艺”呢?
马丁认为,程序员掌握的主要工具是持续重构和测试驱动开发(TDD)。两者像硬币的两面般协同工作。来看一些概念:
重构是在不更改输出的情况下调整现有计算机代码结构的过程。
测试驱动开发是将需求转换为特定测试用例,再添加代码以使测试通过的过程。
因此,制作软件的过程可能如下所示:
- 编写测试代码以验证所需但未实现的功能。
- 编写有效代码(可能不整洁),并通过测试。
- 逐步重构代码(保证每次通过测试),使代码在每次开发迭代中都更加清晰。
“不要想着一次性编程后系统就能正确、漂亮地运行。今日的任务仅仅是让程序运行起来,而重构和扩展系统是明天的任务。这是迭代和增量敏捷的本质。” ——罗伯特·C·马丁 |
因此,本书的中心思想是,整洁代码是在开发和实践中实现的,而非简单地一口气创建出来。
来源:Pexels
5. 代码本身清晰易读
注释很少却清晰、表达力强的代码优于注释多的混乱、复杂的代码。” ——罗伯特·C·马丁
在“注释、有意义的命名和格式“一章中,马丁强烈主张代码本身应该清晰易读。示例:
- // Check to see if theemployee is eligible for full benefits
- if ((employee.flags & HOURLY_FLAG) &&
- (employee.age > 65))
将其重构为:
- if(employee.isEligibleForFullBenefits())
注意:
- 删除注释
- 条件逻辑封装到一个方法中
- 因为使用的是方法而不是独立函数,因此可以使用实例变量,从而创建调用零参数的方法
- 给该方法起一个描述性的名称,使其职责更加明确
《代码整洁之道》关于命名写了整整一个章节,本质上是对Tim Ottinger规则的详细说明。包括:
- 设置可读性高的名称——例如,int elapsedTimeInDays,而不是in days
- 使用读得出来的名称——例如,客户而不是DtaRcrd102
- 避免使用编码——不要用前缀m_表示"members",也不要使用匈牙利表示法
- 每个概念对应一个词——不要fetch,retrieve,get多个概念对应一个词
结语
《代码整洁之道》中,并非每个想法都是Bob叔叔提出的,他在书中的各部分都承认了这一点。而这反而是使本书如此成功的一个原因——它是编程界智慧的汇聚,并附有实例。
如果要说一个小瑕疵,那就是与高层概念的章节相比,有关底层细节的章节有点少。“系统”章只有13页,仅仅是“注释“章的一半。但是,我怀疑减少对系统的重视,是为了将讨论保留在他后来的书《架构整洁之道(CleanArchitecture)》中。
综合考虑,这真的是目前最好的编程书籍之一,我会把该书放到我的2021年书单中。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
决胜智能化:2020年六大SD-WAN预测
消费端用户体验将成为未来几年企业IT投资的决定性因素。 除了人工智能、威胁情报和零信任以外,SD-WAN是今年RSA2020大会最热门的产品概念之一,这与SD-WAN市场进入爆发期有关,根据ZK Research的调查,安全性是客户选择SD-WAN产品的第一考察要素。在了解SD-WAN面临和“制造”的新的安全问题之前,我们有必要了解一下当前SD-WAN市场的发展态势和趋势。 软件定义的广域网(SD-WAN)市场的兴起,就像地震一样排山倒海。根据IDC最近的预测,SD-WAN基础设施的销售额在2018年增长了近65%,达到14亿美元。IDC预计,到2023年,SD-WAN市场将超过52亿美元。而根据Gartner的报告,2024年受敏捷化和增强云应用支持的驱动,60%的企业将部署SD-WAN,是目前(20%)的三倍,SD-WAN与网络功能虚拟化服务(NFV)市场趋势如下: 业界分析师普遍认为SD-WAN即将成为企业默认的WAN连接选择。那么,未来12个月这个充满活力的新市场将发生哪些变化?SD-WAN去向何方?以下是安全牛整理的业界对2020年SD-WAN市场的六大预测: 预测01:从S...
- 下一篇
WinSCP 5.17.1 发布,Windows 图形化 SFTP 客户端
WinSCP 是一个 Windows 环境下使用的SSH的开源图形化SFTP客户端,同时支持SCP协议,它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。 目前,WinSCP 5.17.1已经发布,此版本修复了一些 bug,具体更新内容如下: Bug fix:关闭 WinSCP 的确认没有关联的帮助页面(以解释工作区)。1825 Bug fix:加载带有某些特殊字符(如破折号)的文件名扩展名时失败。1826 Bug fix:SCPfallback不再起作用。1827 Bug fix:无法提交资源管理器界面地址栏上的路径。1828 Bug fix:从睡眠状态恢复系统后,使用 tree 更改目录时失败。1829 Bug fix:无法使用 TLS / SSL 客户端证书。1830 Bug fix:即使不支持 S3 协议,也可以配置 TLS / SSL 客户端证书。 更新说明 下载地址:https://winscp.net/eng/download.php
相关文章
文章评论
共有0条评论来说两句吧...