最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

书评:简洁代码──敏捷软件工艺指南

  • 2009-06-15
  • 本文字数:2329 字

    阅读完需:约 8 分钟

作为开发人员,我们的首要任务是写出能够工作的代码。但是,仅仅“能够工作”还不足矣,为了能够持续提供真正的价值,代码一定要简洁。在《简洁代码:敏捷软件工艺指南》一书中,Robert C. Martin 提供了大量示例来帮助我们识别代码中可以改进的地方,并提供了相应的办法来逐步改进这些代码。

什么是简洁代码?

在第一章,Martin 以极富说服力的方式表明,简洁代码不仅仅是人们所希望的,并且是必须的。如果代码不简洁,开发的速度就会越来越慢。直到有一天,修改代码所引发的不确定性、痛苦感和挫败感会使团队宁愿重写所有代码。但是,如果重写的代码不能比原来的代码更简洁,那么同样的问题还会存在,几年后整个团队依然会在开始的地方打转。

每个人对简洁代码的理解会有些许不同。Martin 总结了诸多知名开发人员对简洁代码的描述,如Bjarne Stroustrup、Grady Booch、“Big” Dave Thomas、Michael Feathers、Ron Jeffries 以及Ward Cunningham。虽然他们定义简洁代码的侧重点不尽相同,但其中仍有共通之处:简单、无重复、易读、优雅。具有这些特征的代码易于维护,可以打破开发速度下降然后重写的怪圈,并能够持续提供真正的价值。

细枝末节

第二章至第六章涵盖了代码级别的考虑:选择有意义的命名、函数要优雅并有良好的可读性、要写有用的(并避免差劲的)注释、格式化代码以增加可读性,以及选择何时使用聪明的对象,何时使用简单的数据集。

Martin 将理论、说明与代码进行了有效地结合。这几章包含了太多的大师智慧,无法在此一一列举。其中散布的许多闪亮的语言,简明但含义深远(截取自第二章至第六章):

“问题不在于代码是否简单,而在于代码能够在多大程度上脱离上下文仍能表达意图。”

“作为代码的作者,我们的目的是让代码尽可能的易于理解。我们希望读者能够快速阅读我们的代码,而不是细细地研究。我们希望读者能够通过代码直接理解我们的想法,而不是辛苦的挖掘代码背后的含义。”

“编写函数的第一个原则是,函数要短小;第二个原则是函数要更短小。”

“不要害怕使用较长的命名,有意义的长命名要好于莫名其妙的短命名,同时也好于冗长的注释。”

“好名字的价值如何估计都不为过,记住 Ward 原则:当每一个子程序都只做它应该做的,你就拥有了简洁代码。编写简洁代码过程中,有一半的任务是为短小的函数选择正确的命名,函数越短小、越内聚,就越容易给它起一个有意义的好名字。”

“副作用其实就是说谎,你的函数本来要做一件事,但是却偷偷做了其他的事”

“编程的艺术一直就是语言设计的艺术,编程大师将系统看成是故事而不是程序,他们使用他们选择的编程语言来创建一个更复杂更具有表达性的语言,来讲述这个故事。”

这几章将简洁代码的哲学以集中一致的方式串联在一起,并提供了实用的建议,以便在现实中应用这些哲学。

高层决定

第七章和第八章涵盖了错误处理和第三方代码接口。我认为第七章 (由 Micheal Feathers 撰写) 特别有用。错误处理是系统中很难做好的地方之一,而且通常在软件设计相关的文档中也仅仅是作为陪衬出现。Feathers 引入了一种实用的方式,将错误处理与主流程代码相隔离的同时,保证两部分代码的清晰和可读性。

第九章涵盖了单元测试。说明了为什么保持测试代码简洁与保持生产代码简洁一样重要,以及如何保持测试代码的简洁。(“记住三件事:可读性、可读性、可读性”)这一章非常短,但是包含了很多正反两面的例子。

第十章至第十二章涵盖了高层设计:类、系统和演化式设计。第十章主要讲述了单一职责原则(SRP),这个原则在 Martin 的另一本书《敏捷软件开发:原则,模式与实践》中也曾讨论过。这里没有讲的那么深,但却是个学习的好起点。第十一章在系统级别讨论了简洁代码,如依赖注入和面向方面编程技术。第十二章提醒我们要利用测试和重构,来驱动高层设计与底层决定。

第十三章涵盖了并发。这一章并没有太深入的讨论并发,只是一些表面的东西,但是仍然有很多好的建议。

案例分析

第十四至十六章,Martin 将前几章的内容联系起来,每一章开始先介绍一个真实世界的代码范例,这些代码既不精妙绝伦也没那么糟糕透顶,然后教我们用重构一点一点的将代码变得更简洁。

这些代码示例既不会简单的不真实,也没有超出问题本身的复杂度,你不会认为它们只是例子代码,而且经过认真阅读很容易弄懂。它们可以帮助你更深入的理解如何应用本书中的原理。

