代码到底要不要注释 —— 读《Clean Code》Comment一章

代码注释问题是最容易被讨论的。我们常常听到这种说法,一份好的代码有一份完备的注释。又有一种说法,好的代码是自注释的。
说前者的,往往忽视了代码维护的难度。或者干脆就是外行,因为外行怎么能简单粗暴的评价一份代码的好坏呢?最简单的方法就是,注释多就是好代码,没注释就是烂代码。
说后者的往往是经过一些专业的训练,并有一些对维护代码自身的认识的。不过很多情况下,自注释是理想状态。注释有时是难免的。
我认为,通常情况下,当你想注释一段代码的时候,往往应该考虑怎么重构它,而让它更加semantic,如果实在做不到,或者重构的effort非常大,那么可以加一段注释,或者放一个TODO。但起码注释是一种提醒,你的代码或多或少有一点点坏味道了。

Good comments

有一些情况的comment避免不了,本书称之为good comment,暂且罗列,具体也可以参考Uncle Bob的书

  • Legal Comments
  • Informative Comments:注释里放一些逻辑抽象信息,而不要简单机械的重复具体的实现代码
  • Explanation of Intent
  • Clarification
  • Warning of Consequences
  • TODO Comments
  • Amplification
  • Javadocs in Public APIs

即便是这些所谓的good comment,在添加的时候,也不应当是心安理得的。看作者的告诫:

If you are writing a public API, then you should certainly write good javadocs for it. But keep in mind the rest of the advice in this chapter. Javadocs can be just as misleading, nonlocal, and dishonest as any other kind of comment.

即便我们认为的绝对正义的java doc,作者也在警醒我们,这些注释仍然会年久失修,或者传递错误信息。
诚然!这也是我的经验。

Bad comments

在我的经验里,仍然有很多人仍然抱着注释即正义的思路。所以还是想着重指出什么样的注释是不应该的,实际上要么是无用的重复,要么是偷懒的表现。Clean Code一书给出的18个例子可以成为一份checklist来检验我们的代码。本文选取我经常遇到的几种

Mumbling

这种comment指的是,有时候,代码作者在写代码的时候,想要解释或者记录一些信息,便于后续查阅。但这时候通常都是以当时开发时的心境,写下的注释,往往缺乏很多隐含信息的描述。而这样的信息,在经过一段时间后,并不能提供很多有用的信息,而且如果当初的代码逻辑稍作变更,而注释没跟上的话,往往就会造成很多困扰。
例如文中的这个例子:

public void loadProperties() {
    try {
        String propertiesPath = propertiesLocation + "/" + PROPERTIES_FILE;       
        FileInputStream propertiesStream = new FileInputStream(propertiesPath);       
        loadedProperties.load(propertiesStream);
    } catch(IOException e) {
        // No properties files means all defaults are loaded
    }
}

这样的例子在我们的代码中非常常见,我猜这也是作者把这种类型的comment放到第一个的原因吧。在写代码时,我们往往都会有这样的冲动,而且往往这时候我们都自我感觉良好——看,我在做注释了,以后的人(有可能就是几天或者几周后的我)肯定会感激我。
Uncle Bob针对这段注释,发出了灵魂拷问:

Apparently, if we get an IOException, it means that there was no properties file; and in that case all the defaults are loaded.

  • But who loads all the defaults?
  • Were they loaded before the call to loadProperties.load?
  • Or did loadProperties.load catch the exception, load the defaults, and then pass the exception on for us to ignore?
  • Or did loadProperties.load load all the defaults before attempting to load the file?

Was the author trying to comfort himself about the fact that he was leaving the catch block empty? Or—and this is the scary possibility was the author trying to tell himself to come back here later and write the code that would load the defaults?

我认为这样的注释可以出现在最开始的版本里,像作者说的

  • 你可能只是希望后面重新revisit做一些重构
  • 或者可能只是不是想catch-block空着

不管是任何理由,都应该在注释里写清楚,如果希望revisit就写上TODO或者FIXME,如果暂时没考虑清楚要不要catch-block,那也写上TODO或者FIXME,并记录一个item,然后做完手上的一个case之后,回头过来把这里重构了,然后删掉这段注释。

Redundant Comments

这种注释也非常常见。例如:

// Utility method that returns when this.closed is true. Throws an exception 
// if the timeout is reached.
public synchronized void waitForClose(final long timeoutMillis) throws Exception {
    if(!closed)
    {
        wait(timeoutMillis);
        if(!closed) 
            throw new Exception("MockResponseSender could not be closed");
    }
}

再例如:

