写点什么

代码会因近似英语而变得更好吗?

  • 2008-01-21
  • 本文字数:1311 字

    阅读完需:约 4 分钟

通过编写像英语的代码来实现可读性和表达力,在当今业界是呈上升趋势的。在 DSL(Domain Specific Languages)和 BDD(Behavior Driven Development)社区中尤其如此,而许多 Java、C#、Ruby 开发人员也在设法让自己的代码看上去尽可能地近似英语。

Michael Feathers 在他的文章《叙述的冲动》中挑战了“代码因近似英语而变得更好”的观点。正如 Martin Fowler 和 Neal Ford 在他们关于 DSLs 的介绍中强调的一样,表达力和可读性有利于提高可维护性、增进程序员对业务的理解。Michael Feathers 并不怀疑这一事实。但是,他强调,“我们追求表达力的时候,自然语言不应该是唯一的探索方向”。

文本可以有很多不同的理解方式,这是一个不能忽视的事实。Feathers 比较了叙述模式和符号模式:

叙述模式里,我们处理像散文似的文本,并用阅读英语或其它自然语言的方式来阅读它——这取悦了我们大脑中的语言中枢。而符号模式则比较形象化。

因此,也可以用符号方式来产生表达力,Feathers 指出,在某些情况下,符号方式可能比类英语的方式更为合适。他概括了会影响到对方法的选择的若干折衷因素。

Feathers 认为叙述模式更适合于面向用户的工具,而不适合“由程序员编写和供程序员阅读的代码”。但是,更重要的是,这个选择取决于领域的特性。根据 Feathers 的意思,首先,它可能取决于“定义和术语系统有多成熟”,尽管判断的标准不那么清晰:

一方面,如果你面对的是像日期或者科学单位这样的领域,它们的定义和术语系统是很明确的,那么在你的 API 中使用自然语言会比较有利。当定义明确后,DSL 体系进行大的重构的机会是很少的。另一方面,一旦定义明确下来并得到充分的理解,这时转向符号方式可以帮你消除大量的 cruft(译注:随着软件的发展,以及经历了修改 Bug 和重构的若干周期之后,软件的部分代码已不再使用,但这些代码仍然保留在源码中,这种代码称为 cruft。cruft 可能是一两行无用的代码,也可能是整个源文件模块)。

Feathers 也强调说,在一些领域,用文字表述一项任务并不容易。在这种情况下,符号表示可以“使代码理解变得轻而易举”,因为它“比我们使用的自然语言更精确”。在他的另外一篇帖子《叙述与符号编程的利弊权衡》中,Feathers 进一步强化了这一思想。他给出了一个符号方式的例子,是针对音乐作曲的嵌入式 DSL:

funkGroove

= let p1 = perc LowTom qn

p2 = perc AcousticSnare en

in Tempo 3 (Instr Percussion (cut 8 (repeatM

((p1 :+: qnr :+: p2 :+: qnr :+: p2 :+:

p1 :+: p1 :+: qnr :+: p2 :+: enr)

:=: roll en (perc ClosedHiHat 2))

)))

据 Feathers 所说,符号模式在这一特定领域运作良好,因为“人们会听到音符和看见纸上的音符,但却不怎么会去讨论音符是一个跟着一个怎样排列的”。更一般地说,他认为符号方式更适合有关结构的程序,而不是有关语义的程序,有关语义的程序则更适合用叙述模式。

因此,选择类英语的代码作为提高可读性和表达力的方式之前,若干因素应该被纳入考虑。对于 Michael Feathers 介绍的符号方式的表达能力和不同的利弊之权衡,你有什么经验呢?


相关新闻:“Literate Testing” for Readable JUnit Tests查看英文原文 Does code become better as it approaches English?

2008-01-21 03:561264
用户头像

发布了 151 篇内容, 共 69.1 次阅读, 收获喜欢 18 次。

关注

评论

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

人工智能如何从神话走向科学的?

天津汇柏科技有限公司

人工智能 AI 人工智能

Elasticsearch开源仓库404 7万多star一夜清零

吴脑的键客

数据库 搜索引擎

TiDB数据库出现性能问题,如何利用数据库性能诊断工具DBdoctor一分钟诊断!

TiDB 社区干货传送门

性能调优 实践案例 管理与运维 安装 & 部署 应用适配

Emeritus硅谷AI深度研学之旅圆满落幕,探索AI前沿投资洞察!

科技汇

1024程序员节 | 华为与开发者共筑智能应用新生态

极客天地

鸿蒙网络编程系列42-仓颉版域名解析示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

突破 RAG 局限,KAG 专业领域知识服务框架正式开源!

可信AI进展

TiKV Raft Store 内存管理的原理与实现丨TiKV 源码解读(二十三)

TiDB 社区干货传送门

GreptimeDB vs. SQLite —— 高通 8155 平台上的性能对比报告

Greptime 格睿科技

sqlite 数据库 边缘计算 嵌入式 性能报告

观测云:简化复杂的云账单,让企业轻松掌控云成本

观测云

云账单

TiDB Vector 本地部署体验

TiDB 社区干货传送门

8.x 实践 TiDB Cloud TiDB Vector

Java如何实现企业微信审批流程

威哥爱编程

Java 微信 企业微信开发

商协会管理系统(源码+文档+部署+讲解)

深圳亥时科技

探讨Java深搜算法的学习笔记

威哥爱编程

Java 算法 DFS

Llama 3.2 Vision & Molmo:多模态开源生态系统基础

Baihai IDP

程序员 AI Baihai IDP Llama 3.2 Vision Molmo

CST如何进行局部网格剖分

思茂信息

cst cst使用教程 电磁仿真

智慧停车系统(源码+文档+部署+讲解)

深圳亥时科技

用二维码展示信息,有哪些常见应用场景

草料二维码

ChatGPT Search 上线 允许用户像使用搜索引擎一样完成即时搜索

吴脑的键客

ChatGPT Azure OpenAI

TiDB 集群组件间开启 TLS(双向认证

TiDB 社区干货传送门

7.x 实践

HyperWorks二维网格划分及拓扑改进

智造软件

Hypermesh 网格划分 有限元

10分钟写一个tidb-ai机器人帮你解答tidb问题

TiDB 社区干货传送门

新版本/特性解读

TiDB br日志备份PermissionDenied

TiDB 社区干货传送门

实践案例 备份 & 恢复

Rust 在 Android 的编程实践——技术驱动的车云一体化解决方案探索

Greptime 格睿科技

android rust 时序数据库 车云

【论文速读】| APILOT:通过避开过时API陷阱,引导大语言模型生成安全代码

云起无垠

软件测试学习笔记丨Flask框架-集成Swagger文档

测试人

软件测试

知乎 PB 级数据:超大规模TiDB集群管控实践

TiDB 社区干货传送门

实践案例 集群管理 数据库架构设计 HTAP 场景实践

Merge-region 原理及常见问题

TiDB 社区干货传送门

故障排查/诊断

代码会因近似英语而变得更好吗?_架构_Sadek Drobi_InfoQ精选文章