======================================================================== コードコメント・ドキュメント規則 (Code Comment & Documentation Guide) ======================================================================== 1. 基本方針 (Basic Policy) ------------------------------------------------------------------------ コードの可読性と保守性を高めるため,ファイル・クラス・関数・定数それぞれに対して 適切な粒度でコメントを記述する. ※ コードの書き方自体の規則は `GUIDE_04_コーディング規則.txt` を参照する. ・言語: 日本語で記述する. ・句読点: 「,」(全角カンマ)を使用し,文末の句点(「.」「。」)は付けない. - 列挙が続く場合は「,」で区切る. ・文体: 体言止め,または「〜する」形で統一する. ・更新: コードを変更した場合は,対応するコメントも必ず合わせて更新する. - コードと乖離したコメントは誤解を招くため,古いまま放置しない. 2. コメントの種類と用途 (Comment Types) ------------------------------------------------------------------------ 2-1. ファイルドキュメント (Module Docstring) ・ファイルの先頭に必ず記述する. ・トリプルダブルクォート(`""" """`)を使用する. ・書式: """ [ファイル名(拡張子なし)] [ファイルの主な責務を1行で説明] [補足情報があれば続けて記述] """ ・例: """ motor_controller モーターの制御を担当するモジュール GPIO を介して左右のモーターの速度・方向を制御する """ 2-2. クラスドキュメント (Class Docstring) ・全てのクラスに記述する. ・クラス定義の直後にトリプルダブルクォートで記述する. ・書式: class ClassName: """[そのクラスが何を表すかを端的に説明]""" ・複数行が必要な場合: class ClassName: """ [そのクラスが何を表すかを端的に説明] [補足情報] """ ・例: class MotorController: """左右のモーターを GPIO 経由で制御するクラス""" 2-3. 関数・メソッドドキュメント (Function Docstring) ・公開関数・メソッドには必ず記述する. ・Google スタイルの docstring を使用する. ・書式: def function_name(arg1: type, arg2: type) -> return_type: """[その関数が何をするかを端的に説明] Args: arg1: [説明] arg2: [説明] Returns: [返り値の説明] """ ・引数・返り値がない,または自明な場合は1行で省略してよい. def stop(self) -> None: """全モーターを停止する""" ・例外をスローする可能性がある場合は `Raises` セクションを付ける. def set_speed(self, speed: int) -> None: """モーターの速度を設定する Args: speed: 0〜100 の範囲の速度値 Raises: ValueError: speed が 0〜100 の範囲外の場合 """ ・廃止予定のものには非推奨であることを明記し,代替を示す. def old_method(self) -> None: """非推奨: new_method を使用すること""" ・例: def calc_distance(speed: float, duration: float) -> float: """速度と時間から距離を計算する Args: speed: 移動速度 (m/s) duration: 経過時間 (s) Returns: 移動距離 (m) """ return speed * duration 2-4. 定数ドキュメント (Constant Comment) ・公開される定数にはインラインコメント(`#`)を直前行に記述する. ・書式: # [その定数が何を表すかを端的に説明] CONSTANT_NAME = value ・例: # UI側と共有する最大速度の既定値 MAX_SPEED = 100 # 超音波センサーの測定間隔 (秒) SENSOR_INTERVAL_SEC = 0.5 2-5. ブロックコメント (Block Comment) ・関数・メソッド内で,処理のまとまりが変わる箇所に記述する. ・`#` + 半角スペースを使用する. ・書式: # [このブロックの処理を端的に説明] ...処理... ・例: # 入力値を正規化する normalized = raw_value / MAX_VALUE # モーターに速度を反映する GPIO.output(self._pin, normalized) 2-6. タスクコメント (Task Comment) ・後で対応が必要な箇所に記述し,担当者と内容を明記する. ・`#` + 半角スペースを使用し,以下のタグで種別を区別する. ・書式: # [タグ]([担当者名]): [内容] ■ タグ定義: - TODO : 将来的に実装・対応が必要な箇所 - FIXME : 既知のバグや不具合があり修正が必要な箇所 - HACK : 意図的な暫定対応であり,本来あるべき実装ではない箇所 ・例: # TODO(yamada): タイムアウト処理を実装する # FIXME(tanaka): 距離が負になるケースでクラッシュする # HACK(suzuki): API仕様確定まで固定値で代替している ・注意: - 「いつか直す」ではなく,必ずタスク管理ツールとセットで運用する - FIXME はリリース前に必ず解消する - HACK は技術的負債として定期的に見直す 3. 記述しない場合の判断基準 (When to Omit) ------------------------------------------------------------------------ ・ファイル内部でのみ使用し,外部に公開されない関数・定数は省略してもよい ・コード自体が自明な場合(変数名で意図が十分伝わる場合)は省略してもよい ・ユニットテストファイルは,テストケース名で意図が伝わる場合は省略してもよい 4. NG例 (Anti-patterns) ------------------------------------------------------------------------ ・句点を付ける - NG: """ジョイスティックの入力を受け取る.""" - OK: """ジョイスティックの入力を受け取る""" ・「、」「。」を使う - NG: # 入力開始時の基準座標をセットする。 - OK: # 入力開始時の基準座標をセットする ・コードをコメントアウトして残す - NG: # old_handler = lambda: ... - OK: 不要なコードは削除する(Git履歴から復元できる) ・docstring を通常のコメントで書く - NG: # motor_controller: モーターの制御を担当するモジュール - OK: """ motor_controller モーターの制御を担当するモジュール """