コードを書く基礎
読みやすく保守しやすいコードを書くための基礎を学びます。
コーディング規約
コーディング規約とは、コードを書く際のルールやスタイルです。
なぜコーディング規約が必要か
- チーム内でコードの書き方を統一する
- 読みやすく保守しやすいコードにする
- 将来の自分や他のエンジニアが理解しやすくする
- コードレビューの手間を減らす
現場ごとに規約がある
プロジェクトや会社によって規約は異なります。
- 新しい現場に入ったらまずコーディング規約を確認
- 規約が文書化されていない場合は、既存コードのスタイルに合わせる
- 迷ったら先輩に聞く
よくある規約の項目
| 項目 | 例 |
|---|---|
| インデント | スペース4つ or タブ |
| 命名規則 | camelCase or snake_case |
| 1行の長さ | 80文字 or 120文字 |
| 波括弧の位置 | 同じ行 or 次の行 |
| コメントの書き方 | 日本語OK or 英語のみ |
命名規則
意味のある名前をつけることが最も重要です。
良い名前の例
int totalAmount; // 合計金額
String userName; // ユーザー名
boolean isActive; // アクティブかどうか
void calculateTax() {} // 税金を計算する
List<User> findByAge() {} // 年齢で検索する
悪い名前の例
int a; // 何の値か分からない
String str1; // 何の文字列か分からない
boolean flag; // 何のフラグか分からない
void func() {} // 何をする関数か分からない
void process() {} // 曖昧すぎる
命名のコツ
| コツ | 例 |
|---|---|
| 略さない | cnt → count、btn → button |
| 動詞で始める(メソッド) | getUser、calculateTotal、validateInput |
| 名詞を使う(変数) | user、orderList、totalAmount |
| 真偽値は is/has/can で始める | isValid、hasPermission、canEdit |
| 複数形で配列・リストを表す | users、items、orders |
命名スタイル
言語やチームによって使うスタイルが異なります。
| スタイル | 例 | よく使う場面 |
|---|---|---|
| camelCase | userName |
変数名、メソッド名(Java、JS) |
| PascalCase | UserName |
クラス名(ほとんどの言語) |
| snake_case | user_name |
変数名(Python、Ruby) |
| UPPER_SNAKE_CASE | MAX_VALUE |
定数 |
| kebab-case | user-name |
ファイル名、URL |
コードのフォーマット
見た目を整えることで読みやすくなります。
インデント
インデントを揃えることでコードの構造が見やすくなります。
// 良い例:インデントが揃っている
if (user != null) {
if (user.isActive()) {
sendEmail(user);
}
}
// 悪い例:インデントがバラバラ
if (user != null) {
if (user.isActive()) {
sendEmail(user);
}
}
チームのルールに従う:スペース4つ or スペース2つ or タブ
空白と改行
適切な空白で読みやすくなります。
// 読みやすい
int total = price * quantity + tax;
if (user != null && user.isActive()) {
process(user);
}
// 読みにくい
int total=price*quantity+tax;
if(user!=null&&user.isActive()){process(user);}
1行の長さ
長すぎる行は適切に改行します。
// 読みにくい(1行が長すぎる)
String message = "ユーザー " + user.getName() + " の注文 " + order.getId() + " の処理が完了しました。合計金額は " + order.getTotalAmount() + " 円です。";
// 読みやすい(適切に改行)
String message = "ユーザー " + user.getName() +
" の注文 " + order.getId() +
" の処理が完了しました。" +
"合計金額は " + order.getTotalAmount() + " 円です。";
目安:80〜120文字程度(チームの規約に従う)
フォーマッタを使う
多くのIDEには自動フォーマット機能があります。
| IDE | ショートカット |
|---|---|
| Visual Studio Code | Shift + Alt + F |
| IntelliJ IDEA | Ctrl + Alt + L |
| Eclipse | Ctrl + Shift + F |
手動で整えるより、フォーマッタに任せる方が効率的で統一されます。
コメントの書き方
良いコメント
「なぜ」を書く
コードを見れば「何をしているか」は分かります。「なぜそうしているか」を書きましょう。
// 税率は法改正で変更される可能性があるため、定数として定義
final double TAX_RATE = 0.10;
// 外部APIの制限により、1回のリクエストは100件まで
int batchSize = 100;
// 古いブラウザとの互換性のため、新しい構文は使わない
var element = document.getElementById('myId');
複雑な処理の意図を説明する
// 配列を逆順にソートすることで、最新のデータが先頭に来るようにする
Arrays.sort(data, Collections.reverseOrder());
// 重複を除去しつつ元の順序を保持するため、LinkedHashSetを使用
Set<String> uniqueItems = new LinkedHashSet<>(items);
TODO/FIXMEコメント
// TODO: パフォーマンス改善が必要。N+1問題あり
// FIXME: nullの場合の処理が未実装
// HACK: 一時的な回避策。本来はリファクタリングが必要
悪いコメント
コードを日本語に訳しただけ
// iに1を加える
i = i + 1;
// ユーザーを取得する
User user = getUser();
コードを見れば分かることは書く必要がありません。
古くなって嘘になっている
// 税率8%で計算
double tax = amount * 0.10; // 実際は10%
コードを修正したらコメントも更新しましょう。嘘のコメントは害です。
コメントアウトしたコード
// String oldMethod() {
// return "ancient code";
// }
不要なコードはバージョン管理で履歴が残るので削除しましょう。
関数・メソッドの書き方
1つのことだけをする
1つのメソッドで複数のことをしない。
// 悪い例:複数のことをしている
void processOrder(Order order) {
// バリデーション
if (order.getItems().isEmpty()) {
throw new ValidationException();
}
// 在庫チェック
for (Item item : order.getItems()) {
if (!inventory.hasStock(item)) {
throw new OutOfStockException();
}
}
// 保存
orderRepository.save(order);
// メール送信
emailService.sendConfirmation(order);
}
// 良い例:それぞれのメソッドに分ける
void processOrder(Order order) {
validateOrder(order);
checkStock(order);
saveOrder(order);
sendConfirmationEmail(order);
}
適切な長さに保つ
- 1メソッドは20〜30行程度が目安
- 画面に収まる程度がベスト
- 長くなったら分割を検討
引数は少なく
引数が多すぎると理解しづらくなります。
// 悪い例:引数が多い
void createUser(String name, String email, String phone,
String address, int age, boolean isAdmin) { ... }
// 良い例:オブジェクトにまとめる
void createUser(UserCreateRequest request) { ... }
コードレビューを受ける心構え
指摘は「コード」に対するもの
- 人格への攻撃ではない
- 「コードをより良くする」ためのフィードバック
- 感情的にならない
分からない指摘は質問する
レビューコメント:「ここはnullチェックが必要です」
× 「なぜか分からないけど直す」
○ 「どのような場合にnullになりますか?」と質問する
学びの機会として捉える
- 同じ指摘を繰り返し受けないようにメモ
- 「自分では気づかなかった視点」を学ぶ
- 先輩のコードの書き方を参考にする
よくある指摘と対策
| よくある指摘 | 対策 |
|---|---|
| 「命名が分かりにくい」 | 何を表すか具体的に書く |
| 「マジックナンバーを定数に」 | 意味のある名前の定数にする |
| 「nullチェックがない」 | 入力値は信用しない |
| 「コメントがない」 | 「なぜ」を説明するコメントを追加 |
| 「メソッドが長い」 | 処理を分割する |
まとめ
| 項目 | ポイント |
|---|---|
| コーディング規約 | 現場のルールに従う、まず確認する |
| 命名 | 意味のある名前、略さない、動詞/名詞を使い分け |
| フォーマット | インデントを揃える、フォーマッタを使う |
| コメント | 「なぜ」を書く、コードの説明は不要 |
| 関数・メソッド | 1つのことだけ、短く、引数は少なく |
| コードレビュー | 学びの機会、指摘はコードへのフィードバック |
心がけ:
- 「未来の自分や他のエンジニアが読む」ことを意識する
- 迷ったら既存コードのスタイルに合わせる
- レビューで学んだことをメモして次に活かす