写点什么

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

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

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

关注

评论

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

聊聊 Kafka: Consumer 源码解析之 Rebalance 机制

老周聊架构

签约计划第二季

读写锁ReentranReadWriteLock源码分析

Ayue、

读写锁 lock

php项目使用xdebug远程调试

try catch

php 调试 Xdebug

【转】java开发之SpringBoot数据校验机制

@零度

Spring Boot JAVA开发

常回家看看

Tiger

28天写作

技术职场主题线上沙龙|程序员百万年薪进阶指南

智联卓聘

职场成长 Java技术提升 技术职场 百万年薪

如何命名指标和标签

耳东@Erdong

Prometheus label Metric Naming

结束了(26/28)

赵新龙

28天写作

前端开发:基于移动端的Vue项目的Loading使用

三掌柜

28t 28天写作 12月日更

电子书网站推荐

坚果

28天写作 12月日更

Vue学习的4个实用的Javascript技巧

编程江湖

VUE 3.0 源码

画饼,是领导者的基本技能

搬砖的周狮傅

管理 管理经

开源 Serverless 里程碑:Knative 1.0 来了

阿里巴巴云原生

阿里云 开源 Serverless 云原生 Knative

如何强化应用安全能力,全面拦截 Log4j 漏洞攻击

阿里巴巴云原生

阿里云 云原生 安全 log4j

架构实战营模块七作业

孙志强

架构实战营

书单 | 这6本书,带你轻松学习自动化办公

博文视点Broadview

某俄罗斯小哥,竟靠一个服务器软件直接封神?

沉默王二

nginx

架构训练营 - 模块八

Geek_9de3de

架构实战营

Dubbo 框架学习笔记十三

风翱

dubbo 12月日更

架构实战营模块七作业

spark99

架构实战营

前端开发:自定义时间轴的使用

三掌柜

28t 28天写作 12月日更

架构实战训练营-模块4-作业

温安适

「架构实战营」

更快的Maven来了,我的天,速度提升了8倍!

王磊

分析内部运行机制,教你解决Redis性能问题

华为云开发者联盟

数据库 redis 缓存 GaussDB(for Redis) 结构化存储

云图说|ModelArts Pro:让AI开发更简单

华为云开发者联盟

AI 华为云 ModelArts Pro 云图说

25《重学JAVA》--多线程(二)

杨鹏Geek

Java25周年 28天写作 12月日更

数据编织趋势探秘

Kafka中文社区

“积木拼装”,HarmonyOS弹性部署大揭秘!|HDC2021技术分论坛

HarmonyOS开发者

HarmonyOS

PassJava 开源 (八) :Spring Cloud 整合 Nacos配置中心

悟空聊架构

nacos 28天写作 passjava 悟空聊架构 12月日更

给弟弟的信第25封|这个世界有上帝吗?

大菠萝

28天写作

SpringBoot2 API接口签名实现

编程江湖

springboot

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