InfoQ

InfoQ

News

マイブックマーク

ブックマークするためにログイン または 会員登録 する

ブックマークされました!

ブックマークがエラーになりました。もう一度お願いします。

コメントを書くべきか書かざるべきか

作者 Abel Avram , 翻訳者 笹井 崇司 投稿日 2010年3月9日

セクション
プロセス/プラクティス,
デベロップメント,
設計/アーキテクチャ
トピック
プログラミング ,
Delivering Quality ,
Architecture
タグ
Coding Standards

原文(投稿日:2010/03/03)へのリンク

開発者ならだれもが、自分のコードに最低一行はコメントを書いているはずだ。コメントをたくさん書いて、コードをもっとわかりやすくしようとする人もいる。この記事では、コードにコメントを書くときに使われるプラクティスを集めてみた。

Seattle Area Alt.Net グループのメンバらが、コードにコメントを書く必要性やプラクティスについて議論した。Kelly Leahy氏は、一目瞭然のわずかなコメントが散りばめられているようなコードが好みだ。コメントは「コードを変更したときに取り残されてしまうことが多く」、「不正確なノイズをシステムに取り込んでしまうだけ」だと考えているためだ。

(コメントを書くということは)多くの人にとって個人的なことですが、私はコメントをかなりスリムにするよう気を配っています。というのも、コードを変更したときに、コメントが取り残されてしまうことが多いためです。もはや存在しないコードを参照しているコメント。もはや存在しない挙動を参照しているコメント。(だれかがコメントと元のコードの間に新たにコードを挿入したため)直後にあるコードを参照していないコメント。コードを変更したのにコメントだけがそのまま残されて、もはや正しくないコメント。そういったコメントを私は何度も何度も見てきました。

このようなコメントは、コメントがないこと以上に、まずいことだと思っています。だから、私はコメントを書かないようにしているのです。

Leahy氏はコメントを全く書いていないわけではなく、コード一万行につきコメント一行ほどは書いているそうだ。

少し説明しておく必要がありそうな避けられない設計上の制約(パフォーマンス変更など)がある場合には、コメントが役に立つこともあります。それでも、私はコメントを書かないよう努力します。おそらく、コード一万行につきコメント一行程度でしょう(たわいもないxmldocコメントは除きます。個人的には、公開APIの場合を除いて、役に立たないと思っています)。

Justin Rudd氏は、現在のプロジェクトではAPIがあまりにひどいため、コメントをたくさん書く必要があったと説明した。

ちょうど今、私はVisual Studioのためのソース管理パッケージを書いています。そのAPIはあまりにひどいので、自分が何をしているのかコメントを入れておく必要があります。そうすることで、ある場所ではGuid.Emptyを渡して、(一見すると同じように見えるのだが)別の場所では特別なGUIDを渡さなければいけない理由を思い出すことができます。さもないと、忘れてしまいます。

私は4つのソリューションのイベントインターフェイスのどれを実装しているか、コメントを入れています。そうしておけば、次に参加して7つのメソッドのうち6つを消そうと思った人も、それらを消さないでしょう。

私はそのメソッドが特別なHRESULTを返す理由をコメントに書いています。S_OKを返すと、Visual Studioがクラッシュするためです(Microsoft Connectに書かれています)。

また、たとえドキュメントにnullが渡せると書いてあっても、実際のところできないのであれば、そのことをコメントに書いておきます。

このプロジェクトの場合、おそらくコード2に対してコメント1の割合になっています。

Chris Tavares氏はバグ修正のためにコメントを使っている。

"// doing this because it fixes bug #####(バグ####を修正するため)"というコメントは不吉な臭いのするものではありません。実際のところ、これは必要不可欠なものです。

これに対して、Brandon Molina氏は、バグ修正のためのコメントはコードの内部に入れるのではなく、バージョン管理システムを使うのが望ましいと考えている。

バグが10個あるときには何が起こるでしょう? コードは最新であっても、コードを乱す無意味な情報のかたまりができてしまいます。こういった目的には、バージョン管理システムを使いましょう。コメントとdiffを組み合わせることで、コメントは本当に有益なコンテキストを持つことになります。

Brad Wilson氏は、不吉な臭いのするコメントを避けるための指針となるルールを付け加えた。

「なぜ」というコメント == 役に立つ
「どのように」というコメント == 疑わしい

Timo Hilden氏はコードのコメントについて書いており、役に立つコメントを書く必要性について次のように主張した。

