以前に書いたコードなのに、何をしているのか思い出せない。小さな修正のつもりが、別の機能まで確認することになった。プログラミングを続けていると、「動くこと」に加えて「後から理解して変更できること」の大切さを感じる場面があります。

可読性はコードの意図や流れの理解しやすさ、保守性は修正・調査・検証などの進めやすさに関わります。名前や処理の分け方、コメント、確認方法を整えることが、次の作業を助けます。

この記事では、個人開発や小規模なチームでも取り入れやすい6つの習慣を紹介します。ルールを増やす前に、今のコードで何が分かりにくいのかを見つけ、必要な部分から改善していきましょう。

目次

1.名前には、対象・意味・単位を含める

変数や関数の名前は、処理を読むための手掛かりです。「何の値か」「何をする処理か」が伝わる名前にすると、周囲のコードを何度も確認する負担を減らせます。

例えば、学習記録アプリにtimeという変数があっても、開始時刻なのか、経過時間なのか、学習時間なのかは分かりません。値の意味と単位を確認し、必要に応じてstudyMinutesのような名前にします。

意味が曖昧になりやすい名前 名前の例 伝えたい内容
time studyMinutes 分単位の学習時間
data studyRecords 複数の学習記録
flag isSaving 保存処理が進行中かどうか
check canEditRecord 記録を編集できるかを判定する処理

ただし、長い名前ほどよいわけではありません。短いループ内の添字など、意味がその場で明確な値には短い名前が適することもあります。使われる範囲と文脈に合わせて判断しましょう。

また、同じ意味の値を画面によって別の名前で呼ぶと、対応関係が分かりにくくなります。大文字・小文字の形式だけでなく、会員、利用者、予約などの業務用語もそろえておくと役立ちます。

言語とプロジェクトの慣習に合わせる

命名の形式は、使う言語や既存の規約に合わせます。例えば、PythonのPEP 8では、関数名や変数名に小文字とアンダースコアを使う形式が示されています。

既存プロジェクトに参加するときは、まず設定ファイルや周囲のコードを確認してください。個人の好みで名前を一斉に変更すると、互換性や変更履歴の確認に影響する場合があります。

2.関数は、役割と変更の理由を見て分ける

一つの関数に入力確認、金額計算、データ保存、メール送信まで詰め込むと、どの変更が何に影響するのかを追いにくくなります。処理のまとまりを見つけ、それぞれの入出力を整理しましょう。

例えば、学習記録を登録する処理なら、「入力内容を確認する」「保存する」「画面へ結果を返す」といった役割が考えられます。その流れをまとめる関数が、各処理を順に呼び出す構成にもできます。

「1つの役割」は「1つの命令」ではない

複数の処理を順番に呼び出す関数でも、「登録処理全体の進行を管理する」というまとまりを持てます。処理の数だけを理由に、機械的に分割する必要はありません。

単一責任の原則も、単に関数を短くするルールではありません。どのような理由で変更される処理なのか、互いに強く関係しているかを考えることが重要です。

  • 関数の役割を短い言葉で説明できるか。
  • 異なる業務上の判断が、一つの場所に混在していないか。
  • 計算部分だけを確認したいのに、通信や保存が必須になっていないか。
  • 分割した結果、ファイル間の移動や引数の受け渡しが複雑になっていないか。

行数は見直しのきっかけにはなりますが、良い設計を保証する基準ではありません。分割する前後で、読む人が流れを説明しやすくなったかを確かめましょう。

💡 あわせて読みたい関連記事

画面の部品やAPIをどこで分けるか迷う場合は、担当する役割と受け渡す情報を整理してみましょう。共通化の判断と連携時の確認方法を紹介しています。

コンポーネントとAPIの違い|再利用しやすい設計と連携・テストの進め方 記事を読む →

3.条件分岐は、通常の流れと例外を整理する

条件分岐が何重にも入れ子になると、どの条件を満たしたときに処理が実行されるのかを追いにくくなります。まず、通常の処理へ進めない条件を整理してみましょう。

例えば、予約の登録なら「ログインしていない」「入力が不足している」「指定した枠が存在しない」といった場合があります。これらを確認して処理を終了する早期リターンは、通常の流れを読みやすくする方法の一つです。

早期リターンでは、終了時に必要な処理も確認する

途中で終了する場所を増やすときは、ファイルや接続の解放、保存処理の取り消しなどが抜けないかを確認します。必要な後処理は、言語やライブラリが提供する仕組みも使って整理してください。

