• 还有何时需要注释?


    上篇文章中,我强调了注释的非必要性。今天重新反思了一下我设计和实现的过程,发现这篇文章还有一些需要补充的,才算完整。

    在此之前,先说明一下在这两篇文章中,那些“真正”属于注释范畴的东西:既提供给作者和修改者看的,和代码放在一起的文本。

    对于提供给使用者看的文本,比如上篇文章中提到的接口描述,无论是否采用了注释的形式,一概算作文档,不在讨论范畴之内。

    对注释有帮助的情况的个人经验补充

    引用一下上一篇文章说的两种情况:

    1. 一句或一段代码抽象过了头,也许需要跟业务相关的描述建立一个直观的对应。

    2. 因为安排的不够妥帖或者很难妥帖,一段逻辑中蹦出一句为不相关逻辑服务的代码。

    实际上除了这些,还有两种场景让我去写注释:

    3. 脑袋说的那种对接下来要实现的东西的描述,在我的代码中体现为“//TODO:”。

    4. 另外一种情况,我自己认为这里有问题,但是暂时选择了不去修改它,体现为“//CAUTION:”。

    这两种情况和上面两种是不同的。

    这样的注释,会随着项目的进行和重构,一点一点的消失掉。最终我会Find in Files,确认这两个标记已经不在了。

    无论如何,这也是注释,而且它们对我产生了帮助。还有什么是需要注释、或者说注释可以帮助我们的?

    有一些代码留下这样的注释:“以下算法实现了论文xxxxxx,时间复杂度是m,另有论文yyyyy,时间复杂度为n”。

    这就又多了一种情况:

    5. 这种一句话交代背景、指向文档的注释也总是有作用的,它们是一种建立联系的索引。

    这种注释和第一种有相似性,但又有所不同。

    我相信还有其它类似的经验,希望掌握它们的兄弟为大家提个醒,让这个讨论变成建设性的,而不仅仅是一种辩论。

    对上篇文章讨论的一些补充

    那种描述逻辑的注释真的有用吗?按照脑袋的体验是有用的,但是我觉得这种经验确实不是放之四海皆准的;同样,注释无用论也不见得适合每一个人。

    我个人仅仅是认为,让不写注释的兄弟去照顾写注释的,不像很多人想象的那样理所应当,这个上篇文章基本阐述清楚了我的想法。

    对于这个问题,下面再补充一个我个人的经历,有兴趣的可以看看,没兴趣的可以跳过了。

    大家可以先看一下这段代码,这是一个简单的使用javascript解析javascript语法子集的例子。当初我将这段代码翻译成python的,一共花费了1天左右的功夫。

    在核心函数expression的注释上,我花了3个小时去写和改。按照我当时的认识,我会认为这是因为这段代码的复杂度要求我阐述其逻辑,我甚至举了一个精心的例子来描述其执行流程。

    实际上昨天看这些代码(原装的和我翻译的)时,我真正的感受是,这个东西设计的真不咋地。假设当初我看到的是更好的设计和实现,我根本就不会花费那么时间和精力。

    如果这段(原装的)代码是我身边的人写的,那么我会要求他去重构,而不是补上注释。事实上正是因为结构设计的不够优良,实现的也不清晰,才导致自己和别人产生理解上的种种障碍。

    如果说当初我在翻译版本中留下的注释有什么作用,就是提醒我“这段相对其它内容比较复杂,需要仔细一点”。考虑我对自己原先写下的注释(肯定不是错误的)的反应,我不太相信它们能对其他人发挥什么良好作用。

    这段代码的核心是递归下降与算符优先的结合,有人可能注意到了,其作者Douglas Crockford有比注释更详细的文本解释其来龙去脉。更多的内容还出现在《代码之美》之中,我第一次翻译的时候这个中文版就在我手边。

    我要说的是什么呢?我不能说这些文本在当时对我一点帮助没有,但是我个人认为,即使如此详尽的文本,对阅读代码而言,也抵不上清晰可读的结构。

    况且,对于一个有限的时间,我们能写出十好几页16开的注释吗?

  • 相关阅读:
    [WinJS] Promise 用法
    Python 统计代码行
    mac下Apache + MySql + PHP网站开发
    android中,获取网速的方法实现
    如何屏蔽掉两个activity切换时的动画效果
    dp与px的相互转化
    毫秒的格式化
    关于android中事件传递和分发的一些小理解
    汉字转拼音
    关于实现无限循环的做法
  • 原文地址:https://www.cnblogs.com/guaiguai/p/1497206.html
Copyright © 2020-2023  润新知