コードにコメントを書くことを軽視するのは簡単なことです。考えてみましょう。私たちはプログラマとして、ピューリッツァー賞を取ることはできないでしょう。したがって、自己表現するための個人の能力が欠けているわけではないのです。はっきり言って、怠けているだけなのです。

正直に言って、必要なところにコードを説明するコメントを何も残しておかないのは、何か残しておくのと比べると、ずっとよくないことです。第一に、そのプログラマは同僚に対して敬意を払っていないことを間接的に示しています。数十のクラスや謎めいた見てもすぐにはわからないコードのある関数といったものを苦労して読むのがどれだけ苦痛なものか、だれもが知っているはずです。元のコードを書いた人が休暇中だったり、すでに会社を去っていたり、何らかの理由でアクセスできないのなら、なおさらです。プログラマというのは、同僚のプログラマを顧客として持つ芸術家です。したがって、あらゆる芸術家と同様に、私たちは顧客に敬意を払うことを学ばなくてはなりません。

第二に、コメントを省略するのは、プログラマの慢心を示しています。実際にコードを書いているときには、やろうとしていることにうまいアイデアを持っているものです。しかし、プログラミングというものは、たいていの場合、頭の中で同時に複数のことを操らなくてはなりません。次回コードを見るときには、元のコードを書いたときと同じ思考に戻すのは、非常に難しいでしょう。こうした状況はよくあるので、適切なところにコメントで説明しておいて損することはありません。

Hilden氏は、何年か前にScott Swigart氏Jeff Atwood氏が言及した「Undocumentation」というプラクティスを支持していないと言う。次のコメントを書きすぎた例について考えてみよう。

// Declare category id for products(製品のカテゴリIDを宣言する)
const int prodCategoryId = 1024;

// Create an iterator over products(製品のイテレータを作成する)
vector<Product>::iterator iter = products_.begin();

// Iterate through all products(すべての製品をイテレートする)
for ( ; iter != products_.end(); ++iter )
{
    // Assign categody id to each product(各製品にカテゴリIDを割り当てる)
    iter->AssignCategoryId( prodCategoryId );
}

彼はこれらのコメントを、ステップごとでなく一般的な考えを説明したコメントにまとめるよう提案した。

// Assign categody id to each product(各製品にカテゴリIDを割り当てる)
const int prodCategoryId = 1024;
vector<Product>::iterator iter = products_.begin();

for ( ; iter != products_.end(); ++iter )
{
    iter->AssignCategoryId( prodCategoryId );
}

あなたはコメントを書くために、どんなプラクティスを使っているだろうか? 会社で強制されているプラクティスや、自ら選んだプラクティスというのはあるだろうか? 「できるだけコメントを書くのを少なくする」というポリシーを支持して、次の開発者があなたのコードを理解してくれると信じているだろうか? あるいは、あまり明確でないものを文書化しておくのに時間をかけるべきだと考えているだろうか?

私は識字 by hark hark 投稿者
Re: 我识字 by singkey singkey 投稿者
  1. トップへ戻る

    私は識字

    by hark hark

    私は識字コメントを書くのルjeux de casinoールの全体の科学があることを知っている。いくつかの組織に特別なポスト"コメントライタ"があるそれは、それが見えるかもしれないほど簡単ではない。

  2. トップへ戻る

    Re: 我识字

    by singkey singkey

    www.rmt-link.jp/games/dragonica.htm ドラゴニカ RMT
    www.rmt-link.jp/games/Ragnarok.htm ラグナロクオンライン RMT, Ragnarok RMT, RO RMT
    www.rmt-link.jp/games/moepic.htm MOE RMT
    www.rmt-link.jp/games/ECO.htm ECO RMT
    www.rmt-link.jp/games/LucentHeart.htm ルーセントハート RMT, LH RMT
    www.rmt-link.jp/games/Tenjouhi.htm 新天上碑 RMT,天上碑 RMT
    www.rmt-link.jp/games/NEO.htm エターナルカオス RMT, NEO RMT

特集コンテンツ一覧

GAE開発の落とし穴

Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します

イベントレポート:「Coqチュートリアル#1」

去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。

Javaの未来についてのNeal Gafter氏とのディスカッション

Choosing Options

Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。

Google Dartのエッセンス:アプリケーションの構築、スナップショット、Isolate

GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式

CSPベースのモデル検査ツール「Process Analysis Toolkit」

本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。

Jenkinsによる継続的インテグレーションのススメ(4) ~CloudBeesでJenkinsをサービスとして使う~

前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。

書籍『抽象によるソフトウェア設計-Alloyではじめる形式手法-』の紹介

Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。

Windows デバイスで開発するタッチユーザーインターフェイス

スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。