2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 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:561257
用户头像

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

关注

评论

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

使用 ClusterResourceSet 为 Cluster API 集群自动安装 CNI 插件

Se7en

【MySQL】数据库索引 - 浅谈索引类型

非晓为骁

Go 数据库 索引 MySQL 数据库

2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻

福大大架构师每日一题

golang 算法 福大大

时序引擎架构和实例演练

KaiwuDB

Triple 协议支持 Java 异常回传的设计与实现

Apache Dubbo

Java 开源 微服务 gRPC dubbo

智能低代码平台,驱动企业数字化转型

元年技术洞察

低代码 数字化转型

90%的Java开发人员都会犯的5个错误

JAVA旭阳

Java

说透IO多路复用模型

京东科技开发者

开发 系统 epoll poll Lunix

活动预约报名系统怎么做?快来借鉴「苍山徒步之家」的经验做法

天天预约

微信小程序 SaaS 数据统计 预约工具 活动报名

架构实战营 模块三作业 外包学生管理系统架构设计

西山薄凉

「架构实战营」

Gitea 的邮件通知

HoneyMoose

Java高手速成│Java程序怎样和数据库对话

TiAmo

JDBC 数据库· 12月月更

案例分享:硬件敏捷

ShineScrum

Scrum 敏捷开发 TDD 硬件敏捷

浅谈权限系统在多利熊业务应用

百度Geek说

百度 权限系统 12 月 PK 榜 多利熊

2023年内蒙古等保测评公司有哪些?五家还是6家?

行云管家

等保 等保测评 内蒙古

软件测试|HTTPS 的通信

霍格沃兹测试开发学社

容器安全的三大挑战

SEAL安全

容器安全 12 月 PK 榜

多模态交互在数智化营销服中的技术实践

中关村科金

人工智能 算法 全栈 数字化转型 多模态

如何通过Java应用程序将Word转为Excel

在下毛毛雨

Java Excel word 文档 转换

龙蜥开发者说:众人拾柴火焰高!聊一聊我在社区的所思所想 | 第 14期

OpenAnolis小助手

开发者 开源社区 龙蜥开发者说 LoongArch 架构 红旗软件

Git之使用GitHub搭建远程仓库

芯动大师

GitHub、 git 学习 代码托管 分支管理 clone代码

软件测试面试 | 一面试就紧张,怎么办?

霍格沃兹测试开发学社

PHP 中类自动加载相关文件分析

ModStart

Tapdata Cloud 场景通关系列: Oracle → MySQL 异构实时同步

tapdata

oracle 异构数据 MySQL 数据库 实时数据 数据同步工具

参与Getaverse早期建设,成为节点验证者!!

Geek_Web3

#区块链# did #Web3

信息安全等级测评师证书有效期是多久?谁能告诉一下?

行云管家

等保

非正式全面解析 NebulaGraph 中 Session 管理

NebulaGraph

图数据库 会话管理 session管理

MVP、原型、概念验证,傻傻分不清楚?

敏捷开发

开发 MVP 原型

【Java技术专题】「原理专题」深入分析Java中finalize方法的作用和底层原理

码界西柚

Java JVM Finalizer 12月月更

软件测试简历书写 | 简历中应该如何描述才能体现出软技能的实力 ?

测试人

软件测试 自动化测试 简历 软技能 测试开发

uniapp 在微信小程序中图片宽度显示问题

ModStart

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