刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释。还有很多人甚至干脆不写注释。所以今天想聊一下到底如何写注释。

提到注释就让我想起一个段子:两个程序员去饭店吃饭,点菜的时候程序员甲说:我要吃宫保鸡丁,程序员乙就帮他记。

宫保鸡丁

然后程序员甲又说:我不想吃宫保鸡丁了,换成地三鲜吧。程序员乙就说好的,然后又帮他记上了。

//宫保鸡丁
地三鲜

这个段子也从侧面反映了程序员们习惯性忽略注释的事实。段子讲完了,下面插播一些正文。

注释不能拯救糟糕的代码

首先,我想说的可能和大多数人的观点相左:尽量少用注释!没错,尽量少用。因为注释是会骗人的,而且时间越长的注释越容易骗人,因为大部分人在修改代码的时候都不会去修改注释。少写注释,尽量用代码去描述你要做什么。当你要写注释的时候,就要思考一下,别人为什么不能通过代码理解你想表达什么。这时你需要尝试修改代码,来达到上述目的。

// Check to see if the employee is eligible for full benefits
if (employee.flags & HOURLY_FLAG) &&(employee.age > 65)

看一下这段代码,如果只看代码,可以理解它要表达什么吗?

if (employee.isEligibleForFUllBenefits())

花上点时间,把代码改成这样,是不是不用注释也可以读懂了?

我们这里说尽量少使用注释,并不是完全不用注释,在某些情况下,我们需要注释。那么什么样的注释才算是好的注释呢?

法律信息

有时,公司代码规范会要求注明版权和著作权。那么我们就应该将这些信息放到源文件的开头位置。

提供信息的注释

// Returns an instance of the Responder being tested.
protected abstract Responder responderInstance()

这样的注释就是不错的注释,给读者提供了返回值的信息,不过,如果我们把函数命名为responderBeingTested,那么这个注释也就显得多余了。

阐释

可以用注释把某些难以理解的参数或返回值翻译成可以理解的形式。当前,前提是如果这些代码你无法修改,比如参数或返回值是标准库的一部分。这时阐释就显得很有用。举过来一个栗子。

assertTrue(a.compareTo(a) == 0);  // a == a
assertTrue(a.compareTo(b) != 0);  // a != b
assertTrue(a.compareTo(b) == -1); // a < b

不过这样的阐释也有缺点,那就是它有可能是不正确的,我们需要小心确认其正确性。如果缺失正确性,那么这样的阐释只会起到负面作用。

TODO注释

TODO注释是比较常用的注释,可以在代码里添加工作列表,例如,对一个空实现函数添加TODO注释,就可以解释这里为什么是空实现,以及以后要实现什么。

公共API的Javadoc

这个也许最令人欣赏的注释习惯了。不过目前我们通常用swagger来代替注释。对swagger感兴趣的童鞋可以戳这里。

所谓见贤思齐焉,见不贤而内自省也。看完了好的注释,就要想想怎么才能写出好的注释;接下来再来看看坏的注释,看的同时需要多反省自己,尽量避免写出坏的注释。

自说自话

写的东西只有自己能看懂,别人都不明白要表达什么。如果读代码时连注释都看不明白,还有人想看下去吗。

日志式注释

几乎把代码的每次修改记录都写到注释里,也许在那个没有代码版本控制工具的远古时代,这么做还有一定的意义。但是现在我们拥有很多健壮的代码版本控制工具,这样的注释也就变得毫无意义。

在代码里加上自己的签名也是一样的道理,我们都可以通过代码版本控制工具查看具体的创建者和修改者,而不是只记住创建者。

注释掉代码也是一样,我们用版本控制工具可以轻松找回以前的代码,不需要的代码可以直接删掉,而不是留一个注释掉的代码放在那里。

废话注释

/** The day of the month. */
private int dayOfMonth;

我不想多废话了……

结语

也许文中的观点和大多数人的思维相左,可能我的有些观点是错的,欢迎大家关注我的微信公众号,和我讨论注释究竟是否必要。


