注释应该告诉您代码没有什么内容,不一定要由WHY,HOW或WHAT来定义。如果您的名字很好,并且函数描述清楚,那么代码很可能会告诉您发生了什么。例如:
List<LightMap> maps = makeLightmaps(receivingModels);
TrianglePartitioner partition = new Octree(castingTriangles);
List<Photon> photons = firePhotons(lights, partition);
if (photons.Count > 0)
{
PhotonPartitioner photonMap = new KDTree(photons);
gatherPhotons(maps, photonMap, partition, lights);
}
此代码确实不需要注释。函数和类型名称使它易于理解。
但是,有时有时候很难或不可能真正制作出像上面这样的流利代码。例如,下一个代码段用于查找球体上的统计随机点。数学是相当不透明的,因此带有解释链接的注释可以帮助告诉它如何工作。这可以被包裹在一个函数来告诉什么它无需评论,如果需要超过一次,否则链接的标题也有助于在该部门。
double randomA = localGenerator.NextDouble();
double randomB = localGenerator.NextDouble();
//http://mathworld.wolfram.com/SpherePointPicking.html
double theta = 2 * Math.PI * randomA;
double phi = Math.Acos(2 * randomB - 1);
Vector3 randomDirection = new Vector3(Settings.ambientRayLength * (float)(Math.Cos(theta) * Math.Sin(phi)),
Settings.ambientRayLength * (float)(Math.Sin(theta) * Math.Sin(phi)),
Settings.ambientRayLength * (float)Math.Cos(phi));
注释何时告诉您代码没有什么的另一个示例是用于解释决策。在下一个示例中,代码不会在线程代码段内锁定非线程局部变量。这是有原因的,评论解释了为什么。没有评论,它可能被认为是一个错误,或者甚至没有被注意到。
Random random = new Random();
Parallel.For(0, maxPhotons, delegate(int photonIndex, ParallelLoopState state)
{
...
//I don't actually care if this random number is unique between threads, threadsafty is not that big of a deal
// in this case and locking the random object could cause a lot of lock contention
while (random.NextDouble() > reflectProbability)
{
...
}
...
}
也许可以改进一下,为什么不首先在并行循环内部创建随机对象。如果没有理由,它也可能使某人出现,并意识到整个想法很愚蠢,是重构的好地方。