ロバートC.マーティンの引用は文脈から外れています。ここにもう少しコンテキストのある引用を示します。
適切に配置されたコメントほど役立つものはありません。軽薄な独断的なコメントほどモジュールを混乱させることはできません。嘘や誤った情報を広める古い無愛想なコメントほど損傷を与えるものはない。
コメントは、シンドラーのリストとは異なります。それらは「純粋な」ものではありません。実際、コメントはせいぜい必要な悪です。プログラミング言語が十分に表現力がある場合、またはそれらの言語を微妙に使用して意図を表現する才能があれば、コメントはあまり必要ありません-おそらくまったくありません。
コメントを適切に使用することは、コードで自己表現できないことを補うためです。失敗という言葉を使用したことに注意してください。本気で言っているんだ。コメントは常に失敗です。私たちは常に彼らなしで自分自身を表現する方法を理解することはできませんが、それらの使用はお祝いの原因ではないため、それらを持っている必要があります。
したがって、コメントを書く必要がある立場にいるときは、考え直して、表を変えてコードで表現する方法がないかどうかを確認してください。コードで自分を表現するたびに、背中をなでてください。コメントを書くたびに、あなたは顔をしかめ、表現能力の障害を感じる必要があります。
(ここからコピーされますが、元の引用はClean Code:A Handbook of Agile Software Craftsmanshipからのものです)
この引用が「コメントは常に失敗」にどのように縮小されるかは、一部の人々が賢明な引用を文脈から外して愚かな教義に変える方法の良い例です。
APIドキュメント(javadocなど)はAPIをドキュメント化することになっているため、ユーザーはソースコードを読む必要なく APIを使用できます。そのため、この場合、ドキュメントでメソッドの機能を説明する必要があります。メソッド名で既に示されているため、「IDで製品を取得する」は冗長であると主張できますが、null
返される可能性のある情報は明らかに重要ではありません。
コメントの必要性を避けたい場合はnull
、APIをより明示的にすることで、根本的な問題(有効な戻り値としての使用)を削除する必要があります。たとえば、何らかの種類のOption<Product>
型を返すことができるため、型シグネチャ自体は、製品が見つからない場合に返される内容を明確に伝えます。
しかし、いずれにしても、メソッド名と型シグネチャだけでAPIを完全に文書化することは現実的ではありません。ユーザーが知っておくべき追加の非自明な情報については、doc-commentsを使用してください。DateTime.AddMonths()
BCLのAPIドキュメントをご覧ください。
AddMonthsメソッドは、うるう年と月の日数を考慮して、結果の月と年を計算し、結果のDateTimeオブジェクトの日の部分を調整します。結果の日が結果の月の有効な日でない場合、結果の月の最後の有効な日が使用されます。たとえば、3月31日+ 1か月= 4月30日。結果のDateTimeオブジェクトの時刻部分は、このインスタンスと同じままです。
メソッド名と署名だけを使用してこれを表現する方法はありません!もちろん、クラスのドキュメントにはこのレベルの詳細は必要ないかもしれませんが、これは単なる例です。
インラインコメントも悪くありません。
悪いコメントは悪いです。コードから自明に見えるものだけを説明するコメントの例、古典的な例は:
// increment x by one
x++;
変数またはメソッドの名前を変更するか、コードを再構築することで明らかにできる何かを説明するコメントは、コードのにおいです:
// data1 is the collection of tasks which failed during execution
var data1 = getData1();
これらはマーティンが反対するコメントの一種です。このコメントは、明確なコードの記述に失敗したことを示しています。この場合、変数とメソッドにわかりやすい名前を使用しています。コメント自体はもちろん問題ではありません。問題はコードを理解するためにコメントが必要なことです。
しかし、コメントがなければならないコードから明らかでないものはすべて、例えばを説明するために使用される理由コードは、特定の非自明な方法を書かれています:
// need to reset foo before calling bar due to a bug in the foo component.
foo.reset()
foo.bar();
過度に複雑なコードが行うことを説明するコメントも臭いですが、修正はコメントを禁止することではなく、修正はコードの修正です!実際の言い方では、複雑なコードは発生しますが(リファクタリングまで一時的にのみ)、通常の開発者が初めて完全なクリーンコードを記述することはありません。複雑なコードは、ないよりも、何を説明するコメントの書き込みをはるかに優れているような場合ではないコメントを書きます。このコメントにより、後でリファクタリングするのも簡単になります。
コードがやむを得ず複雑になる場合があります。複雑なアルゴリズムの場合もあれば、パフォーマンス上の理由から明快さを犠牲にするコードの場合もあります。再びコメントが必要です。