========================================================================
コードコメント・ドキュメント規則 (Code Comment & Documentation Guide)
========================================================================
1. 基本方針 (Basic Policy)
------------------------------------------------------------------------
コードの可読性と保守性を高めるため,ファイル・クラス・メソッド・定数それ
ぞれに対して適切な粒度でコメントを記述する.
※ コードの書き方自体の規則は `GUIDE_04_コーディング規則.txt` を参照する.
・言語: 日本語で記述する.
・句読点: 「,」(全角カンマ)を使用し,文末の句点(「.」「。」)は付けない.
- 列挙が続く場合は「,」で区切る.
・文体: 体言止め,または「〜する」形で統一する.
・更新: コードを変更した場合は,対応するコメントも必ず合わせて更新する.
- コードと乖離したコメントは誤解を招くため,古いまま放置しない.
2. コメントの種類と用途 (Comment Types)
------------------------------------------------------------------------
2-1. XML ドキュメントコメント (XML Doc Comment)
・全ての public / protected メソッド・プロパティ・クラスに必ず記述する.
・トリプルスラッシュ(`///`)を使用する.
■ クラス・構造体
・書式:
///
/// [そのクラスが何を表すかを端的に説明]
///
internal class ClassName { ... }
・例:
///
/// カメラの基底クラス
///
internal abstract class CameraBase { ... }
■ メソッド(引数・戻り値あり)
・書式:
///
/// [その処理を端的に説明]
///
/// [説明]
/// [戻り値の説明]
public ReturnType MethodName(Type argName) { ... }
・例:
///
/// CSV ファイルから Mat を読み込む
///
/// 読み込む CSV ファイルパス
/// 読み込んだ Mat,失敗時は null
private Mat LoadMatFromCsv(string csvFile) { ... }
■ メソッド(引数・戻り値なし,または自明)
・1行で記述してよい.
///
/// 全モーターを停止する
///
public void Stop() { ... }
■ 例外をスローする可能性がある場合
・`` タグを追加する.
///
/// 設定ファイルから float 値を取得する
///
/// 設定キー(例: "Calib/UpdateRate")
/// float 値
///
/// 指定されたキーが存在しない場合
///
public static float GetFloat(string param) { ... }
■ 廃止予定のメンバー
・`` タグで代替メンバーを案内し,`[Obsolete]` 属性を付ける.
///
/// 画像を保存する
///
/// 非推奨: SaveImageAsync を使用すること
[Obsolete("SaveImageAsync を使用してください")]
public void SaveImage() { ... }
■ オーバーライドしたメンバー
・基底クラスの doc comment を継承する場合は `` を使用する.
・改めて説明を書く場合はオーバーライド先に通常の `` を記述する.
///
public override bool Connect() { ... }
■ 他メンバーへの参照
・説明文中で他のクラスやメンバーを参照する場合は `` を使用する.
///
/// から設定値を読み込む
///
public void Load() { ... }
///
/// 接続に失敗した場合は を参照すること
///
public bool Connect() { ... }
2-2. フィールド・定数コメント (Field / Constant Comment)
・公開される定数・フィールドにはインラインコメント(`//`)を直前行に記述する.
・書式:
// [その定数・フィールドが何を表すかを端的に説明]
public static string ConstantName = value;
・例:
// アプリケーション名
public static string APP_NAME = "TIAS Shot";
// 校正中フレームのカウンタ(0 より大きければ校正中)
protected int _calibrating = 0;
2-3. ブロックコメント (Block Comment)
・メソッド内で処理のまとまりが変わる箇所に記述する.
・`//` + 半角スペースを使用する.
・書式:
// [このブロックの処理を端的に説明]
...処理...
・例:
// ARマーカー検出
CvAruco.DetectMarkers(img, ARDict, out var corners, out var ids, ...);
// チャートの固定判定
var dist = (float)position.DistanceTo(_lastPosition);
2-4. タスクコメント (Task Comment)
・後で対応が必要な箇所に記述し,担当者と内容を明記する.
・書式:
// [タグ]([担当者名]): [内容]
■ タグ定義:
- TODO : 将来的に実装・対応が必要な箇所
- FIXME : 既知のバグや不具合があり修正が必要な箇所
- HACK : 意図的な暫定対応であり,本来あるべき実装ではない箇所
・例:
// TODO(yamada): タイムアウト処理を実装する
// FIXME(tanaka): 負の距離が入力された場合にクラッシュする
// HACK(suzuki): API 仕様確定まで固定値で代替している
・注意:
- 「いつか直す」ではなく,必ずタスク管理ツールとセットで運用する
- FIXME はリリース前に必ず解消する
- HACK は技術的負債として定期的に見直す
3. 記述しない場合の判断基準 (When to Omit)
------------------------------------------------------------------------
・ファイル内部でのみ使用し,外部に公開されない private メンバーは省略してもよい
・コード自体が自明な場合(メンバー名で意図が十分伝わる場合)は省略してもよい
・自動生成コード(`*.Designer.cs` 等)は対象外とする
4. NG例 (Anti-patterns)
------------------------------------------------------------------------
・句点を付ける
- NG: /// 画像を保存する.
- OK: /// 画像を保存する
・「、」「。」を使う
- NG: // 撮影開始時の基準座標をセットする。
- OK: // 撮影開始時の基準座標をセットする
・コードをコメントアウトして残す
- NG: //_lucam.StartStopPreview();
- OK: 不要なコードは削除する(Git 履歴から復元できる)
・XML doc comment を通常コメントで書く
- NG: // Connect: デバイスに接続する
- OK: /// デバイスに接続する