また、「実行してはいけない操作」を画面側の分岐だけで防がないようにしましょう。権限が必要な操作は、サーバー側でも確認するなど、分岐を書く場所そのものが重要になります。

短く書くために複雑な条件式へまとめると、かえって読み取りにくくなる場合もあります。条件に適切な名前を付ける、判定を分けるなどして、何を確認しているかが伝わる形にしましょう。

4.コメント・コメントアウト・説明書を使い分ける

コメントはコードに添える説明、コメントアウトはコードをコメントとして扱い、通常の実行対象から外すことです。同じコメント記法を使う場合がありますが、目的が異なります。

例えばJavaScriptでは、行頭の「//」などを使ってコメントを書けます。「// 学習時間は分単位で保存する」は説明であり、「// saveRecord();」は関数呼び出しを無効化した例です。

種類 主な目的 記載する内容の例
コメント コードだけでは読み取りにくい背景を補う 特殊な判定が必要な理由、外部仕様による制約
コメントアウト コードの一部を実行対象から外す 調査中に一時的に無効化する処理
関数などのドキュメント 利用方法と動作上の約束を伝える 引数、戻り値、例外、保存などの副作用
READMEなどの文書 プロジェクト全体の使い方を伝える 起動方法、必要な設定、テスト手順

「なぜ」に加えて、読者に必要な説明を残す

実装の理由は、コメントで残したい情報です。ただし、「何をしているかを書くコメントはすべて不要」と一律に決める必要はありません。

複雑な計算や正規表現、初学者向けの教材では、処理内容の説明が理解を助ける場合があります。関数の利用方法を説明する文書では、入力条件や返される値を明記することも重要です。

例えば「特殊対応」というコメントだけでは、何を守るための処理か分かりません。「旧形式のデータでは学習時間が文字列のため、集計前に数値へ変換する」のように、対象と理由を具体化しましょう。

古いコメントや無効化したコードを放置しない

コードを変更したら、周囲のコメントも確認します。実装と異なる説明が残ると、次の修正で判断を誤る原因になります。

不要になったコードを「いつか使うかもしれない」と大量にコメントアウトして残すより、変更履歴を利用して管理する方法があります。参照元や動的な呼び出しを確認し、不要だと判断できた範囲を削除しましょう。

5.整形・問題検出・テストを分けて自動化する

インデントや改行の形式を毎回目視で確認する負担は、ツールで減らせます。ただし、整形が完了したことと、プログラムが正しく動くことは別です。

仕組み 主な役割 それだけでは確認できないこと
フォーマッター インデントや改行などの形式を整える 業務ルールや計算結果の正しさ
リンター 設定した規則に基づき、問題になり得る記述を検出する あらゆる不具合や仕様の取り違え
テスト 用意した条件で、期待する動作を確認する 用意していない条件を含む完全な正しさ
CI コードの変更時などに、設定した確認処理を実行する 確認項目や期待結果そのものの妥当性

JavaScriptの開発では、Prettierが整形、ESLintがルールに基づくチェックの例です。両方を使う場合は、整形に関する設定が競合しないように役割を整理します。

CIは継続的インテグレーションを指し、変更を取り込む際の確認を自動実行する場として使えます。コードの整形や検査を自動化するために、本番環境への自動公開まで導入する必要はありません。

設定と実行方法を共有する

チームで使うツールは、設定だけでなく、バージョンや実行方法も共有します。各自のエディター設定だけに依存すると、同じコードでも異なる結果になる場合があります。

まずは対象のファイルを絞って導入し、自動修正の差分を確認しましょう。既存コード全体の整形と機能変更を同時に行うと、何が変わったのかを確認しにくくなるため、分けて進める方法が有効です。

6.変更の目的と確認結果を、小さな単位で残す

保守しやすい開発には、コードそのものに加えて、「なぜ変えたか」「何を確認したか」が分かる記録も役立ちます。コミットやプルリクエストには、変更の目的と範囲を残しましょう。

プルリクエストは、変更を取り込む前に内容を確認するための提案です。個人開発でも、同じ観点で変更を見直すと、説明や確認の抜けに気づくことがあります。

残す内容 学習記録アプリでの例
変更理由 学習時間の単位が曖昧で、秒と分を取り違える可能性があった
変更内容 変数名に単位を含め、入力の説明を追加した
影響範囲 入力画面と保存処理。既存データの単位は変更していない
確認結果 30分の登録後、一覧にも30分と表示されることを確認した
未確認事項 特定の端末での表示確認は、まだ実施していない

