Upgrade to Pro — share decks privately, control downloads, hide ads and more …

rinkou_13

Avatar for torii torii
March 31, 2026
13

 rinkou_13

Avatar for torii

torii

March 31, 2026

Transcript

  1. 13.2 コードをなぞらない コメントがコードの内容を繰り返しているだけのものは役に立たない 例① ptr_copy = get_copy(obj) # ポインタのコピーを取得 if

    is_unlocked(ptr_copy): # objは解放されているか? return obj # 現在のobjを返す if is_copy(ptr_copy): # すでにコピーか? return obj # objを返す thread_id = get_thread_id(ptr_copy) if thread_id == ctx.thread_id: # 現在のコンテキストによってロックされている return ptr_copy # コピーを返す 13
  2. 例② // 水平スクロールバーを追加 hScrollBar = new JScrollBar(JScrollBar.HORIZONTAL); add(hScrollBar, BorderLayout.SOUTH); //

    垂直スクロールバーを追加 vScrollBar = new JScrollBar(JScrollBar.VERTICAL); add(vScrollBar, BorderLayout.EAST); // キャレット位置に関連する値を初期化 caretX = 0; caretY = 0; caretMemX = null; 1,2つ目のコメントはコード自体が十分に明確であるため、不要。 3つ目のコメントは、現状の内容では役に立つほどの情報が含まれていないため、無く てもよい。 15
  3. 例② /** PARAMETERをTYPEにダウンキャストする。 */ private static Object downCastParameter(String parameter, String

    type) ... ダウンキャストとは何を意味するのか? 例③ /** テキストの各行の水平パディング。 */ private static final int textHorizontalPadding = 4; パディングの要素は何か? それは片側なのか両側なのか? 18
  4. 例③の修正版 /** * テキストの各行の左右に残す空白の量(ピクセル単位)。 */ private static final int textHorizontalPadding

    = 4; このコメントには、単位(ピクセル)や、パディングが各行の両側に適用されること など、宣言自体からは分からない付加的な情報が含まれている。 また、 「パディング」という言葉に馴染みがない読者のために、その用語を繰り返すの ではなく、それが何を意味するのか(空白の量)を説明している。 20
  5. 13.3 下位レベルのコメントで正確性を高める コメントには大きく分けて2つの方向性がある 1. コードよりも下位の、より詳細なレベルの情報を提供するもの コードの厳密な意味を明らかにすることで 「正確性」 を高める 2. コードよりも上位の、より抽象的なレベルの情報を提供するもの

    コードの背後にある意図や、コードに対するよりシンプルで抽象的な考え方な ど、 「直感的な理解」 を助ける この節では下位レベル、次節では上位レベルのアプローチについてそれぞれ解説する 21
  6. 変数のコメントで最もありがちな問題は、内容が曖昧すぎることである。 例① // respBuffer内の現在のオフセット uint32_t offset; // ドキュメント内のすべての行の幅と出現回数を保持する private TreeMap<Integer,

    Integer> linewidths; 現在とは何を指す? TreeMap のキーが行の幅、値が出現回数であるという点がはっきりしない 幅の単位がピクセルなのか、文字数なのか? 25
  7. 例①の修正版 // このバッファにおいて、まだクライアントに返されていない // 最初のオブジェクトの位置 uint32_t offset; // 行の長さに関する統計を <長さ,

    カウント> の形式で保持する。 // 「長さ」は行の文字数(改行文字を含む)であり、 // 「カウント」はちょうどその長さを持つ行の数である。 // 特定の長さの行が存在しない場合、その長さのエントリは存在しない。 private TreeMap<Integer, Integer> numLinesWithLength; 2つ目は、より多くの情報を伝える長い名前を採用。また width を length にするこ とで、単位が文字数であることを連想させやすくする。 さらに、各エントリの詳細だけでなく、エントリが存在しない場合にそれが何を 意味するかまで記述している。 26
  8. 例② /* FOLLOWER変数:ReceiverスレッドとPeriodicTasksスレッドが、 * フォロワーのエレクションタイムアウト期間内にハートビートを受信したかどうかを * 通信するためのインジケータ変数。 * 有効なハートビートを受信したときにTRUEに切り替わる。 *

    エレクションタイムアウト期間がリセットされるときにFALSEに切り替わる。 */ private boolean receivedValidHeartbeat; このドキュメントは、クラス内の複数の箇所でこの変数がどのように変更されるかを 説明している。 コードの構造をなぞるのではなく、変数が何を表しているかを記述すれば、コメント はより短く、かつ有用になる。 28
  9. 例① // もしassignPosが指すPKHashと同じセッションを使用しているLOADING状態のreadRpcがあり、 // かつそのreadRPCの最後のPKHashが現在割り当て中のものより小さい場合、 // 割り当て中のPKHashをそのreadRPCに追加する。 int readActiveRpcId =

    RPC_ID_NOT_ASSIGNED; for (int i = 0; i < NUM_READ_RPC; i++) { if (session == readRpc[i].session && readRpc[i].status == LOADING && readRpc[i].maxPos < assignPos && readRpc[i].numHashes < MAX_PKHASHES_PERRPC) { readActiveRpcId = i; break; } } このコメントは抽象度が低すぎて、詳細に寄りすぎており、このコードが全体として 何を目的としているのか、あるいは含まれているメソッドの中でどのような役割を担 っているのかを説明していない。 31
  10. 例② if (numProcessedPKHashes < readRpc[i].numHashes) { // このリクエストでは、一部のキーハッシュを検索できなかった // (サーバーに保存されていない、サーバーがクラッシュした、

    // またはレスポンスメッセージの容量が不足していた、などの理由による)。 // 未処理のハッシュをマークし、新しいRPCに再度割り当てられるようにする。 for (size_t p = removePos; p < insertPos; p++) { if (activeRpcId[p] == i) { if (numProcessedPKHashes > 0) { numProcessedPKHashes--; } else { if (p < assignPos) assignPos = p; activeRpcId[p] = RPC_ID_NOT_ASSIGNED; } } } } 34
  11. 例 /** * このクラスは、HTTPプロトコルに対するシンプルなサーバー側のインターフェースを * 実装する。このクラスを使用することで、アプリケーションはHTTPリクエストを * 受信し、処理して、レスポンスを返すことができる。 * このクラスの各インスタンスは、リクエストを受信するために使用される特定の

    * ソケットに対応する。現在の実装はシングルスレッドである。 */ public class Http {...} このコメントは、実装の詳細や個々のメソッドの細部には触れず、クラス全体の機能 を説明している。また、クラスの各インスタンスが何を表しているのかも記述してい る。最後に、クラスの制限事項(複数のスレッドからの並行アクセスをサポートして いないこと)についても触れている。これらは、そのクラスの使用を検討している開 発者にとって重要な情報となる。 37
  12. typedef enum Status { STATUS_OK = 0, STATUS_UNKNOWN_TABLET = 1,

    STATUS_WRONG_VERSION = 2, ... STATUS_INDEX_DOESNT_EXIST = 29, STATUS_INVALID_PARAMETER = 30, STATUS_MAX_VALUE = 30, /* * 注意:新しいステータス値を追加する場合は、以下の更新も行うこと: * (1) STATUS_MAX_VALUE を最大のステータス値に更新し、 * リストの最後にあることを確認する。 * (2) Status.cc 内の "messages" および "symbols" テーブルにエントリを追加する。 * (3) ClientException.h に新しい例外クラスを追加する。 * (4) ClientException::throwException に新しい "case" を追加し、 * ステータス値を固有の例外サブクラスへマッピングする。 * (5) Javaバインディングの ClientException.java に例外用の静的クラスを追加する。 * (6) ClientException.java でステータスコードに応じた例外を投げる case を追加する。 */ } Status; 45