阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

可读性代码:为什么、怎样以及什么时候

  • 2018-10-10
  • 本文字数:1868 字

    阅读完需:约 6 分钟

如果你对开发团队进行问卷,大多数人会说“我们想要可读性高的代码”。你甚至发现有些人认为可读性比功能更重要。但是,当要求人们对可读性做出定义时,他们的意见就会出现分歧。Laura Savino 在 Explore DDD 2018 大会上的演讲就是以这个作为前提。她阐述了为什么我们想要可读性高的代码、可读性究竟意味着什么,以及什么时候必须优先考虑可读性。

Savino 拥有小学法语教师的背景,后来成为 iOS 开发人员和导师,因此,她能够提供更多有关比较自然语言和编程语言的见解。刚开始学习新编程语言的程序员通常先学写一个基本的“Hello,world!”应用程序。同样,“Bonjour”、“Hola”或“Guten-tag”可能是学习法语、西班牙语或德语的人学会的第一个单词。

正如程序员将迅速学会“Hello,world!”,口语也会很快进入中间阶段。Savino 举了一个例子,在法语课上问一个同学是否愿意在课后和你一起去喝咖啡(Voulez-vous prendreuncaféavelve moiaprèslescours?)。即使他拒绝了(Désolé,je ne peux pas prendredecaféprèslescours),在别人看来这是有史以来最无聊的谈话,但你自己却感觉飘飘然:你说了一个句子,然后有人理解它,因为你收到了适当的回应,而你了解回应是什么意思。这就像在 iOS 应用程序中显示数据一样——它不是那么吸引人,但当你第一次成功完成这个任务时,你的肾上腺素会飙升。

学习语言的高级阶段超越了对语法的思考。你的目标已经超越了只是相互理解,你现在需要深入细节。这时候编程语言与人类语言之间的类比开始不再奏效,或者至少需要更深入的分析。

在进行代码评审时,经常会有人说,“我无法理解这些代码”,而另一个人(可能是作者)反驳说,“但这种方式更具可读性”。Savino 用这个例子来说明“可读性取决是谁在阅读代码”。让可读性变得复杂的是代码有两种不同的受众:其他开发人员和计算机。因为计算机如果无法读懂我们的代码,它们很快就会告诉我们,我们自然会基于计算机的反馈做出调整。我们承认这种偏见的存在,有时候会在代码周围加上人类可读的注释。但是,Savino 警告说,“注释并不能带来具备可读性的代码”。

Savino 解释了解读文本或代码与流利阅读之间的区别。她使用 E. E. Cummings 的诗“ when serpents bargain for the right to squirm ”作为例子,一个美丽而复杂的作品需要阅读多次才能真正开始理解其中的含义。当你在阅读代码时遇到不熟悉的术语时需要经历类似的过程——查找一个,然后是下一个,然后是下一个,你就像进了一个兔子洞,直到你忘记了最初想要理解的内容为止。Savino 警告说,虽然可以从深刻的理解中获得快乐,但“写诗与开发软件不是一回事”。

相反,流利的阅读是一种快速而正确的理解,不会占用你的工作记忆。多年的阅读经验让你能够快速浏览文章并仍然能够理解其中的内容。Savino 认为,阅读可读性高的代码也是如此。当代码很容易阅读时,大脑可以腾出一部分发现其中可能出现的问题,让代码评审更加高效。

在给出了高可读性代码为什么如此重要的原因之后,Savino 探讨了如何写出高可读性代码的技术。在与语言不流利的谈话对象沟通时应该避免使用俚语,并使用明确的表达方式。在代码中,方法的命名可以用 beginApp(),而不是 releaseTheHounds(),并在每一步给出变量和调用结果,而不是将函数调用链接在一起。

Savino 还探讨了我们的本能模式匹配能力。在抽象层面,需要使用“斜视测试”来查看代码的一般性结构,看看是否有任何异常的东西。在更低的层面,尽量避免使用看起来相似的字符和符号,包括!、I、l 和 1,这些可能会导致反模式匹配。最后,如果你正在做一些与众不同的东西,那就以一种可以让它从脱颖而出的命名方式。

对于作家来说,最好的建议是“了解你的受众”。Savino 说,当你的受众是阅读你的代码的人时,你应该更进一步,并信任他们。当有人告诉你代码不够清晰时,相信他们,然后问他们因为缺少了哪些信息导致代码难以阅读。用他们的反馈来提高代码的可读性。

最后,Savino 提到了一些可读性需要成为主要驱动因素的例子。简单地说,一段代码越重要,它的可读性就应该越高。Savino 引用了美国宇航局喷气推进实验室的编码指南,该指南指出,“任务关键代码不应该只是可以辩证的,还必须是绝对正确的”。与人类沟通有关的一个更为实际的场景是火灾逃生标志,在逃离火灾时,人们不需要额外的努力看懂这些标志。

你的团队应该针对是否以及何时需要可读代码展开讨论。你的目标应该是所有团队成员都能流利地阅读代码。Savino 最后鼓励每个人进行“更少的解读,更多的创造”。

查看英文原文 Readable Code - Why, How and When You Should Write It

2018-10-10 05:461149
用户头像

发布了 731 篇内容, 共 433.9 次阅读, 收获喜欢 1997 次。

关注

评论 1 条评论

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

CAP原理及作业

橘子皮嚼着不脆

架构师入门学习感悟三

笑春风

第15周作业

Vincent

极客时间 极客大学

Netty源码解析 -- PoolChunk实现原理

binecy

源码 Netty 内存布局

架构师训练营第三周学习笔记

邢永春

架构师训练营第 3 周学习总结

菜青虫

极客大学架构师训练营

极客时间架构师训练营 1 期 - 第 7周总结

Kaven

设计模式示例

Mars

单例模式 组合模式

第二章课后习题

博博

Week3 - 练习

evildracula

架构

使用K3S创建本地开发集群

东风微鸣

Kubernetes k3s Traefik

架构师训练营第七周课后作业

Gosling

极客大学架构师训练营

架构师训练营第三周作业1

韩儿

架构师训练营第三周作业

邢永春

第七周作业

alpha

极客大学架构师训练营

代码重构-设计模式总结

Mars

第7周总结

alpha

极客大学架构师训练营

第三周 单例

Geek_9527

性能压测时,并发压力增加,系统响应时间和吞吐量如何变化

escray

极客大学 极客大学架构师训练营 课程作业

第三周作业

tothegump

极客大学架构师训练营

架构师训练营第 1 期 - 第 7 周课后练习

Anyou Liu

极客大学架构师训练营

架构师训练营第 3 周课后练习

菜青虫

极客大学架构师训练营

Java核心基础——反射

老农小江

Java 基础

全链路压测在信用卡行业的实践

DrawDe朱

全链路压测

Week3 - 代码重构

evildracula

学习 架构

极客时间架构师培训 1 期 - 第 7 周作业

Kaven

中国Java教父把十几年经验总结成:程序员自学的七条路(完整版)

Java架构师迁哥

极客大学 - 架构师训练营 第七周

9527

第二章学习笔记

博博

一站式接口测试服务体系建设

DrawDe朱

接口自动化 自动化测试平台

架构师训练营第七周

我是谁

极客大学架构师训练营

可读性代码:为什么、怎样以及什么时候_语言 & 开发_Thomas Betts_InfoQ精选文章