AIにコードの整理を依頼する場合も、変更してよい範囲と、維持したい動作を具体的に伝えます。「読みやすくして」だけでは、意図しない名前や処理の変更まで含まれる可能性があります。

提案を受け取った後は、実際の差分を読み、必要な動作確認を行いましょう。AIが説明した内容と、変更されたコードが一致しているかも確認してください。

💡 あわせて読みたい関連記事

AIに生成や修正を依頼したコードも、仕様と変更範囲を確認する必要があります。レビューとテストを組み合わせる手順を紹介しています。

AI生成コードのレビュー方法|仕様・テスト・保守性を確認する実践手順 記事を読む →

開発ルールは、困っていることから決める

ルールを導入するときは、実際に起きている問題を出発点にします。「単位を取り違えた」「起動手順が分からなかった」「不要な整形差分でレビューしにくかった」など、具体的な困りごとを整理しましょう。

そのうえで、守る内容、理由、確認方法を決めます。以下は、小規模な開発で使うルールの例です。

ルールの例 目的 確認方法
時間や金額は、単位・意味が分かる名前にする 値の取り違えを減らす 命名と入出力をレビューする
起動と確認の手順をREADMEに記載する 別の人や後日の自分が再現できるようにする 記載された手順で実行する
整形設定とチェック方法を共有する 環境による差と目視確認の負担を減らす 共通のコマンドやCIで確認する
変更理由と確認結果を残す レビューや不具合調査の材料にする 変更内容の説明を確認する

ルールが現在の構成に合わなくなったら、理由を共有して見直します。例外が必要な場合も、黙って無効にするのではなく、適用範囲と理由を残すと判断を引き継ぎやすくなります。

既存コードは、現在の動作を確かめてから整理する

既存コードを修正するときは、まず期待される動作と実際の動作を確認します。読みにくいと感じた箇所をまとめて書き換える前に、呼び出し元や保存データへの影響を調べましょう。

  1. 変更したい箇所と、困っている理由を特定する。
  2. 現在の動作を、テストや再現手順で確認する。
  3. 命名変更、処理の分割、機能修正などの目的を分ける。
  4. 変更後に、必要な操作と入出力を確認する。
  5. コメントや利用手順も、変更内容に合わせて更新する。

不具合修正と、動作を保った内部構造の整理は、目的が異なります。まとめて変更する必要がある場合も、どこで動作を変えたのかを説明できるようにしてください。

変更後に問題が起きたら、追加の書き換えを重ねる前に、差分とログを確認します。変更を小さく分けておくと、原因の調査や元に戻す判断を進めやすくなります。

💡 あわせて読みたい関連記事

修正後に不具合が起きたときは、何が変わり、どこで失敗したかを確認しましょう。ログから事実と原因の候補を分けて調べる方法を整理しています。

エラーログの読み方|原因を絞り込む調査手順と、安全な記録・共有の方法 記事を読む →

よくある質問

コメントは多い方がよいですか?

量だけでは判断できません。必要な背景や条件が伝わり、実装と一致していることが大切です。名前や構造を見直すことで説明を減らせる場合も、複雑な処理に補足が必要な場合もあります。

日本語のコメントを使ってもよいですか?

読む人とプロジェクトの方針に合わせて決めます。日本語で開発するチームなら、日本語の説明が役立つこともあります。国際的な共同開発などでは、関係者が理解できる言語を選びましょう。

個人開発でも、規約やレビューは必要ですか?

小さな制作物なら、大きなチームと同じ仕組みをそろえる必要はありません。ただし、命名の一貫性、起動方法、変更理由を残しておくと、時間を空けて作業を再開しやすくなります。

リンターを通過すれば、不具合はないと考えてよいですか?

そうは言えません。リンターが確認するのは、設定された規則で検出できる範囲です。業務上の条件や利用者の操作に合っているかは、レビューやテストでも確認してください。

まとめ:次に読む人が判断できるコードを目指そう

コードの可読性と保守性は、名前、処理のまとまり、説明、確認手順の積み重ねで改善していきます。短さやルールの数だけを目標にせず、何をしているか、なぜそうしたか、どう確認するかが伝わることを意識しましょう。

まずは、今のコードで意味が分かりにくい名前を一つ見直す、古いコメントを更新するなど、小さな箇所から始めてみてください。変更の影響を確かめながら、続けられるルールに整えていきましょう。

参考資料

Learning Tools

記事を検索したい方はここから!

辞書から探す

本文中で気になった概念やキーワードを、辞書ページで一覧から確認できます。

辞書を見る