写点什么

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

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

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

关注

评论

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

关注微信公众号,自动登陆网站

源字节1号

微信小程序

内存问题难定位,那是因为你没用ASAN

华为云开发者联盟

云计算 开发 内存

2022 CCF国际AIOps挑战赛决赛暨AIOps研讨会报名已开启

BizSeer必示科技

人工智能 阿里云 华为云 信通院

导火索:OAuth 2.0四种授权登录方式必读

知识浅谈

8月月更

RT-Thread记录(一、RT-Thread 版本、RT-Thread Studio开发环境 及 配合CubeMX开发快速上手)

矜辰所致

RT-Thread 8月月更

双因子与多因子身份验证有什么区别?

SEAL安全

身份验证

Go编译原理系列6(类型检查)

书旅

Go 源码 后端

莅临GOPS大会龙智展位,获取Forrester最新报告:《Forrester Wave™:2021年第四季度企业服务管理报告》

龙智—DevSecOps解决方案

ITSM Forrester Wave Forrester

数据治理体系演进简介

网易数帆

大数据 数据治理 元数据 数据标准

没开发人员,接到开发物联网系统的活儿,干不干?

AIRIOT

低代码 物联网 低代码,项目开发

开源一夏 | Java格式化日期 微秒

六月的雨在InfoQ

开源 8月月更

HDD杭州站•ArkUI让开发更灵活

HarmonyOS开发者

HarmonyOS

WindTerm:新一代开源免费的终端工具,GitHub星标6.6k+,太酷了!

沉默王二

GitHub 终端工具

Apache APISIX Ingress v1.5-rc1 发布

API7.ai 技术团队

APISIX kubenetes Ingress Controller

五大理由告诉你为什么开发人员选择代码质量静态分析工具Klocwork来实现软件安全

龙智—DevSecOps解决方案

静态代码分析 代码静态分析 SAST工具 SAST

官方发布·2022南京智博会定于10月份在新庄国展召开

AIOTE智博会

版本控制篇 | 龙智邀您共赴GOPS全球运维大会,探索大规模、敏捷、高质量、开放式的软件研发与运营之路

龙智—DevSecOps解决方案

运维 DevSecOps GOPS大会

SonarQube即将亮相第十八届GOPS全球运维大会

龙智—DevSecOps解决方案

代码安全 GOPS大会 运维、 代码质量检测工具

2000多字教你三招在Linux中找出大文件,最后一个命令简直太简单了!

wljslmz

Linux 签约计划第三季 8月月更

Python开启虚拟环境

技术小生

8月月更 Python虚拟环境

多业务模式下的交易链路探索与实践

转转技术团队

中台 状态机 FSM

这份阿里强推的并发编程知识点笔记,将是你拿大厂offer的突破口

了不起的程序猿

数据库 高并发 java程序员 大厂面试 java;

centOS7.3 安装启用 iptables 记录

JavaPub

Linux centos7 iptables

即刻报名|Apache Kylin X Apache DolphinScheduler:大数据底座的构建和展望

Kyligence

数字化转型 数字分析 数据调度

秘乐短视频挖矿系统开发详情

开发微hkkf5566

硅谷来信:快速行动,Facebook、Quora等成功的“神器”!

博文视点Broadview

有多一只“手”的机器狗出没?就在昇腾AI开发者创享日·南京站

科技热闻

【7.29-8.5】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

手摸手带你 在 Windows 系统中安装 Istio

万猫学社

云原生 istio windows

2022年6月互联网医疗领域月度观察

易观分析

医疗 市场

牛刀小试基本语法,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang基本语法和变量的使用EP02

刘悦的技术博客

golang 语言 语言 & 开发 教程分享 #go

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