程序员应该避免写注释

简介: “程序员工作效率有多高,取决于他大脑中对当前项目的熟悉程度,即变量名称、数据结构、编程接口以及工具类甚至是目录等,这些细节记住的越多,效率也越高。”注释不是用来翻译程序代码的,用代码能说清楚的东西,就不要再用自然语言费脑子去写了,集中精力写出最优雅、质量高的代码才是首要的。

“程序员工作效率有多高,取决于他大脑中对当前项目的熟悉程度,即变量名称、数据结构、编程接口以及工具类甚至是目录等,这些细节记住的越多,效率也越高。”

注释不是用来翻译程序代码的,用代码能说清楚的东西,就不要再用自然语言费脑子去写了,集中精力写出最优雅、质量高的代码才是首要的。这并不是说可以完全不写注释,而是说不要为了添加不必要的注释而打乱你的思路。我很赞成这两篇文章的观点《世上最糟糕的两个变量名》以及陆其明老师翻译的《避免在代码里写注释》,有一个好的变量名、方法名其实就是一段很好的注释了,并且还会“自动更新”,你不用在未来优化这段代码的时候同步更新注释。

我们写注释的目的不是说这段代码如何执行,而是想解释为什么要这么执行,这也正是与其研究代码、研究注释,不如研究写下这些代码的人,借用一下阿特伍德的博客原文中的例子:

r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

这段代码没有注释就完全看不懂了,如果加上一点注释说明一下则效果要好得多:

// 用“牛顿-拉夫逊”近似法求解n的平方根
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

这么一来注释的作用就完成体现出来了,但是如果不用注释呢?像这样:

private double SquareRootApproximation(n) {
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
return r;
}
System.out.println( "r = " + SquareRootApproximation(r) );
“我一行注释也没有加,但这段神秘的代码现在已经非常容易理解了。”

我们每个人在项目中应该都有遇到过这样的事情,与其让他写下一堆注释,不如告诉他命名的重要性,能完全、准确地描述所代表的事物,这无疑能提高整个项目的可读性。在命名方面也有一些陷阱,如果一个命名不能做到准确的命名,这就和一段错误的注释描述正确的行为一样让人更加费解,而且如果你在命名一个类时没有考虑太多,在后期发觉不好,要更换名称的时候会很麻烦,你可能要改头文件的名称、实现文件的名称,各种调用以及导入的地方,甚至是创建文件时自动生成的一点注释,就这要求我们在创建一个类和方法时,头脑中至少要对将要做的事情“优化”好几遍,能准确无误的表达自己想表达的东西,对一些人来说,这个过程会很累,但确实是有必要。

对命名使用准确的对仗词,有助于保持代码一致性,最终提高可读性。针对变量使用的对仗词:

  • begin/end
  • first/last
  • locked/unlocked
  • min/max
  • next/previous
  • old/new
  • opened/closed
  • visible/invisible
  • source/target
  • source/destination
  • up/down
针对方法名使用的对仗词:
  • add/remove
  • increment/decrement
  • open/close
  • begin/end
  • insert/delete
  • show/hide
  • create/destroy
  • lock/unlock
  • source/target
  • first/last
  • min/max
  • start/stop
  • get/put
  • next/previous
  • up/down
  • get/set
  • old/new
对于子程序(方法实现)过长的情况,要检查子程序的设计以及实现是否合理,必要的时候把子程序拆分为多个子程序,保持每个子程序的高内聚性(只做好一件事)总是有好处的。

千万不要把 bool 当成函数参数》这篇文章提出的问题很有意思,对于布尔变量,可以给布尔变量赋予隐含“真假”含义的名字。

最后,对你自己写下的代码,不要心存畏惧,不要把它尘封在那里,保持它的活跃度,在适当的时间对它进行重构,如果要问重构到什么地步,那就是:到你没时间重构为止


目录
相关文章
|
前端开发 JavaScript API
用的前端框架都有什么
【8月更文挑战第26天】用的前端框架都有什么
968 2
|
7月前
|
JSON API 开发者
淘宝拍立淘图片搜索API接口指南(淘宝API系列)
淘宝拍立淘图片搜索API为电商应用提供强大的技术支持,允许用户通过上传图片查找相似商品。开发者需在淘宝开放平台注册并获取权限,使用HTTP POST请求上传图片数据,返回商品列表信息如标题、价格等。该接口有助于提高购物效率和市场分析。示例代码展示了如何用Python调用此API,包括参数设置、签名生成和请求发送。
|
缓存 监控 前端开发
WEB前端三大主流框架:React、Vue与Angular
在Web前端开发中,React、Vue和Angular被誉为三大主流框架。它们各自具有独特的特点和优势,为开发者提供了丰富的工具和抽象,使得构建复杂的Web应用变得更加容易。
1919 6
|
运维 安全 数据库
构建多租户应用程序:深入探讨Entity Framework Core中的租户支持策略与实现
【8月更文挑战第31天】在现代软件开发中,多租户架构因高效利用资源和简化运维而备受企业青睐,尤其在SaaS应用中。本文以一个多租户在线调查应用为例,介绍如何在Entity Framework Core中实现多租户支持。首先,在实体中添加`TenantId`字段以区分不同租户的数据;其次,在查询时根据当前租户信息进行筛选。这种方法简单有效,能确保数据安全隔离,但也需关注随着租户数量增长带来的数据库管理复杂性问题,并考虑分区表等优化策略。
170 0
|
资源调度 JavaScript 前端开发
vue3怎么调用vant中的icon组件
vue3怎么调用vant中的icon组件
473 4
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
ARIMA、ARIMAX、 动态回归和OLS 回归预测多元时间序列
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux cfdisk命令使用教程 磁盘分区管理工具
【Shell 命令集合 磁盘维护 】Linux cfdisk命令使用教程 磁盘分区管理工具
212 0
|
算法
判断单链表是否有环?中点如何判断?入环点如何判断?
判断单链表是否有环?中点如何判断?入环点如何判断?
177 0
|
存储 JavaScript 编译器
【TypeScript教程】# 3:TS的类型声明
【TypeScript教程】# 3:TS的类型声明
326 0
【TypeScript教程】# 3:TS的类型声明
|
开发者
阿里云s6/c6/g6/r6/c7/g7/r7云服务器及轻量应用服务器最新优惠价格
我们在购买阿里云服务器的时候,绝大部分新手用户都是选择阿里云优惠中的s6/c6/g6/r6/c7/g7/r7云服务器及轻量应用服务器,因为这些实例的入门级配置可以满足普通的个人小型网站,个人博客等小流量网站,高一点的配置可以满足品牌官网类、视频、购物类、游戏、软件类网站,涵盖了绝大部分用户的网站类型。作为新手用户,最为关心的是优惠价格,以下是这些实例云服务器的最新优惠价格。
阿里云s6/c6/g6/r6/c7/g7/r7云服务器及轻量应用服务器最新优惠价格