在书里读到重构应该以“小步骤”完成是一回事,在一个具体的例子中体验敏捷开发人员是如何选择那些微小的步骤是另一回事。这几章给本书增加了很多价值,它将书中的理论与实践联系起来。这些案例使我感到我是在与一个真实的、聪明并富有经验的开发人员一起结对编程,这是 Martin 清晰写作风格的体现。

代码味道与启示

第十七章将“代码的味道”和启示列成一张表。它将本书的精华思想用一种直接的、面向问题的方式表现出来,在短短 29 页中形成了一个非常好的参考。

总结

每个在乎软件质量和专业技艺的开发人员都应该阅读此书。对于经验较少的开发人员,他们可以从中获益良多,这是一本需要慢慢品尝的书,它包含了许多好的建议。Martin 使用了大量示例和清晰简练的语言,即使没有经验的开发人员读得比较慢,但却不会迷惑。

有经验的开发人员也可以一读此书。它可以督促你去做那些已经知道要做(但却不总是去做)的事,提醒你一些已经遗忘的事,并教给你一些还不知道的事。最重要的是,它给出了一个全新的视角,来看待那些每天都要去做成百上千次、看起来平淡无奇的决定。

查看英文原文 Book Review: Clean Code: A Handbook of Agile Software Craftsmanship


感谢李剑对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2009-06-15 11:585468
用户头像

发布了 63 篇内容, 共 23.4 次阅读, 收获喜欢 1 次。

关注

评论

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

WorkPlus私有化即时通讯的标杆,助力企业实现信息管控与保障

WorkPlus

Merlin Protocol 推出 BRC20 Indexer Oracle 基础设施

中本聪研究院

区块链

CodeWhisperer: 让开发效率翻倍的AI助手

不会算法。

终于!极狐GitLab 支持 ARM 啦!

极狐GitLab

什么是数据驱动?它和模型驱动、领域驱动、元数据驱动、DSL驱动之间有什么区别?

canonical

领域驱动设计 低代码 领域驱动 Nop平台

CloudEon V1.3.0版本发布!

CloudEon开源

WorkPlus:领先的IM即时通讯软件,打造高效沟通协作新时代

WorkPlus

技术写作:漏斗内容策略、认知博客、支柱内容、研究报告、通用门控内容、电子书和教程

小万哥

程序人生 软件工程 博客 后端开发 技术写作

揭密支付安全:为什么你的交易无法被篡改

隐墨星辰

支付系统 签名验签 支付安全 支付系统设计与实现

macOS 上最完整、最通用、最强大的菜单栏日历:Calendar 366 II

Rose

Mac日历软件 苹果破解软件下载 Calendar 366 II中文版 Calendar 366 II Mac下载 菜单栏日历工具

实战rabbitmq-exporter,prometheus实现rabbitmq监控

智慧源点

DAPP矩阵公排模式系统开发

l8l259l3365

跨界宠粉!五粮液包机送“五粉”直击湖南跨年晚会!

新消费日报

​我的 2023 年度自我总结

Java 工程师蔡姬

程序员 大厂 年终总结

Casper Network 推出 “DevRewards” 计划:允许所有开发者赚取激励

股市老人

INFINI Labs 产品更新 | Console 数据迁移支持 Percentiles 均匀分区

极限实验室

console 极限科技 产品更新发布

Mac操作系统的专业音频处理软件:Hit'n'Mix RipX DAW PRO

Rose

音频处理器 苹果破解软件下载 Mac音频处理 Hit'n'Mix RipX DAW PRO

快速体验Spark Connect

CloudEon开源

Linux学习笔记0 - 三个感想

袁世超

Linux 学习 内核

替代企业微信、钉钉等平台,WorkPlus打造企业完美的私有化部署解决方案

WorkPlus

文心一言 VS 讯飞星火 VS chatgpt (169)-- 算法导论13.2 2题

福大大架构师每日一题

福大大架构师每日一题

RocksDB深度解析

俞凡

架构

保护你的游戏服务器——游戏盾的功能和优势

德迅云安全_初启

笔记:写Flink SQL Helper时学到的一些姿势

泊浮目

vscode ANTLR antlr4 FlinkSQL

Casper Network 推出 “DevRewards” 计划:允许所有开发者赚取激励

EOSdreamer111

C 语言数组教程:定义、访问、修改、循环遍历及多维数组解析

小万哥

程序人生 编程语言 软件工程 C/C++ 后端开发

ThreadLocal底层源码解析

快乐非自愿限量之名

Thread 底层源码

IINA for Mac:功能强大的开源媒体播放器

Rose

mac视频播放器 IINA下载 好用的苹果媒体播放器 IINA for Mac下载

炫酷鼠标悬停随机渐变文本动画效果

南城FE

CSS 前端 css动画

旧年好,祝新年更好

阿里云视频云

云计算 视频云

2023 总结:我在上海做程序员的第八年

拭心

android 程序员 年度总结

书评:简洁代码──敏捷软件工艺指南_研发效能_Ryan Cooper_InfoQ精选文章