void read_from_file(const char *name)
{
    char buf[10] = {0};
    
    // open a file
    int fd = open(name, 'r');
    
    // read from it
    int nr = read(fd, buf, sizeof(buf));
    
    return atoi(buf);

这里的注释没有添加任何的附加信息,但是却增加了维护成本,因为代码改,注释就得改,否则就是misleading。我认为绝大多数程序员写这样注释的冲动,只是因为这样的注释让你自我感觉良好,因为我在写注释。

Misleading Comments

这往往出现在一段复杂的逻辑,开发者希望通过注释阐述逻辑的意义,但如果叙述不当,容易产生误解,再如果逻辑有了些许变更,而注释没跟上。那么这个注释就会变成一个大坑,让原本就难以理解的代码更加晦涩难懂。
例如这一段:

// Utility method that returns when this.closed is true. Throws an exception 
// if the timeout is reached.
public synchronized void waitForClose(final long timeoutMillis) throws Exception {
    if(!closed)
    {
        wait(timeoutMillis);
        if(!closed) 
            throw new Exception("MockResponseSender could not be closed");
    }
}

第二个if(!closed),没有出现在注释里,是后加的,还是一开始就没描述清楚?到底是注释对还是代码对?
这种情况,应该删掉注释。否则注释和代码印证不了,到底应该选择相信谁?

Mandated Comments & Javadocs in Nonpublic Code

Mandated Comments的意思是强制的注释。有些不懂的人,往往是Manager,他们不懂技术,他们评价代码好坏的唯一标准就是有没有注释。所以他们也喜欢强调,代码一定要多些注释。更有甚者,每个函数都应该有函数头,为了便于doxygen或javadoc文档话,那要写规范的函数头:

/** 
  *
  * @param title The title of the CD * @param author The author of the CD
  * @param tracks The number of tracks on the CD
  * @param durationInMinutes The duration of the CD in minutes
  */
  public void addCD(String title, String author, int tracks, int durationInMinutes) {...}

这样的函数头在接口文档中是有用的,也是必须的。但每一个函数都加上就有点不伦不类了。甚至是Nonpublic的(C里面,可能就是文件里的static函数)。你看这个函数头,就是变量名的简单重复,有什么意义?未来重构的时候想改个变量名,还得改两遍,少改一点就又会给自己或者别人挖坑了。

Journal Comments & Attributions and Bylines

这两者也比较类似,前者是修改记录,后者表示代码的owner。两者都可以由commit记录表示。后者更可以配合issue system,让信息更加完整

* Changes (from 11-Oct-2001)
* -------------------------
* 11-Oct-2001 : Re-organised the class and moved it to new package
*               com.jrefinery.date (DG);
* 05-Nov-2001 : Added a getDescription() method, and eliminated NotableDate
*               class (DG);
* 12-Nov-2001 : IBD requires setDescription() method, now that NotableDate
*               class is gone (DG); Changed getPreviousDayOfWeek(),
*               getFollowingDayOfWeek() and getNearestDayOfWeek() to correct
*               bugs (DG);

这种注释见的少了,曾经没有版本管理工具的时候,这种类似变更记录的注释会比较多吧。反正我是基本没见过了。

Noise Comments & Scary Noise

跟前面的redundant comment差不多,就是毫无意义的代码的机械重复,只不过noise和scary noise重复的更加令人发指。

/**
  * Default constructor.
  */ 
  protected AnnualDateRule() { }
  
/**
  * Returns the day of the month.
  *
  * @return the day of the month.
  */
  public int getDayOfMonth() { return dayOfMonth; }

Sometimes you see comments that are nothing but noise. They restate the obvious and provide no new information.

把变量名在注释里再打一遍,是不是noise?scary noise就更烦人了:

    /** The name. */
    private String name;

    /** The version. */
    private String version;

    /** The licenceName. */
    private String licenceName;

    /** The version. */
    private String info;

还是那句话,写这些注释只是让自己自我感觉良好,没有什么更多的价值了。

Don’t Use a Comment When You Can Use a Function or a Variable

这一句应当是我们时刻牢记的,当你想注释的时候,先想想是不是能用函数名和变量名来替换你的注释想表达的意思,如果不行再加注释。
你看这一段注释:

// does the module from the global list <mod> depend on the
// subsystem we are part of?
if (smodule.getDependSubsystems().contains(subSysMod.getSubSystem()))

就可以用这一段代码来阐述

ArrayList moduleDependees = smodule.getDependSubsystems();
String ourSubSystem = subSysMod.getSubSystem();
if (moduleDependees.contains(ourSubSystem))

代码在未来是可以参与重构的,而注释不行,你必须花费额外的精力来维护所有的注释。

Function Headers通常就是这样的一种注释,一个好的名字,的确要好于一个好的header注释。

Position Markers & Closing Brace Comments

这两种有点类似,前者是要凸显某个位置的代码,后者是标记括号的归属者。
前者应当用函数来替换你要凸显处的代码,后者你要缩短大括号中的代码长度。

Commented-Out Code

这个是现在命令禁止的了。因为注释掉的代码,有用,但应该是个暂态,在提交之前应该清理。因为一旦提交,别人或者过一段时间以后作者自己,再也没法说清它到底是有用还是没用。所以确定不需要的代码,应该在提交之前做清理,利用版本管理系统来帮你记住这些变更。

HTML Comments

这种注释我见的也不多,似乎是希望用HTML工具来格式化显示代码注释。
例如:

Nonlocal Information

If you must write a comment, then make sure it describes the code it appears near. Don’t offer systemwide information in the context of a local comment.

这种注释见的也比较少,或者可能之前没太注意。应当值得关注。这就像变量的声明应当离使用它的地方越近越好,道理应该是一样的。

Too Much Information

Don’t put interesting historical discussions or irrelevant descriptions of details into your comments.

这里的意思可能是不要放与代码本身逻辑不太相关的,然后很长的注释。但我认为作者不是一味的反对长篇注释。长篇注释在解释复杂的设计时还是有用的。
例如最近在看golang scheduler设计,这其中好些设计细节,就是靠代码文件篇首的长篇注释阐述的。

Inobvious Connection

The connection between a comment and the code it describes should be obvious.

例如:

/*
 * start with an array that is big enough to hold all the pixels
 * (plus filter bytes), and an extra 200 bytes for header info
 */
 this.pngBytes = new byte[((this.width + 1) * this.height * 3) + 200];

What is a filter byte?
Does it relate to the +1?
Or to the *3? Both?
Is a pixel a byte? Why 200?

注释隐含了代码未见的信息。在创作代码的时候,可能开发者心里是门儿清的。但你能保证3天以后,几周几年以后还能知道这些隐含的意思吗?你还能猜得出来吗?

总结

首先得说代码注释是有意义的,肯定是有帮助的,但肯定并不那么包治百病。很多时候我们想注释,其实只是想偷懒。或者想写又懒得写的很完整。记住这就是在为自己或别人挖坑。
我建议,在写注释之前,可以先

  • 思考是否可以通过重构,用代码来阐述注释想表达的内容。
  • 如果只是想简单记录,并且回头再做重构,那就在代码里加上TODO/FIXME。

另外,感谢Uncle Bob给了我们一份不错的checklist。我认为以下几种bad comment特别值得注意:

  • Mumbling
  • Misleading Comments
  • Redundant Comments,Noise,Scary Noise
  • Inobvious Connection
  • Javadocs in Nonpublic Code
%E4%BB%A3%E7%A0%81%E6%B3%A8%E9%87%8A%E9%97%AE%E9%A2%98%E6%98%AF%E6%9C%80%E5%AE%B9%E6%98%93%E8%A2%AB%E8%AE%A8%E8%AE%BA%E7%9A%84%E3%80%82%E6%88%91%E4%BB%AC%E5%B8%B8%E5%B8%B8%E5%90%AC%E5%88%B0%E8%BF%99%E7%A7%8D%E8%AF%B4%E6%B3%95%EF%BC%8C%E4%B8%80%E4%BB%BD%E5%A5%BD%E7%9A%84%E4%BB%A3%E7%A0%81%E6%9C%89%E4%B8%80%E4%BB%BD%E5%AE%8C%E5%A4%87%E7%9A%84%E6%B3%A8%E9%87%8A%E3%80%82%E5%8F%88%E6%9C%89%E4%B8%80%E7%A7%8D%E8%AF%B4%E6%B3%95%EF%BC%8C%E5%A5%BD%E7%9A%84%E4%BB%A3%E7%A0%81%E6%98%AF%E8%87%AA%E6%B3%A8%E9%87%8A%E7%9A%84%E3%80%82%0A%E8%AF%B4%E5%89%8D%E8%80%85%E7%9A%84%EF%BC%8C%E5%BE%80%E5%BE%80%E5%BF%BD%E8%A7%86%E4%BA%86%E4%BB%A3%E7%A0%81%E7%BB%B4%E6%8A%A4%E7%9A%84%E9%9A%BE%E5%BA%A6%E3%80%82%E6%88%96%E8%80%85%E5%B9%B2%E8%84%86%E5%B0%B1%E6%98%AF%E5%A4%96%E8%A1%8C%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%A4%96%E8%A1%8C%E6%80%8E%E4%B9%88%E8%83%BD%E7%AE%80%E5%8D%95%E7%B2%97%E6%9A%B4%E7%9A%84%E8%AF%84%E4%BB%B7%E4%B8%80%E4%BB%BD%E4%BB%A3%E7%A0%81%E7%9A%84%E5%A5%BD%E5%9D%8F%E5%91%A2%EF%BC%9F%E6%9C%80%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%B0%B1%E6%98%AF%EF%BC%8C%E6%B3%A8%E9%87%8A%E5%A4%9A%E5%B0%B1%E6%98%AF%E5%A5%BD%E4%BB%A3%E7%A0%81%EF%BC%8C%E6%B2%A1%E6%B3%A8%E9%87%8A%E5%B0%B1%E6%98%AF%E7%83%82%E4%BB%A3%E7%A0%81%E3%80%82%0A%E8%AF%B4%E5%90%8E%E8%80%85%E7%9A%84%E5%BE%80%E5%BE%80%E6%98%AF%E7%BB%8F%E8%BF%87%E4%B8%80%E4%BA%9B%E4%B8%93%E4%B8%9A%E7%9A%84%E8%AE%AD%E7%BB%83%EF%BC%8C%E5%B9%B6%E6%9C%89%E4%B8%80%E4%BA%9B%E5%AF%B9%E7%BB%B4%E6%8A%A4%E4%BB%A3%E7%A0%81%E8%87%AA%E8%BA%AB%E7%9A%84%E8%AE%A4%E8%AF%86%E7%9A%84%E3%80%82%E4%B8%8D%E8%BF%87%E5%BE%88%E5%A4%9A%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E8%87%AA%E6%B3%A8%E9%87%8A%E6%98%AF%E7%90%86%E6%83%B3%E7%8A%B6%E6%80%81%E3%80%82%E6%B3%A8%E9%87%8A%E6%9C%89%E6%97%B6%E6%98%AF%E9%9A%BE%E5%85%8D%E7%9A%84%E3%80%82%0A%E6%88%91%E8%AE%A4%E4%B8%BA%EF%BC%8C%E9%80%9A%E5%B8%B8%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E5%BD%93%E4%BD%A0%E6%83%B3%E6%B3%A8%E9%87%8A%E4%B8%80%E6%AE%B5%E4%BB%A3%E7%A0%81%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E5%BE%80%E5%BE%80%E5%BA%94%E8%AF%A5%E8%80%83%E8%99%91%E6%80%8E%E4%B9%88%E9%87%8D%E6%9E%84%E5%AE%83%EF%BC%8C%E8%80%8C%E8%AE%A9%E5%AE%83%E6%9B%B4%E5%8A%A0semantic%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%AE%9E%E5%9C%A8%E5%81%9A%E4%B8%8D%E5%88%B0%EF%BC%8C%E6%88%96%E8%80%85%E9%87%8D%E6%9E%84%E7%9A%84effort%E9%9D%9E%E5%B8%B8%E5%A4%A7%EF%BC%8C%E9%82%A3%E4%B9%88%E5%8F%AF%E4%BB%A5%E5%8A%A0%E4%B8%80%E6%AE%B5%E6%B3%A8%E9%87%8A%EF%BC%8C%E6%88%96%E8%80%85%E6%94%BE%E4%B8%80%E4%B8%AATODO%E3%80%82%E4%BD%86%E8%B5%B7%E7%A0%81%E6%B3%A8%E9%87%8A%E6%98%AF%E4%B8%80%E7%A7%8D%E6%8F%90%E9%86%92%EF%BC%8C%E4%BD%A0%E7%9A%84%E4%BB%A3%E7%A0%81%E6%88%96%E5%A4%9A%E6%88%96%E5%B0%91%E6%9C%89%E4%B8%80%E7%82%B9%E7%82%B9%E5%9D%8F%E5%91%B3%E9%81%93%E4%BA%86%E3%80%82%0A%23%23%20Good%20comments%0A%E6%9C%89%E4%B8%80%E4%BA%9B%E6%83%85%E5%86%B5%E7%9A%84comment%E9%81%BF%E5%85%8D%E4%B8%8D%E4%BA%86%EF%BC%8C%E6%9C%AC%E4%B9%A6%E7%A7%B0%E4%B9%8B%E4%B8%BAgood%20comment%EF%BC%8C%E6%9A%82%E4%B8%94%E7%BD%97%E5%88%97%EF%BC%8C%E5%85%B7%E4%BD%93%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%8F%82%E8%80%83Uncle%20Bob%E7%9A%84%E4%B9%A6%0A-%20Legal%20Comments%0A-%20Informative%20Comments%EF%BC%9A%E6%B3%A8%E9%87%8A%E9%87%8C%E6%94%BE%E4%B8%80%E4%BA%9B%E9%80%BB%E8%BE%91%E6%8A%BD%E8%B1%A1%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%80%8C%E4%B8%8D%E8%A6%81%E7%AE%80%E5%8D%95%E6%9C%BA%E6%A2%B0%E7%9A%84%E9%87%8D%E5%A4%8D%E5%85%B7%E4%BD%93%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%BB%A3%E7%A0%81%0A-%20Explanation%20of%20Intent%0A-%20Clari%EF%AC%81cation%0A-%20Warning%20of%20Consequences%0A-%20TODO%20Comments%0A-%20Ampli%EF%AC%81cation%0A-%20Javadocs%20in%20Public%20APIs%0A%0A%E5%8D%B3%E4%BE%BF%E6%98%AF%E8%BF%99%E4%BA%9B%E6%89%80%E8%B0%93%E7%9A%84good%20comment%EF%BC%8C%E5%9C%A8%E6%B7%BB%E5%8A%A0%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E4%B9%9F%E4%B8%8D%E5%BA%94%E5%BD%93%E6%98%AF%E5%BF%83%E5%AE%89%E7%90%86%E5%BE%97%E7%9A%84%E3%80%82%E7%9C%8B%E4%BD%9C%E8%80%85%E7%9A%84%E5%91%8A%E8%AF%AB%EF%BC%9A%0A%3EIf%20you%20are%20writing%20a%20public%20API%2C%20then%20you%20should%20certainly%20write%20good%20javadocs%20for%20it.%20But%20keep%20in%20mind%20the%20rest%20of%20the%20advice%20in%20this%20chapter.%20Javadocs%20can%20be%20just%20as%20misleading%2C%20nonlocal%2C%20and%20dishonest%20as%20any%20other%20kind%20of%20comment.%0A%0A%E5%8D%B3%E4%BE%BF%E6%88%91%E4%BB%AC%E8%AE%A4%E4%B8%BA%E7%9A%84%E7%BB%9D%E5%AF%B9%E6%AD%A3%E4%B9%89%E7%9A%84java%20doc%EF%BC%8C%E4%BD%9C%E8%80%85%E4%B9%9F%E5%9C%A8%E8%AD%A6%E9%86%92%E6%88%91%E4%BB%AC%EF%BC%8C%E8%BF%99%E4%BA%9B%E6%B3%A8%E9%87%8A%E4%BB%8D%E7%84%B6%E4%BC%9A%E5%B9%B4%E4%B9%85%E5%A4%B1%E4%BF%AE%EF%BC%8C%E6%88%96%E8%80%85%E4%BC%A0%E9%80%92%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E3%80%82%0A%E8%AF%9A%E7%84%B6%EF%BC%81%E8%BF%99%E4%B9%9F%E6%98%AF%E6%88%91%E7%9A%84%E7%BB%8F%E9%AA%8C%E3%80%82%0A%0A%23%23%20Bad%20comments%0A%E5%9C%A8%E6%88%91%E7%9A%84%E7%BB%8F%E9%AA%8C%E9%87%8C%EF%BC%8C%E4%BB%8D%E7%84%B6%E6%9C%89%E5%BE%88%E5%A4%9A%E4%BA%BA%E4%BB%8D%E7%84%B6%E6%8A%B1%E7%9D%80%E6%B3%A8%E9%87%8A%E5%8D%B3%E6%AD%A3%E4%B9%89%E7%9A%84%E6%80%9D%E8%B7%AF%E3%80%82%E6%89%80%E4%BB%A5%E8%BF%98%E6%98%AF%E6%83%B3%E7%9D%80%E9%87%8D%E6%8C%87%E5%87%BA%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84%E6%B3%A8%E9%87%8A%E6%98%AF%E4%B8%8D%E5%BA%94%E8%AF%A5%E7%9A%84%EF%BC%8C%E5%AE%9E%E9%99%85%E4%B8%8A%E8%A6%81%E4%B9%88%E6%98%AF%E6%97%A0%E7%94%A8%E7%9A%84%E9%87%8D%E5%A4%8D%EF%BC%8C%E8%A6%81%E4%B9%88%E6%98%AF%E5%81%B7%E6%87%92%E7%9A%84%E8%A1%A8%E7%8E%B0%E3%80%82Clean%20Code%E4%B8%80%E4%B9%A6%E7%BB%99%E5%87%BA%E7%9A%8418%E4%B8%AA%E4%BE%8B%E5%AD%90%E5%8F%AF%E4%BB%A5%E6%88%90%E4%B8%BA%E4%B8%80%E4%BB%BDchecklist%E6%9D%A5%E6%A3%80%E9%AA%8C%E6%88%91%E4%BB%AC%E7%9A%84%E4%BB%A3%E7%A0%81%E3%80%82%E6%9C%AC%E6%96%87%E9%80%89%E5%8F%96%E6%88%91%E7%BB%8F%E5%B8%B8%E9%81%87%E5%88%B0%E7%9A%84%E5%87%A0%E7%A7%8D%0A%0A%23%23%23%20Mumbling%0A%E8%BF%99%E7%A7%8Dcomment%E6%8C%87%E7%9A%84%E6%98%AF%EF%BC%8C%E6%9C%89%E6%97%B6%E5%80%99%EF%BC%8C%E4%BB%A3%E7%A0%81%E4%BD%9C%E8%80%85%E5%9C%A8%E5%86%99%E4%BB%A3%E7%A0%81%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E6%83%B3%E8%A6%81%E8%A7%A3%E9%87%8A%E6%88%96%E8%80%85%E8%AE%B0%E5%BD%95%E4%B8%80%E4%BA%9B%E4%BF%A1%E6%81%AF%EF%BC%8C%E4%BE%BF%E4%BA%8E%E5%90%8E%E7%BB%AD%E6%9F%A5%E9%98%85%E3%80%82%E4%BD%86%E8%BF%99%E6%97%B6%E5%80%99%E9%80%9A%E5%B8%B8%E9%83%BD%E6%98%AF%E4%BB%A5%E5%BD%93%E6%97%B6%E5%BC%80%E5%8F%91%E6%97%B6%E7%9A%84%E5%BF%83%E5%A2%83%EF%BC%8C%E5%86%99%E4%B8%8B%E7%9A%84%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%BE%80%E5%BE%80%E7%BC%BA%E4%B9%8F%E5%BE%88%E5%A4%9A%E9%9A%90%E5%90%AB%E4%BF%A1%E6%81%AF%E7%9A%84%E6%8F%8F%E8%BF%B0%E3%80%82%E8%80%8C%E8%BF%99%E6%A0%B7%E7%9A%84%E4%BF%A1%E6%81%AF%EF%BC%8C%E5%9C%A8%E7%BB%8F%E8%BF%87%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4%E5%90%8E%EF%BC%8C%E5%B9%B6%E4%B8%8D%E8%83%BD%E6%8F%90%E4%BE%9B%E5%BE%88%E5%A4%9A%E6%9C%89%E7%94%A8%E7%9A%84%E4%BF%A1%E6%81%AF%EF%BC%8C%E8%80%8C%E4%B8%94%E5%A6%82%E6%9E%9C%E5%BD%93%E5%88%9D%E7%9A%84%E4%BB%A3%E7%A0%81%E9%80%BB%E8%BE%91%E7%A8%8D%E4%BD%9C%E5%8F%98%E6%9B%B4%EF%BC%8C%E8%80%8C%E6%B3%A8%E9%87%8A%E6%B2%A1%E8%B7%9F%E4%B8%8A%E7%9A%84%E8%AF%9D%EF%BC%8C%E5%BE%80%E5%BE%80%E5%B0%B1%E4%BC%9A%E9%80%A0%E6%88%90%E5%BE%88%E5%A4%9A%E5%9B%B0%E6%89%B0%E3%80%82%0A%E4%BE%8B%E5%A6%82%E6%96%87%E4%B8%AD%E7%9A%84%E8%BF%99%E4%B8%AA%E4%BE%8B%E5%AD%90%EF%BC%9A%0A%60%60%60java%0Apublic%20void%20loadProperties()%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20String%20propertiesPath%20%3D%20propertiesLocation%20%2B%20%22%2F%22%20%2B%20PROPERTIES_FILE%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20FileInputStream%20propertiesStream%20%3D%20new%20FileInputStream(propertiesPath)%3B%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20loadedProperties.load(propertiesStream)%3B%0A%20%20%20%20%7D%20catch(IOException%20e)%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20No%20properties%20files%20means%20all%20defaults%20are%20loaded%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%E8%BF%99%E6%A0%B7%E7%9A%84%E4%BE%8B%E5%AD%90%E5%9C%A8%E6%88%91%E4%BB%AC%E7%9A%84%E4%BB%A3%E7%A0%81%E4%B8%AD%E9%9D%9E%E5%B8%B8%E5%B8%B8%E8%A7%81%EF%BC%8C%E6%88%91%E7%8C%9C%E8%BF%99%E4%B9%9F%E6%98%AF%E4%BD%9C%E8%80%85%E6%8A%8A%E8%BF%99%E7%A7%8D%E7%B1%BB%E5%9E%8B%E7%9A%84comment%E6%94%BE%E5%88%B0%E7%AC%AC%E4%B8%80%E4%B8%AA%E7%9A%84%E5%8E%9F%E5%9B%A0%E5%90%A7%E3%80%82%E5%9C%A8%E5%86%99%E4%BB%A3%E7%A0%81%E6%97%B6%EF%BC%8C%E6%88%91%E4%BB%AC%E5%BE%80%E5%BE%80%E9%83%BD%E4%BC%9A%E6%9C%89%E8%BF%99%E6%A0%B7%E7%9A%84%E5%86%B2%E5%8A%A8%EF%BC%8C%E8%80%8C%E4%B8%94%E5%BE%80%E5%BE%80%E8%BF%99%E6%97%B6%E5%80%99%E6%88%91%E4%BB%AC%E9%83%BD%E8%87%AA%E6%88%91%E6%84%9F%E8%A7%89%E8%89%AF%E5%A5%BD%E2%80%94%E2%80%94%E7%9C%8B%EF%BC%8C%E6%88%91%E5%9C%A8%E5%81%9A%E6%B3%A8%E9%87%8A%E4%BA%86%EF%BC%8C%E4%BB%A5%E5%90%8E%E7%9A%84%E4%BA%BA%EF%BC%88%E6%9C%89%E5%8F%AF%E8%83%BD%E5%B0%B1%E6%98%AF%E5%87%A0%E5%A4%A9%E6%88%96%E8%80%85%E5%87%A0%E5%91%A8%E5%90%8E%E7%9A%84%E6%88%91%EF%BC%89%E8%82%AF%E5%AE%9A%E4%BC%9A%E6%84%9F%E6%BF%80%E6%88%91%E3%80%82%0AUncle%20Bob%E9%92%88%E5%AF%B9%E8%BF%99%E6%AE%B5%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%8F%91%E5%87%BA%E4%BA%86%E7%81%B5%E9%AD%82%E6%8B%B7%E9%97%AE%EF%BC%9A%0A%3EApparently%2C%20if%20we%20get%20an%20IOException%2C%20it%20means%20that%20there%20was%20no%20properties%20%EF%AC%81le%3B%20and%20in%20that%20case%20all%20the%20defaults%20are%20loaded.%20%0A%3E-%20**But%20who%20loads%20all%20the%20defaults%3F**%0A%3E-%20**Were%20they%20loaded%20before%20the%20call%20to%20loadProperties.load%3F**%0A%3E-%20**Or%20did%20loadProperties.load%20catch%20the%20exception%2C%20load%20the%20defaults%2C%20and%20then%20pass%20the%20exception%20on%20for%20us%20to%20ignore%3F**%0A%3E-%20**Or%20did%20loadProperties.load%20load%20all%20the%20defaults%20before%20attempting%20to%20load%20the%20%EF%AC%81le%3F**%0A%3E%0A%3EWas%20the%20author%20trying%20to%20comfort%20himself%20about%20the%20fact%20that%20he%20was%20leaving%20the%20catch%20block%20empty%3F%20Or%E2%80%94and%20this%20is%20the%20scary%20possibility%20was%20the%20author%20trying%20to%20tell%20himself%20to%20come%20back%20here%20later%20and%20write%20the%20code%20that%20would%20load%20the%20defaults%3F%0A%0A%E6%88%91%E8%AE%A4%E4%B8%BA%E8%BF%99%E6%A0%B7%E7%9A%84%E6%B3%A8%E9%87%8A%E5%8F%AF%E4%BB%A5%E5%87%BA%E7%8E%B0%E5%9C%A8%E6%9C%80%E5%BC%80%E5%A7%8B%E7%9A%84%E7%89%88%E6%9C%AC%E9%87%8C%EF%BC%8C%E5%83%8F%E4%BD%9C%E8%80%85%E8%AF%B4%E7%9A%84%0A-%20%E4%BD%A0%E5%8F%AF%E8%83%BD%E5%8F%AA%E6%98%AF%E5%B8%8C%E6%9C%9B%E5%90%8E%E9%9D%A2%E9%87%8D%E6%96%B0revisit%E5%81%9A%E4%B8%80%E4%BA%9B%E9%87%8D%E6%9E%84%0A-%20%E6%88%96%E8%80%85%E5%8F%AF%E8%83%BD%E5%8F%AA%E6%98%AF%E4%B8%8D%E6%98%AF%E6%83%B3catch-block%E7%A9%BA%E7%9D%80%0A%0A%E4%B8%8D%E7%AE%A1%E6%98%AF%E4%BB%BB%E4%BD%95%E7%90%86%E7%94%B1%EF%BC%8C%E9%83%BD%E5%BA%94%E8%AF%A5%E5%9C%A8%E6%B3%A8%E9%87%8A%E9%87%8C%E5%86%99%E6%B8%85%E6%A5%9A%EF%BC%8C%E5%A6%82%E6%9E%9C%E5%B8%8C%E6%9C%9Brevisit%E5%B0%B1%E5%86%99%E4%B8%8ATODO%E6%88%96%E8%80%85FIXME%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%9A%82%E6%97%B6%E6%B2%A1%E8%80%83%E8%99%91%E6%B8%85%E6%A5%9A%E8%A6%81%E4%B8%8D%E8%A6%81catch-block%EF%BC%8C%E9%82%A3%E4%B9%9F%E5%86%99%E4%B8%8ATODO%E6%88%96%E8%80%85FIXME%EF%BC%8C%E5%B9%B6%E8%AE%B0%E5%BD%95%E4%B8%80%E4%B8%AAitem%EF%BC%8C%E7%84%B6%E5%90%8E%E5%81%9A%E5%AE%8C%E6%89%8B%E4%B8%8A%E7%9A%84%E4%B8%80%E4%B8%AAcase%E4%B9%8B%E5%90%8E%EF%BC%8C%E5%9B%9E%E5%A4%B4%E8%BF%87%E6%9D%A5%E6%8A%8A%E8%BF%99%E9%87%8C%E9%87%8D%E6%9E%84%E4%BA%86%EF%BC%8C%E7%84%B6%E5%90%8E%E5%88%A0%E6%8E%89%E8%BF%99%E6%AE%B5%E6%B3%A8%E9%87%8A%E3%80%82%0A%0A%23%23%23%20Redundant%20Comments%0A%E8%BF%99%E7%A7%8D%E6%B3%A8%E9%87%8A%E4%B9%9F%E9%9D%9E%E5%B8%B8%E5%B8%B8%E8%A7%81%E3%80%82%E4%BE%8B%E5%A6%82%EF%BC%9A%0A%60%60%60java%0A%2F%2F%20Utility%20method%20that%20returns%20when%20this.closed%20is%20true.%20Throws%20an%20exception%20%0A%2F%2F%20if%20the%20timeout%20is%20reached.%0Apublic%20synchronized%20void%20waitForClose(final%20long%20timeoutMillis)%20throws%20Exception%20%7B%0A%20%20%20%20if(!closed)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20wait(timeoutMillis)%3B%0A%20%20%20%20%20%20%20%20if(!closed)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Exception(%22MockResponseSender%20could%20not%20be%20closed%22)%3B%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%E5%86%8D%E4%BE%8B%E5%A6%82%EF%BC%9A%0A%60%60%60c%0Avoid%20read_from_file(const%20char%20*name)%0A%7B%0A%20%20%20%20char%20buf%5B10%5D%20%3D%20%7B0%7D%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20open%20a%20file%0A%20%20%20%20int%20fd%20%3D%20open(name%2C%20'r')%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20read%20from%20it%0A%20%20%20%20int%20nr%20%3D%20read(fd%2C%20buf%2C%20sizeof(buf))%3B%0A%20%20%20%20%0A%20%20%20%20return%20atoi(buf)%3B%0A%60%60%60%0A%E8%BF%99%E9%87%8C%E7%9A%84%E6%B3%A8%E9%87%8A**%E6%B2%A1%E6%9C%89%E6%B7%BB%E5%8A%A0%E4%BB%BB%E4%BD%95%E7%9A%84%E9%99%84%E5%8A%A0%E4%BF%A1%E6%81%AF%EF%BC%8C%E4%BD%86%E6%98%AF%E5%8D%B4%E5%A2%9E%E5%8A%A0%E4%BA%86%E7%BB%B4%E6%8A%A4%E6%88%90%E6%9C%AC**%EF%BC%8C%E5%9B%A0%E4%B8%BA%E4%BB%A3%E7%A0%81%E6%94%B9%EF%BC%8C%E6%B3%A8%E9%87%8A%E5%B0%B1%E5%BE%97%E6%94%B9%EF%BC%8C%E5%90%A6%E5%88%99%E5%B0%B1%E6%98%AFmisleading%E3%80%82%E6%88%91%E8%AE%A4%E4%B8%BA%E7%BB%9D%E5%A4%A7%E5%A4%9A%E6%95%B0%E7%A8%8B%E5%BA%8F%E5%91%98%E5%86%99%E8%BF%99%E6%A0%B7%E6%B3%A8%E9%87%8A%E7%9A%84%E5%86%B2%E5%8A%A8%EF%BC%8C%E5%8F%AA%E6%98%AF%E5%9B%A0%E4%B8%BA%E8%BF%99%E6%A0%B7%E7%9A%84%E6%B3%A8%E9%87%8A%E8%AE%A9%E4%BD%A0%E8%87%AA%E6%88%91%E6%84%9F%E8%A7%89%E8%89%AF%E5%A5%BD%EF%BC%8C%E5%9B%A0%E4%B8%BA%E6%88%91%E5%9C%A8%E5%86%99%E6%B3%A8%E9%87%8A%E3%80%82%0A%0A%23%23%23%23%20Misleading%20Comments%0A%E8%BF%99%E5%BE%80%E5%BE%80%E5%87%BA%E7%8E%B0%E5%9C%A8%E4%B8%80%E6%AE%B5%E5%A4%8D%E6%9D%82%E7%9A%84%E9%80%BB%E8%BE%91%EF%BC%8C%E5%BC%80%E5%8F%91%E8%80%85%E5%B8%8C%E6%9C%9B%E9%80%9A%E8%BF%87%E6%B3%A8%E9%87%8A%E9%98%90%E8%BF%B0%E9%80%BB%E8%BE%91%E7%9A%84%E6%84%8F%E4%B9%89%EF%BC%8C%E4%BD%86%E5%A6%82%E6%9E%9C%E5%8F%99%E8%BF%B0%E4%B8%8D%E5%BD%93%EF%BC%8C%E5%AE%B9%E6%98%93%E4%BA%A7%E7%94%9F%E8%AF%AF%E8%A7%A3%EF%BC%8C%E5%86%8D%E5%A6%82%E6%9E%9C%E9%80%BB%E8%BE%91%E6%9C%89%E4%BA%86%E4%BA%9B%E8%AE%B8%E5%8F%98%E6%9B%B4%EF%BC%8C%E8%80%8C%E6%B3%A8%E9%87%8A%E6%B2%A1%E8%B7%9F%E4%B8%8A%E3%80%82%E9%82%A3%E4%B9%88%E8%BF%99%E4%B8%AA%E6%B3%A8%E9%87%8A%E5%B0%B1%E4%BC%9A%E5%8F%98%E6%88%90%E4%B8%80%E4%B8%AA%E5%A4%A7%E5%9D%91%EF%BC%8C%E8%AE%A9%E5%8E%9F%E6%9C%AC%E5%B0%B1%E9%9A%BE%E4%BB%A5%E7%90%86%E8%A7%A3%E7%9A%84%E4%BB%A3%E7%A0%81%E6%9B%B4%E5%8A%A0%E6%99%A6%E6%B6%A9%E9%9A%BE%E6%87%82%E3%80%82%0A%E4%BE%8B%E5%A6%82%E8%BF%99%E4%B8%80%E6%AE%B5%EF%BC%9A%0A%60%60%60java%0A%2F%2F%20Utility%20method%20that%20returns%20when%20this.closed%20is%20true.%20Throws%20an%20exception%20%0A%2F%2F%20if%20the%20timeout%20is%20reached.%0Apublic%20synchronized%20void%20waitForClose(final%20long%20timeoutMillis)%20throws%20Exception%20%7B%0A%20%20%20%20if(!closed)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20wait(timeoutMillis)%3B%0A%20%20%20%20%20%20%20%20if(!closed)%20%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20new%20Exception(%22MockResponseSender%20could%20not%20be%20closed%22)%3B%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%E7%AC%AC%E4%BA%8C%E4%B8%AA%60if(!closed)%60%2C%E6%B2%A1%E6%9C%89%E5%87%BA%E7%8E%B0%E5%9C%A8%E6%B3%A8%E9%87%8A%E9%87%8C%EF%BC%8C%E6%98%AF%E5%90%8E%E5%8A%A0%E7%9A%84%EF%BC%8C%E8%BF%98%E6%98%AF%E4%B8%80%E5%BC%80%E5%A7%8B%E5%B0%B1%E6%B2%A1%E6%8F%8F%E8%BF%B0%E6%B8%85%E6%A5%9A%EF%BC%9F%E5%88%B0%E5%BA%95%E6%98%AF%E6%B3%A8%E9%87%8A%E5%AF%B9%E8%BF%98%E6%98%AF%E4%BB%A3%E7%A0%81%E5%AF%B9%EF%BC%9F%0A%E8%BF%99%E7%A7%8D%E6%83%85%E5%86%B5%EF%BC%8C%E5%BA%94%E8%AF%A5%E5%88%A0%E6%8E%89%E6%B3%A8%E9%87%8A%E3%80%82%E5%90%A6%E5%88%99%E6%B3%A8%E9%87%8A%E5%92%8C%E4%BB%A3%E7%A0%81%E5%8D%B0%E8%AF%81%E4%B8%8D%E4%BA%86%EF%BC%8C%E5%88%B0%E5%BA%95%E5%BA%94%E8%AF%A5%E9%80%89%E6%8B%A9%E7%9B%B8%E4%BF%A1%E8%B0%81%EF%BC%9F%0A%0A%23%23%23%20Mandated%20Comments%20%26%20Javadocs%20in%20Nonpublic%20Code%0AMandated%20Comments%E7%9A%84%E6%84%8F%E6%80%9D%E6%98%AF%E5%BC%BA%E5%88%B6%E7%9A%84%E6%B3%A8%E9%87%8A%E3%80%82%E6%9C%89%E4%BA%9B%E4%B8%8D%E6%87%82%E7%9A%84%E4%BA%BA%EF%BC%8C%E5%BE%80%E5%BE%80%E6%98%AFManager%EF%BC%8C%E4%BB%96%E4%BB%AC%E4%B8%8D%E6%87%82%E6%8A%80%E6%9C%AF%EF%BC%8C%E4%BB%96%E4%BB%AC%E8%AF%84%E4%BB%B7%E4%BB%A3%E7%A0%81%E5%A5%BD%E5%9D%8F%E7%9A%84%E5%94%AF%E4%B8%80%E6%A0%87%E5%87%86%E5%B0%B1%E6%98%AF%E6%9C%89%E6%B2%A1%E6%9C%89%E6%B3%A8%E9%87%8A%E3%80%82%E6%89%80%E4%BB%A5%E4%BB%96%E4%BB%AC%E4%B9%9F%E5%96%9C%E6%AC%A2%E5%BC%BA%E8%B0%83%EF%BC%8C%E4%BB%A3%E7%A0%81%E4%B8%80%E5%AE%9A%E8%A6%81%E5%A4%9A%E4%BA%9B%E6%B3%A8%E9%87%8A%E3%80%82%E6%9B%B4%E6%9C%89%E7%94%9A%E8%80%85%EF%BC%8C%E6%AF%8F%E4%B8%AA%E5%87%BD%E6%95%B0%E9%83%BD%E5%BA%94%E8%AF%A5%E6%9C%89%E5%87%BD%E6%95%B0%E5%A4%B4%EF%BC%8C%E4%B8%BA%E4%BA%86%E4%BE%BF%E4%BA%8Edoxygen%E6%88%96javadoc%E6%96%87%E6%A1%A3%E8%AF%9D%EF%BC%8C%E9%82%A3%E8%A6%81%E5%86%99%E8%A7%84%E8%8C%83%E7%9A%84%E5%87%BD%E6%95%B0%E5%A4%B4%EF%BC%9A%0A%60%60%60java%0A%2F**%20%0A%20%20*%0A%20%20*%20%40param%20title%20The%20title%20of%20the%20CD%20*%20%40param%20author%20The%20author%20of%20the%20CD%0A%20%20*%20%40param%20tracks%20The%20number%20of%20tracks%20on%20the%20CD%0A%20%20*%20%40param%20durationInMinutes%20The%20duration%20of%20the%20CD%20in%20minutes%0A%20%20*%2F%0A%20%20public%20void%20addCD(String%20title%2C%20String%20author%2C%20int%20tracks%2C%20int%20durationInMinutes)%20%7B...%7D%0A%60%60%60%0A%E8%BF%99%E6%A0%B7%E7%9A%84%E5%87%BD%E6%95%B0%E5%A4%B4%E5%9C%A8%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3%E4%B8%AD%E6%98%AF%E6%9C%89%E7%94%A8%E7%9A%84%EF%BC%8C%E4%B9%9F%E6%98%AF%E5%BF%85%E9%A1%BB%E7%9A%84%E3%80%82%E4%BD%86%E6%AF%8F%E4%B8%80%E4%B8%AA%E5%87%BD%E6%95%B0%E9%83%BD%E5%8A%A0%E4%B8%8A%E5%B0%B1%E6%9C%89%E7%82%B9%E4%B8%8D%E4%BC%A6%E4%B8%8D%E7%B1%BB%E4%BA%86%E3%80%82%E7%94%9A%E8%87%B3%E6%98%AFNonpublic%E7%9A%84%EF%BC%88C%E9%87%8C%E9%9D%A2%EF%BC%8C%E5%8F%AF%E8%83%BD%E5%B0%B1%E6%98%AF%E6%96%87%E4%BB%B6%E9%87%8C%E7%9A%84static%E5%87%BD%E6%95%B0%EF%BC%89%E3%80%82%E4%BD%A0%E7%9C%8B%E8%BF%99%E4%B8%AA%E5%87%BD%E6%95%B0%E5%A4%B4%EF%BC%8C%E5%B0%B1%E6%98%AF%E5%8F%98%E9%87%8F%E5%90%8D%E7%9A%84%E7%AE%80%E5%8D%95%E9%87%8D%E5%A4%8D%EF%BC%8C%E6%9C%89%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89%EF%BC%9F%E6%9C%AA%E6%9D%A5%E9%87%8D%E6%9E%84%E7%9A%84%E6%97%B6%E5%80%99%E6%83%B3%E6%94%B9%E4%B8%AA%E5%8F%98%E9%87%8F%E5%90%8D%EF%BC%8C%E8%BF%98%E5%BE%97%E6%94%B9%E4%B8%A4%E9%81%8D%EF%BC%8C%E5%B0%91%E6%94%B9%E4%B8%80%E7%82%B9%E5%B0%B1%E5%8F%88%E4%BC%9A%E7%BB%99%E8%87%AA%E5%B7%B1%E6%88%96%E8%80%85%E5%88%AB%E4%BA%BA%E6%8C%96%E5%9D%91%E4%BA%86%E3%80%82%0A%0A%23%23%23%23%20Journal%20Comments%20%26%20Attributions%20and%20Bylines%0A%E8%BF%99%E4%B8%A4%E8%80%85%E4%B9%9F%E6%AF%94%E8%BE%83%E7%B1%BB%E4%BC%BC%EF%BC%8C%E5%89%8D%E8%80%85%E6%98%AF%E4%BF%AE%E6%94%B9%E8%AE%B0%E5%BD%95%EF%BC%8C%E5%90%8E%E8%80%85%E8%A1%A8%E7%A4%BA%E4%BB%A3%E7%A0%81%E7%9A%84owner%E3%80%82%E4%B8%A4%E8%80%85%E9%83%BD%E5%8F%AF%E4%BB%A5%E7%94%B1commit%E8%AE%B0%E5%BD%95%E8%A1%A8%E7%A4%BA%E3%80%82%E5%90%8E%E8%80%85%E6%9B%B4%E5%8F%AF%E4%BB%A5%E9%85%8D%E5%90%88issue%20system%EF%BC%8C%E8%AE%A9%E4%BF%A1%E6%81%AF%E6%9B%B4%E5%8A%A0%E5%AE%8C%E6%95%B4%0A%60%60%60%0A*%20Changes%20(from%2011-Oct-2001)%0A*%20-------------------------%0A*%2011-Oct-2001%20%3A%20Re-organised%20the%20class%20and%20moved%20it%20to%20new%20package%0A*%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20com.jrefinery.date%20(DG)%3B%0A*%2005-Nov-2001%20%3A%20Added%20a%20getDescription()%20method%2C%20and%20eliminated%20NotableDate%0A*%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class%20(DG)%3B%0A*%2012-Nov-2001%20%3A%20IBD%20requires%20setDescription()%20method%2C%20now%20that%20NotableDate%0A*%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20class%20is%20gone%20(DG)%3B%20Changed%20getPreviousDayOfWeek()%2C%0A*%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20getFollowingDayOfWeek()%20and%20getNearestDayOfWeek()%20to%20correct%0A*%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bugs%20(DG)%3B%0A%60%60%60%0A%E8%BF%99%E7%A7%8D%E6%B3%A8%E9%87%8A%E8%A7%81%E7%9A%84%E5%B0%91%E4%BA%86%EF%BC%8C%E6%9B%BE%E7%BB%8F%E6%B2%A1%E6%9C%89%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E8%BF%99%E7%A7%8D%E7%B1%BB%E4%BC%BC%E5%8F%98%E6%9B%B4%E8%AE%B0%E5%BD%95%E7%9A%84%E6%B3%A8%E9%87%8A%E4%BC%9A%E6%AF%94%E8%BE%83%E5%A4%9A%E5%90%A7%E3%80%82%E5%8F%8D%E6%AD%A3%E6%88%91%E6%98%AF%E5%9F%BA%E6%9C%AC%E6%B2%A1%E8%A7%81%E8%BF%87%E4%BA%86%E3%80%82%0A%0A%23%23%23%20Noise%20Comments%20%26%20Scary%20Noise%0A%E8%B7%9F%E5%89%8D%E9%9D%A2%E7%9A%84redundant%20comment%E5%B7%AE%E4%B8%8D%E5%A4%9A%EF%BC%8C%E5%B0%B1%E6%98%AF%E6%AF%AB%E6%97%A0%E6%84%8F%E4%B9%89%E7%9A%84%E4%BB%A3%E7%A0%81%E7%9A%84%E6%9C%BA%E6%A2%B0%E9%87%8D%E5%A4%8D%EF%BC%8C%E5%8F%AA%E4%B8%8D%E8%BF%87noise%E5%92%8Cscary%20noise%E9%87%8D%E5%A4%8D%E7%9A%84%E6%9B%B4%E5%8A%A0%E4%BB%A4%E4%BA%BA%E5%8F%91%E6%8C%87%E3%80%82%0A%60%60%60java%0A%2F**%0A%20%20*%20Default%20constructor.%0A%20%20*%2F%20%0A%20%20protected%20AnnualDateRule()%20%7B%20%7D%0A%20%20%0A%2F**%0A%20%20*%20Returns%20the%20day%20of%20the%20month.%0A%20%20*%0A%20%20*%20%40return%20the%20day%20of%20the%20month.%0A%20%20*%2F%0A%20%20public%20int%20getDayOfMonth()%20%7B%20return%20dayOfMonth%3B%20%7D%0A%60%60%60%0A%3E%20Sometimes%20you%20see%20comments%20that%20are%20nothing%20but%20noise.%20They%20restate%20the%20obvious%20and%20provide%20no%20new%20information.%0A%0A%0A%E6%8A%8A%E5%8F%98%E9%87%8F%E5%90%8D%E5%9C%A8%E6%B3%A8%E9%87%8A%E9%87%8C%E5%86%8D%E6%89%93%E4%B8%80%E9%81%8D%EF%BC%8C%E6%98%AF%E4%B8%8D%E6%98%AFnoise%EF%BC%9Fscary%20noise%E5%B0%B1%E6%9B%B4%E7%83%A6%E4%BA%BA%E4%BA%86%EF%BC%9A%0A%60%60%60java%0A%20%20%20%20%2F**%20The%20name.%20*%2F%0A%20%20%20%20private%20String%20name%3B%0A%0A%20%20%20%20%2F**%20The%20version.%20*%2F%0A%20%20%20%20private%20String%20version%3B%0A%0A%20%20%20%20%2F**%20The%20licenceName.%20*%2F%0A%20%20%20%20private%20String%20licenceName%3B%0A%0A%20%20%20%20%2F**%20The%20version.%20*%2F%0A%20%20%20%20private%20String%20info%3B%0A%60%60%60%0A%E8%BF%98%E6%98%AF%E9%82%A3%E5%8F%A5%E8%AF%9D%EF%BC%8C%E5%86%99%E8%BF%99%E4%BA%9B%E6%B3%A8%E9%87%8A%E5%8F%AA%E6%98%AF%E8%AE%A9%E8%87%AA%E5%B7%B1%E8%87%AA%E6%88%91%E6%84%9F%E8%A7%89%E8%89%AF%E5%A5%BD%EF%BC%8C%E6%B2%A1%E6%9C%89%E4%BB%80%E4%B9%88%E6%9B%B4%E5%A4%9A%E7%9A%84%E4%BB%B7%E5%80%BC%E4%BA%86%E3%80%82%0A%0A%23%23%23%20Don%E2%80%99t%20Use%20a%20Comment%20When%20You%20Can%20Use%20a%20Function%20or%20a%20Variable%0A%E8%BF%99%E4%B8%80%E5%8F%A5%E5%BA%94%E5%BD%93%E6%98%AF%E6%88%91%E4%BB%AC%E6%97%B6%E5%88%BB%E7%89%A2%E8%AE%B0%E7%9A%84%EF%BC%8C%E5%BD%93%E4%BD%A0%E6%83%B3%E6%B3%A8%E9%87%8A%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E5%85%88%E6%83%B3%E6%83%B3%E6%98%AF%E4%B8%8D%E6%98%AF%E8%83%BD%E7%94%A8%E5%87%BD%E6%95%B0%E5%90%8D%E5%92%8C%E5%8F%98%E9%87%8F%E5%90%8D%E6%9D%A5%E6%9B%BF%E6%8D%A2%E4%BD%A0%E7%9A%84%E6%B3%A8%E9%87%8A%E6%83%B3%E8%A1%A8%E8%BE%BE%E7%9A%84%E6%84%8F%E6%80%9D%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%B8%8D%E8%A1%8C%E5%86%8D%E5%8A%A0%E6%B3%A8%E9%87%8A%E3%80%82%0A%E4%BD%A0%E7%9C%8B%E8%BF%99%E4%B8%80%E6%AE%B5%E6%B3%A8%E9%87%8A%EF%BC%9A%0A%60%60%60java%0A%2F%2F%20does%20the%20module%20from%20the%20global%20list%20%3Cmod%3E%20depend%20on%20the%0A%2F%2F%20subsystem%20we%20are%20part%20of%3F%0Aif%20(smodule.getDependSubsystems().contains(subSysMod.getSubSystem()))%0A%60%60%60%0A%E5%B0%B1%E5%8F%AF%E4%BB%A5%E7%94%A8%E8%BF%99%E4%B8%80%E6%AE%B5%E4%BB%A3%E7%A0%81%E6%9D%A5%E9%98%90%E8%BF%B0%0A%60%60%60java%0AArrayList%20moduleDependees%20%3D%20smodule.getDependSubsystems()%3B%0AString%20ourSubSystem%20%3D%20subSysMod.getSubSystem()%3B%0Aif%20(moduleDependees.contains(ourSubSystem))%0A%60%60%60%0A%E4%BB%A3%E7%A0%81%E5%9C%A8%E6%9C%AA%E6%9D%A5%E6%98%AF%E5%8F%AF%E4%BB%A5%E5%8F%82%E4%B8%8E%E9%87%8D%E6%9E%84%E7%9A%84%EF%BC%8C%E8%80%8C%E6%B3%A8%E9%87%8A%E4%B8%8D%E8%A1%8C%EF%BC%8C%E4%BD%A0%E5%BF%85%E9%A1%BB%E8%8A%B1%E8%B4%B9%E9%A2%9D%E5%A4%96%E7%9A%84%E7%B2%BE%E5%8A%9B%E6%9D%A5%E7%BB%B4%E6%8A%A4%E6%89%80%E6%9C%89%E7%9A%84%E6%B3%A8%E9%87%8A%E3%80%82%0A%0A**Function%20Headers**%E9%80%9A%E5%B8%B8%E5%B0%B1%E6%98%AF%E8%BF%99%E6%A0%B7%E7%9A%84%E4%B8%80%E7%A7%8D%E6%B3%A8%E9%87%8A%EF%BC%8C%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84%E5%90%8D%E5%AD%97%EF%BC%8C%E7%9A%84%E7%A1%AE%E8%A6%81%E5%A5%BD%E4%BA%8E%E4%B8%80%E4%B8%AA%E5%A5%BD%E7%9A%84header%E6%B3%A8%E9%87%8A%E3%80%82%0A%0A%23%23%23%20Position%20Markers%20%26%20Closing%20Brace%20Comments%0A%E8%BF%99%E4%B8%A4%E7%A7%8D%E6%9C%89%E7%82%B9%E7%B1%BB%E4%BC%BC%EF%BC%8C%E5%89%8D%E8%80%85%E6%98%AF%E8%A6%81%E5%87%B8%E6%98%BE%E6%9F%90%E4%B8%AA%E4%BD%8D%E7%BD%AE%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%90%8E%E8%80%85%E6%98%AF%E6%A0%87%E8%AE%B0%E6%8B%AC%E5%8F%B7%E7%9A%84%E5%BD%92%E5%B1%9E%E8%80%85%E3%80%82%0A%E5%89%8D%E8%80%85%E5%BA%94%E5%BD%93%E7%94%A8%E5%87%BD%E6%95%B0%E6%9D%A5%E6%9B%BF%E6%8D%A2%E4%BD%A0%E8%A6%81%E5%87%B8%E6%98%BE%E5%A4%84%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%90%8E%E8%80%85%E4%BD%A0%E8%A6%81%E7%BC%A9%E7%9F%AD%E5%A4%A7%E6%8B%AC%E5%8F%B7%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E9%95%BF%E5%BA%A6%E3%80%82%0A%0A%23%23%23%20Commented-Out%20Code%0A%E8%BF%99%E4%B8%AA%E6%98%AF%E7%8E%B0%E5%9C%A8%E5%91%BD%E4%BB%A4%E7%A6%81%E6%AD%A2%E7%9A%84%E4%BA%86%E3%80%82%E5%9B%A0%E4%B8%BA%E6%B3%A8%E9%87%8A%E6%8E%89%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E6%9C%89%E7%94%A8%EF%BC%8C%E4%BD%86%E5%BA%94%E8%AF%A5%E6%98%AF%E4%B8%AA%E6%9A%82%E6%80%81%EF%BC%8C%E5%9C%A8%E6%8F%90%E4%BA%A4%E4%B9%8B%E5%89%8D%E5%BA%94%E8%AF%A5%E6%B8%85%E7%90%86%E3%80%82%E5%9B%A0%E4%B8%BA%E4%B8%80%E6%97%A6%E6%8F%90%E4%BA%A4%EF%BC%8C%E5%88%AB%E4%BA%BA%E6%88%96%E8%80%85%E8%BF%87%E4%B8%80%E6%AE%B5%E6%97%B6%E9%97%B4%E4%BB%A5%E5%90%8E%E4%BD%9C%E8%80%85%E8%87%AA%E5%B7%B1%EF%BC%8C%E5%86%8D%E4%B9%9F%E6%B2%A1%E6%B3%95%E8%AF%B4%E6%B8%85%E5%AE%83%E5%88%B0%E5%BA%95%E6%98%AF%E6%9C%89%E7%94%A8%E8%BF%98%E6%98%AF%E6%B2%A1%E7%94%A8%E3%80%82%E6%89%80%E4%BB%A5%E7%A1%AE%E5%AE%9A%E4%B8%8D%E9%9C%80%E8%A6%81%E7%9A%84%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%BA%94%E8%AF%A5%E5%9C%A8%E6%8F%90%E4%BA%A4%E4%B9%8B%E5%89%8D%E5%81%9A%E6%B8%85%E7%90%86%EF%BC%8C%E5%88%A9%E7%94%A8%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E6%9D%A5%E5%B8%AE%E4%BD%A0%E8%AE%B0%E4%BD%8F%E8%BF%99%E4%BA%9B%E5%8F%98%E6%9B%B4%E3%80%82%0A%0A%23%23%23%20HTML%20Comments%0A%E8%BF%99%E7%A7%8D%E6%B3%A8%E9%87%8A%E6%88%91%E8%A7%81%E7%9A%84%E4%B9%9F%E4%B8%8D%E5%A4%9A%EF%BC%8C%E4%BC%BC%E4%B9%8E%E6%98%AF%E5%B8%8C%E6%9C%9B%E7%94%A8HTML%E5%B7%A5%E5%85%B7%E6%9D%A5%E6%A0%BC%E5%BC%8F%E5%8C%96%E6%98%BE%E7%A4%BA%E4%BB%A3%E7%A0%81%E6%B3%A8%E9%87%8A%E3%80%82%0A%E4%BE%8B%E5%A6%82%EF%BC%9A%0A!%5B3afcf568c2cee7f9069a698d179c6019.png%5D(evernotecid%3A%2F%2F22617523-9521-4D00-B771-5F27B85F00EB%2Fappyinxiangcom%2F161681%2FENResource%2Fp6066)%0AUncle%20Bob%E5%BB%BA%E8%AE%AE%EF%BC%8C%E5%BA%94%E8%AF%A5%E7%94%B1%E8%A7%A3%E6%9E%90%E6%B3%A8%E9%87%8A%E7%9A%84%E5%B7%A5%E5%85%B7%E6%9D%A5%E8%AE%BE%E8%AE%A1%E8%BF%99%E4%BA%9BHTML%20markup%EF%BC%8C%E8%80%8C%E4%B8%8D%E5%BA%94%E8%AF%A5%E5%86%99%E5%9C%A8%E6%B3%A8%E9%87%8A%E9%87%8C%0A%0A%23%23%23%20Nonlocal%20Information%0A%3E%20If%20you%20must%20write%20a%20comment%2C%20then%20make%20sure%20it%20describes%20the%20code%20it%20appears%20near.%20Don%E2%80%99t%20offer%20systemwide%20information%20in%20the%20context%20of%20a%20local%20comment.%0A%0A%E8%BF%99%E7%A7%8D%E6%B3%A8%E9%87%8A%E8%A7%81%E7%9A%84%E4%B9%9F%E6%AF%94%E8%BE%83%E5%B0%91%EF%BC%8C%E6%88%96%E8%80%85%E5%8F%AF%E8%83%BD%E4%B9%8B%E5%89%8D%E6%B2%A1%E5%A4%AA%E6%B3%A8%E6%84%8F%E3%80%82%E5%BA%94%E5%BD%93%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8%E3%80%82%E8%BF%99%E5%B0%B1%E5%83%8F%E5%8F%98%E9%87%8F%E7%9A%84%E5%A3%B0%E6%98%8E%E5%BA%94%E5%BD%93%E7%A6%BB%E4%BD%BF%E7%94%A8%E5%AE%83%E7%9A%84%E5%9C%B0%E6%96%B9%E8%B6%8A%E8%BF%91%E8%B6%8A%E5%A5%BD%EF%BC%8C%E9%81%93%E7%90%86%E5%BA%94%E8%AF%A5%E6%98%AF%E4%B8%80%E6%A0%B7%E7%9A%84%E3%80%82%0A%0A%23%23%23%20Too%20Much%20Information%0A%3E%20Don%E2%80%99t%20put%20interesting%20historical%20discussions%20or%20irrelevant%20descriptions%20of%20details%20into%20your%20comments.%0A%0A%E8%BF%99%E9%87%8C%E7%9A%84%E6%84%8F%E6%80%9D%E5%8F%AF%E8%83%BD%E6%98%AF%E4%B8%8D%E8%A6%81%E6%94%BE%E4%B8%8E%E4%BB%A3%E7%A0%81%E6%9C%AC%E8%BA%AB%E9%80%BB%E8%BE%91%E4%B8%8D%E5%A4%AA%E7%9B%B8%E5%85%B3%E7%9A%84%EF%BC%8C%E7%84%B6%E5%90%8E%E5%BE%88%E9%95%BF%E7%9A%84%E6%B3%A8%E9%87%8A%E3%80%82%E4%BD%86%E6%88%91%E8%AE%A4%E4%B8%BA%E4%BD%9C%E8%80%85%E4%B8%8D%E6%98%AF%E4%B8%80%E5%91%B3%E7%9A%84%E5%8F%8D%E5%AF%B9%E9%95%BF%E7%AF%87%E6%B3%A8%E9%87%8A%E3%80%82%E9%95%BF%E7%AF%87%E6%B3%A8%E9%87%8A%E5%9C%A8%E8%A7%A3%E9%87%8A%E5%A4%8D%E6%9D%82%E7%9A%84%E8%AE%BE%E8%AE%A1%E6%97%B6%E8%BF%98%E6%98%AF%E6%9C%89%E7%94%A8%E7%9A%84%E3%80%82%0A%E4%BE%8B%E5%A6%82%E6%9C%80%E8%BF%91%E5%9C%A8%E7%9C%8Bgolang%20scheduler%E8%AE%BE%E8%AE%A1%EF%BC%8C%E8%BF%99%E5%85%B6%E4%B8%AD%E5%A5%BD%E4%BA%9B%E8%AE%BE%E8%AE%A1%E7%BB%86%E8%8A%82%EF%BC%8C%E5%B0%B1%E6%98%AF%E9%9D%A0%E4%BB%A3%E7%A0%81%E6%96%87%E4%BB%B6%E7%AF%87%E9%A6%96%E7%9A%84%E9%95%BF%E7%AF%87%E6%B3%A8%E9%87%8A%E9%98%90%E8%BF%B0%E7%9A%84%E3%80%82%0A%0A%23%23%23%20Inobvious%20Connection%0A%3E%20The%20connection%20between%20a%20comment%20and%20the%20code%20it%20describes%20should%20be%20obvious.%0A%0A%E4%BE%8B%E5%A6%82%EF%BC%9A%0A%60%60%60java%0A%2F*%0A%20*%20start%20with%20an%20array%20that%20is%20big%20enough%20to%20hold%20all%20the%20pixels%0A%20*%20(plus%20filter%20bytes)%2C%20and%20an%20extra%20200%20bytes%20for%20header%20info%0A%20*%2F%0A%20this.pngBytes%20%3D%20new%20byte%5B((this.width%20%2B%201)%20*%20this.height%20*%203)%20%2B%20200%5D%3B%0A%60%60%60%0A%3EWhat%20is%20a%20%EF%AC%81lter%20byte%3F%20%0A%3EDoes%20it%20relate%20to%20the%20%2B1%3F%0A%3EOr%20to%20the%20%5C*3%3F%20Both%3F%0A%3EIs%20a%20pixel%20a%20byte%3F%20Why%20200%3F%0A%0A%E6%B3%A8%E9%87%8A%E9%9A%90%E5%90%AB%E4%BA%86%E4%BB%A3%E7%A0%81%E6%9C%AA%E8%A7%81%E7%9A%84%E4%BF%A1%E6%81%AF%E3%80%82%E5%9C%A8%E5%88%9B%E4%BD%9C%E4%BB%A3%E7%A0%81%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E5%8F%AF%E8%83%BD%E5%BC%80%E5%8F%91%E8%80%85%E5%BF%83%E9%87%8C%E6%98%AF%E9%97%A8%E5%84%BF%E6%B8%85%E7%9A%84%E3%80%82%E4%BD%86%E4%BD%A0%E8%83%BD%E4%BF%9D%E8%AF%813%E5%A4%A9%E4%BB%A5%E5%90%8E%EF%BC%8C%E5%87%A0%E5%91%A8%E5%87%A0%E5%B9%B4%E4%BB%A5%E5%90%8E%E8%BF%98%E8%83%BD%E7%9F%A5%E9%81%93%E8%BF%99%E4%BA%9B%E9%9A%90%E5%90%AB%E7%9A%84%E6%84%8F%E6%80%9D%E5%90%97%EF%BC%9F%E4%BD%A0%E8%BF%98%E8%83%BD%E7%8C%9C%E5%BE%97%E5%87%BA%E6%9D%A5%E5%90%97%EF%BC%9F%0A%0A%23%23%20%E6%80%BB%E7%BB%93%0A%E9%A6%96%E5%85%88%E5%BE%97%E8%AF%B4%E4%BB%A3%E7%A0%81%E6%B3%A8%E9%87%8A%E6%98%AF%E6%9C%89%E6%84%8F%E4%B9%89%E7%9A%84%EF%BC%8C%E8%82%AF%E5%AE%9A%E6%98%AF%E6%9C%89%E5%B8%AE%E5%8A%A9%E7%9A%84%EF%BC%8C%E4%BD%86%E8%82%AF%E5%AE%9A%E5%B9%B6%E4%B8%8D%E9%82%A3%E4%B9%88%E5%8C%85%E6%B2%BB%E7%99%BE%E7%97%85%E3%80%82%E5%BE%88%E5%A4%9A%E6%97%B6%E5%80%99%E6%88%91%E4%BB%AC%E6%83%B3%E6%B3%A8%E9%87%8A%EF%BC%8C%E5%85%B6%E5%AE%9E%E5%8F%AA%E6%98%AF%E6%83%B3%E5%81%B7%E6%87%92%E3%80%82%E6%88%96%E8%80%85%E6%83%B3%E5%86%99%E5%8F%88%E6%87%92%E5%BE%97%E5%86%99%E7%9A%84%E5%BE%88%E5%AE%8C%E6%95%B4%E3%80%82%E8%AE%B0%E4%BD%8F%E8%BF%99%E5%B0%B1%E6%98%AF%E5%9C%A8%E4%B8%BA%E8%87%AA%E5%B7%B1%E6%88%96%E5%88%AB%E4%BA%BA%E6%8C%96%E5%9D%91%E3%80%82%0A%E6%88%91%E5%BB%BA%E8%AE%AE%EF%BC%8C%E5%9C%A8%E5%86%99%E6%B3%A8%E9%87%8A%E4%B9%8B%E5%89%8D%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%85%88%0A-%20%E6%80%9D%E8%80%83%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E9%87%8D%E6%9E%84%EF%BC%8C%E7%94%A8%E4%BB%A3%E7%A0%81%E6%9D%A5%E9%98%90%E8%BF%B0%E6%B3%A8%E9%87%8A%E6%83%B3%E8%A1%A8%E8%BE%BE%E7%9A%84%E5%86%85%E5%AE%B9%E3%80%82%0A-%20%E5%A6%82%E6%9E%9C%E5%8F%AA%E6%98%AF%E6%83%B3%E7%AE%80%E5%8D%95%E8%AE%B0%E5%BD%95%EF%BC%8C%E5%B9%B6%E4%B8%94%E5%9B%9E%E5%A4%B4%E5%86%8D%E5%81%9A%E9%87%8D%E6%9E%84%EF%BC%8C%E9%82%A3%E5%B0%B1%E5%9C%A8%E4%BB%A3%E7%A0%81%E9%87%8C%E5%8A%A0%E4%B8%8ATODO%2FFIXME%E3%80%82%0A%0A%E5%8F%A6%E5%A4%96%EF%BC%8C%E6%84%9F%E8%B0%A2Uncle%20Bob%E7%BB%99%E4%BA%86%E6%88%91%E4%BB%AC%E4%B8%80%E4%BB%BD%E4%B8%8D%E9%94%99%E7%9A%84checklist%E3%80%82%E6%88%91%E8%AE%A4%E4%B8%BA%E4%BB%A5%E4%B8%8B%E5%87%A0%E7%A7%8Dbad%20comment%E7%89%B9%E5%88%AB%E5%80%BC%E5%BE%97%E6%B3%A8%E6%84%8F%EF%BC%9A%0A-%20Mumbling%0A-%20Misleading%20Comments%0A-%20Redundant%20Comments%EF%BC%8CNoise%EF%BC%8CScary%20Noise%0A-%20Inobvious%20Connection%0A-%20Javadocs%20in%20Nonpublic%20Code%0A%0A