代码洁癖系列(四):可忽略的注相关推荐

  1. 代码洁癖系列(八):迭代的原则

    我们都知道,一个软件的维护成本往往要高于其研发成本.在维护过程中,我们的代码需要不断的进行迭代.迭代的目的有两个:修复bug和增加新特性.但是迭代也会带来一系列新的问题,比如新的bug,或者是破坏代码 ...

  2. 代码洁癖系列(五):外在的格式美

    我们在阅读一些优秀项目的源码时,一定会感叹他们代码的整洁和一致性.而作为第一印象,代码格式的整齐是让人能够继续阅读下去的动力.今天我们分别从垂直格式和横向格式两个方面来讨论代码的格式.修正格式的方法有 ...

  3. 代码洁癖系列(六):处理错误

    程序运行过程中,有些错误是不可避免的,而如何使程序在出现错误时代码仍然正常工作就成了程序员的日常工作之一.那么处理错误和代码整洁有什么关系呢? 前面我们提到过,try-catch代码块会破坏代码的结构 ...

  4. 代码洁癖系列(三):整洁的类和函数

    前面我们讨论了什么样的命名更能够让你赏心悦目,今天来讨论一下面向对象编程过程中最重要的环节,编写类和函数.我们仍然用Java来演示,什么样的类和函数才算是整洁的. 首先讨论函数,函数定义好了,类也就容 ...

  5. 代码洁癖系列(一):什么是整洁代码

    作为一个代码洁癖患者,我最大的愿望就是世界和平--对不起,拿错剧本了,最大的愿望就是将对代码的洁癖传播给每一个人,净化所有的代码.这是一个宏大的愿望,但我会一直努力净化我所看到的每一行代码,并且希望能 ...

  6. 代码洁癖系列(四):可忽略的注释

    刚开始学编程的时候,老师就告诉我们,注释很重要,但是一直到现在,也没有人真正告诉过我要怎么写注释.还有很多人甚至干脆不写注释.所以今天想聊一下到底如何写注释. 提到注释就让我想起一个段子:两个程序员去 ...

  7. 代码洁癖系列(七):单元测试的地位

    在许多程序员眼中,单元测试似乎是可有可无的,觉得这应该是测试人员的工作.实际上,测试代码和生成代码同样重要.我们不但需要测试代码,而且需要的是整洁的测试代码. 测试为什么要整洁 我们对待测试代码需要像 ...

  8. 代码洁癖系列(二):命名的艺术

    不知道大家还记不记得<家有儿女>里有这么一段经典台词:"我叫夏雪","我叫夏雨","我叫夏冰雹". 刘星自己给自己起的名字承包了 ...

  9. 四种代码洁癖类型,程序员看了直呼内行(文末经典书送)

    很多程序员在写代码的时候 都有自己的独特的习惯 比较典型的就是"代码洁癖" 我收集了一些代码洁癖症状 分了四个类型 来看看有没有你对应的吧 一.极简断舍离型 二.距离产生美型 三. ...

最新文章

  1. mysql vip_MySQL高可用集群的VIP切换
  2. Spring中使用RedisTemplate操作Redis(spring-data-redis)
  3. textAngular字体依赖
  4. 手写一个二级选择框联动
  5. php active控件,php – 使用TbActiveForm选择列表中的动态选项
  6. 大数据之-入门_大数据部门组织结构(重点)---大数据之hadoop工作笔记0007
  7. java常用设计模式 看了她,改变你的一生~~~
  8. 《我也能做CTO之程序员职业规划》之四:直线定律
  9. 7-9 字符串字母大小写转换 (15 point(s))
  10. LINUX下Android NDK下载并配置
  11. paip.js input onclick失灵不起作用无反应的解决.txt
  12. 2021-09-02AUC
  13. 2021-09-02最大矩形
  14. 评论列表css样式,评论框CSS样式修改
  15. 行星介绍html页面布局,css3 html5实现太阳系行星公转动画实例
  16. env: bash\r: No such file or directory
  17. isdigit()函数如何判断负数
  18. C++中加速cin与cout神器
  19. Spring的简介和工作原理
  20. 用Java抓取10年大乐透中奖数据

热门文章

  1. 请编写程序,要求输入身高,体重后,输出体质指数
  2. 2022 第五届 浙江省大学生网络与信息安全竞赛技能赛 预赛 Writeup,5题
  3. 专题 | 边缘计算如何促进 “互联网+”智慧能源乘风破浪?
  4. Android编程心得---捕捉Home键事件的完美解决方法
  5. 零基础10小时学会3D基础建模,可能性有多大?现学现用现演示
  6. 基于Java毕业设计采购物料质量检验系统源码+系统+mysql+lw文档+部署软件
  7. 美团外卖/滴滴20201225面试
  8. STPA安全性分析方法
  9. dfrobot红外激光测距传感器的精度,测量距离和应用场景
  10. Laravel安装Xhprof