简洁明了的注释有利于代码的阅读和理解,但不必要的注释则会增加代码的维护难度。
下面列举了几种不好的注释习惯,并且给出了改进建议:
namespace CleanCSharp.Comments.Dirty
{
// This defines a class called BasicCalculator
public class Calculator
{
// Define default constructor
public Calculator() { }
// Define a method to add two numbers
public int AddTwoNumbers(int a, int b)
{
// declare an int to hold result int result;
// set result to sum of a and b
result = a + b;
// return the result to the caller
return result;
}
}
}
上段代码中,明显注释过多,且用于描述代码已经表述清楚的内容。这样做,不仅对阅读代码没有帮助,还会显得代码臃肿。
注意以下注释:
// This defines a class called BasicCalculator
public class Calculator
这句注释没有什么意义,并且注释中还把类名写错。注释应当与代码同步更新,代码中的无用注释会在这方面耗费开发人员过多的精力。
对上述代码进行精简,如下:
namespace CleanCSharp.Comments.Dirty
{
public class Calculator
{
public int AddTwoNumbers(int a, int b)
{
result = a + b;
return result;
}
}
}
去除了无用注释及默认无参构造函数后,代码结构更加清晰且更具可读性。
namespace CleanCSharp.Comments.Dirty
{
/* 10 Oct 2010 Sarah Smith - Created initial version
* Edited 20 Oct 2010 Amrit P - change calculation method
* Edited 20 Nov 2010 Jane Q - fix defect 4286
*/
public class MyClass { }
}
上述代码中的注释,主要描述了何时,以及为什么对文件做了修改。
如果代码已被添加到版本控制系统中,那么这些注释就没有必要存在。如果还没有使用版本控制系统,那么,建议你使用版本控制系统对源代码进行管理。
namespace CleanCSharp.Comments.Dirty
{
public class SimpleCalculator
{
// Add two numbers together
public int Calculate(int a, int b)
{
return a + b;
}
}
}
这里的注释可以用良好的方法命名来替代:
namespace CleanCSharp.Comments.Dirty
{
public class SimpleCalculator
{
public int AddNumbers(int a, int b)
{
return a + b;
}
}
}
良好的命名不需要额外的注释来解释,尽可能使用良好的命名来替代注释,而不是用注释解释难以理解的命名。
有时,我们会在代码库中看到已被注释掉的代码,如下所示:
namespace CleanCSharp.Comments.Dirty
{
public class AnotherSimpleCalculator
{
public int AddNumbers(int a, int b)
{
// a = a + 42;
return a + b;
}
}
}
上述代码中的注释// a = a + 42;
会让人疑惑,我们即不清楚这段代码的作用,也不明白它为什么会被注释掉。像这种让读者疑惑的注释降低了代码的可读性。
对于无用(或感觉将来可能有用)或开发中临时添加的代码,不应被直接注释掉,而应尽可能删除,如果需要,我们可以在版本控制系统中查看。
如需保留被注释掉的代码,也应说明注释调的原因及在何种情况下可以恢复。
namespace CleanCSharp.Comments.Dirty
{
/// <summary>
///
/// </summary>
public class BasicCalculator
{
/// <summary>
/// Adds two numbers
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int AddNumbers(int a, int b)
{
return a + b;
}
}
}
虽然IDE会因为我们没有给某个方法或类添加XML注释而生成警告,但我们不应因此而增加无意义的XML注释。
上述代码有近乎一半的篇幅被无意义的XML文档所占据,这会对代码的阅读造成视觉干扰,降低代码阅读效率。下面是去掉XML注释后的代码,简介而又有着良好的可读性。
namespace CleanCSharp.Comments.Dirty
{
public class BasicCalculator
{
public int AddNumbers(int a, int b)
{
return a + b;
}
}
}
通常暴露给第三方调用的API,需要添加较为完备的XML文档注释,以辅助调用方理解API,此时对于XML文档的冗余问题则另当别论。
综上,总结写注释的几点小建议:
- 在编码时尽可能使用良好的命名以达到代码的自描述,这样可以少写注释且可避免注释的词不达意;
- 若非必要,勿添加注释,注释的维护工作也是相当耗费精力的;
- 程序中尽可能不要遗留被注释掉的代码,以免给后来者造成困惑;
一句话:注释是为提升代码可读性和可维护性而存在,若你的注释达不到这个目的,则应考虑是否还有保留注释的必要性。