コメントは、コードが何をしていないかを伝える必要があり、必ずしも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);
}
このコードにはコメントは必要ありません。関数名と型名により、理解しやすくなります。
ただし、場合によっては、上記のような流なコードを実際に作成することは困難または不可能な場合があります。たとえば、次のコードスニペットは、球体上の統計的にランダムなポイントを見つけるためのものです。数学はかなり不透明なので、説明へのリンクを含むコメントは、それがどのように機能するかを伝えるのに役立ちます。これは、伝えるために関数内でラップすることができWHATそうでない場合は、リンクのタイトルは、その部署のに役立ちます、それが複数回必要に応じてコメントを必要とせずに行います。
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));
コメントがコードに含まれていないことを伝える別の例は、決定を説明するためのものです。次の例では、コードはスレッド化されたコード内の非スレッドローカル変数をロックしません。そここの理由は、コメントは説明WHY。コメントがなければ、バグと見なされるか、気づかないこともあります。
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)
{
...
}
...
}
おそらく、ランダムオブジェクトが最初に並列ループ内に作成されない理由を説明するために改善される可能性があります。理由がなければ、誰かが一緒に来て、アイデア全体が愚かであり、リファクタリングのための良い場所であることを認識させることもできます。