13年后的共鸣-在代码中用中文命名的优势和问题
早在2004年的关于中文编程 - 张玮的专栏 - 博客频道 - CSDN.NET一文中非常有前瞻性地阐述了用中文编写代码对改善可读性的意义, 今日代码可读性已经越来越被业界重视而成为代码审核的一部分.
文中提到的几个论点尤其有共鸣:
我经常见到为取变量名和类名查字典的情况,这还算是好的。有时候遇到不好查字典或者理解不准确甚至是心情不好,乱起一个名字,就会搞得后来读程序头痛。“道可道,非常道;名可名,非常名”。《道德经》把名放在开篇中,可见一个好的名字的重要性。我觉得名字就代表对事物本质的认识,再加上软件这样一个东西,其中的大部分事物几乎都是创造出来的,如果没有一个好的名字,就会让人很难以理解。我觉得名字差有三方面的原因:
1、名字代表程序员对事物本质的认识,一个坏的名字可能意味着概念的模糊。有可能是程序员对事物的划分不准确,这些东西在一起只是偶然的,从而取不出好的名字,因为这个事物的边界是模糊的;也有可能开始的时候是准确的,但后来随着事物的发展,这个东西的性质已经改变,原来的名字已经反映不出它的本质了。这个时候就需要改一个更准确的名字,但由于没有方法论和工具的保证,这种变动往往不太容易,因此很多人不会愿意做这种变化。…
2、认为名字不重要,这个上面我已经谈到。
3、认识也是准确的,也想取一个好名字,但是因为语言的限制,取不了好名字。
这个正是我想说的问题。因此我们就要在源代码中使用中文。那有的人说,现在的语言大多支持中文的注释,用中文注释不就OK了吗?关于这个观点,请参见Refactoring中的论述,总之,结论是,做为向高级语言进化的第一步,汇编语言中出现的关于变量名,方法名等等,正是自然的表达人的思想的地方,从这个角度上来看,注释倒反是副产品,也就是说,在用变量名,方法名,类名等等不能表达的时候,在用Refactoring不能解决问题的时候,才用注释来解决。
文中提到的问题在13年后的今天也还没有完全的解决:
最现实的一个问题是:环境的支持。最基本的是运行环境和编译环境,我大部分时间都生活在Java环境中,很少数情况会有不支持的情况,我记得遇到过的不支持的情况好象是WebLogic不支持有中文方法名的EJB。总之,这方面的不支持是比较少的。IDE的支持一般也是可以的,但是对输入的支持一般都不好。比如有一个中文方法名,如果要想在弹出的选单中选中文方法名,都是很痛苦的。我能想到的比较好的方法应该是象E语言一样:象输入”中文”,只需要输入”zhongwen”或”zw”,或”zhw”即可。但现在几乎所有的开发工具都不支持,我想有一天这种输入方法应该是会被支持的。
两个问题都是生态环境对中文(或者说非英文)的支持, 这需要更多在源码/文件名中使用中文来推动解决.
关于中文输入法, 理想的解决方式是支持多种输入法(不仅是拼音), 而且与IDE原有的代码自动补全功能无缝集成. 通过插件在主流IDE中实现这一功能。 最近发现了一个开源实现,在TypeScript+VSCode中实现了根据拼音首字母或者拼音的部分来匹配中文标识符。虽然随着VSCode的新版本发布而失效,反映了IDE插件对IDE的依赖性问题,但仍证实了可行性,有不少借鉴意义。