- 設計
コーディング規約の作り方|テンプレートと自動チェックの設定
コーディング規約は、チームでコードの書き方をそろえるための決まりです。 作るときのコツは、「ツールで自動で守らせる部分」と「人がレビューで見る部分」を分けることです。書式や命名のように機械で判定できるものを文章で長く書くと、読まれず、守られません。
| 区分 | 例 | 守らせ方 |
|---|---|---|
| 書式(インデント・改行・空白・括弧の位置) | if( → if ( |
フォーマッタが自動で直す(Prettier・google-java-format など) |
| 機械で判定できる決まり(命名・import・例外の握りつぶし) | FindNames → findNames |
リンターが指摘(Checkstyle・ESLint・Ruff など) |
| 人が判断する決まり(設計・名前の意味・ログに出す内容) | 「この名前で何をするか分かるか」 | 規約の文書+レビュー |
この記事では、書式の崩れたコードをフォーマッタにかけ、直ったもの・直らなかったものを確かめました。
確認環境:Prettier 3.9.10+prettier-plugin-java 2.11.0、Ruff 0.17.0(Linux)で確かめました(確認日 2026年10月12日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「コーディング規約の作り方|テンプレートと自動チェックの設定」
1. まず「土台にする規約」を決める
一から書くより、公開されている規約を土台にして、チームで変えたいところだけを書き足すほうが早く、抜けも少なくなります。
| 言語 | 土台にしやすい規約 | 主な決まり(例) |
|---|---|---|
| Java | Google Java Style Guide | 1行100文字、インデント2スペース、ワイルドカード import を使わない |
| Python | PEP 8 | 関数名は小文字とアンダースコア、インデント4スペース |
| JavaScript・TypeScript | 各リンターの推奨設定(ESLint の recommended など) | 未使用の変数を残さない など |
Google Java Style Guide には、たとえば次のように書かれています。
| 項目 | 原文 |
|---|---|
| 1行の長さ | Java code has a column limit of 100 characters. |
| インデント | the indent increases by two spaces. |
| ワイルドカード import | Wildcard ("on-demand") imports, static or otherwise, are not used. |
| 定数名 | Constant names use UPPER_SNAKE_CASE |
| メソッド名 | Method names are written in lowerCamelCase. |
| 例外 | It is very rarely correct to do nothing in response to a caught exception. |
インデントを4スペースにしたいなど、土台と違う決まりは「変更点」として一覧にしておくと、新しく入った人が迷いません。
2. 規約に書く項目(テンプレート)
ツールで守らせる項目は「ツールと設定ファイルの場所」だけを書き、文章は人が判断する項目に使います。
| 章 | 書くこと | 守らせ方 |
|---|---|---|
| 0. 土台と変更点 | 土台にした規約、変えた点 | 文書 |
| 1. 書式 | フォーマッタの名前と設定ファイル(例:.prettierrc) |
自動 |
| 2. 命名 | クラス・メソッド・変数・定数・テーブル・API の形 | リンター+意味はレビュー |
| 3. 例外 | 握りつぶさない、何を catch するか、業務エラーとシステムエラーの分け方 | リンター+レビュー |
| 4. ログ | レベルの使い分け、個人情報を出さない、出す項目 | レビュー |
| 5. null・Optional | 戻り値に null を返さない、Optional の使いどころ |
レビュー(一部リンター) |
| 6. コメント | 「なぜ」を書く、公開メソッドの Javadoc | レビュー |
| 7. テスト | テストの置き場所、名前の付け方、何を必ず書くか | レビュー+CI |
| 8. 禁止事項 | 文字列の == 比較、System.out.println の残し忘れ など |
リンター |
| 9. 例外の扱い | 規約から外れてよい場合と、その書き方(抑止のコメント) | 文書 |
「なぜその決まりなのか」を1行添えると、守られやすくなり、例外の判断もしやすくなります。
【例外】Exception をまとめて catch して何もしないことは禁止。
理由:障害の原因がログに残らず、調査できなくなるため。
例外:外部ライブラリが Exception しか投げない場合は、ログを出したうえで catch してよい。
ログと例外の決め方は、関連記事「ログレベルの使い分け|ERROR・WARN・INFO・DEBUGの判断基準とログ設計」「エラー処理設計の方針|業務エラーとシステムエラーの分類表とテンプレート」で、名前の付け方は「変数名・関数名の付け方|命名規則と言語別のルール」で扱っています。
3. 書式はフォーマッタに任せる(再現)
次の Java のコードを、Prettier(prettier-plugin-java)にかけました。
package com.example;
import java.util.*;
public class OrderService{
private static final int max_items=100;
public List<String> FindNames(List<Order> orders){
List<String> result=new ArrayList<>();
for(Order o:orders){ if(o.getStatus()=="PAID"&&o.getTotal()>0){result.add(o.getCustomerName());} }
return result;
}
public int calc(int a,int b){try{return a/b;}catch(Exception e){return 0;}}
}
設定ファイル(.prettierrc)です。
{
"plugins": ["prettier-plugin-java"],
"printWidth": 100,
"tabWidth": 4
}
npx prettier --check src/ # 崩れていれば終了コード1(CI で使う)
npx prettier --write src/ # 直す
--check は Code style issues found と表示して終了コード1になり、--write のあとは次のようになりました。
package com.example;
import java.util.*;
public class OrderService {
private static final int max_items = 100;
public List<String> FindNames(List<Order> orders) {
List<String> result = new ArrayList<>();
for (Order o : orders) {
if (o.getStatus() == "PAID" && o.getTotal() > 0) {
result.add(o.getCustomerName());
}
}
return result;
}
public int calc(int a, int b) {
try {
return a / b;
} catch (Exception e) {
return 0;
}
}
}
見た目は整いましたが、中身の問題は1つも直っていません。
| 残った問題 | 規約での決まり(例) | 見つける方法 |
|---|---|---|
import java.util.*; |
ワイルドカード import を使わない | リンター |
max_items(定数) |
定数は MAX_ITEMS |
リンター |
FindNames(メソッド) |
メソッドは findNames |
リンター |
o.getStatus() == "PAID" |
文字列は equals で比べる |
リンター |
catch (Exception e) { return 0; } |
例外を握りつぶさない | リンター+レビュー |
フォーマッタは「書式」、リンターは「決まり」、レビューは「意味」を受け持つ、と分けて考えます。
4. 決まりはリンターで指摘させる
Java:Checkstyle のチェック名
Java では Checkstyle がよく使われます。上の表の問題に対応するチェックは次のとおりです(説明は Checkstyle のドキュメントの原文)。
| 問題 | チェック名 | 説明(原文) |
|---|---|---|
| ワイルドカード import | AvoidStarImport |
Checks that there are no import statements that use the * notation. |
| 定数名 | ConstantName |
Checks that constant names conform to a specified pattern. |
| メソッド名 | MethodName |
Checks that method names conform to a specified pattern. |
文字列の == |
StringLiteralEquality |
Checks that string literals are not used with == or !=. |
Exception の catch |
IllegalCatch |
Checks that certain exception types do not appear in a catch statement. |
| 空の catch | EmptyCatchBlock |
Checks for empty catch blocks. |
設定ファイル(checkstyle.xml)に、チームで使うチェックを並べます。
<module name="Checker">
<module name="TreeWalker">
<module name="AvoidStarImport"/>
<module name="ConstantName"/>
<module name="MethodName"/>
<module name="StringLiteralEquality"/>
<module name="IllegalCatch"/>
<module name="EmptyCatchBlock"/>
</module>
</module>
同じ問題を Ruff(Python)で確かめた
リンターが実際にどう指摘するかを、同じ種類の問題を含む Python のコードで確かめました。
from os.path import *
MaxItems = 100
def FindNames(orders):
result = []
for o in orders:
if type(o) == dict and o["status"] == "PAID":
result.append(o["name"])
return result
def calc(a, b):
try:
return a / b
except Exception:
return 0
# ruff.toml
line-length = 100
[lint]
select = ["E", "F", "N", "BLE", "B"]
$ ruff check order_service.py --output-format concise
order_service.py:1:1: F403 `from os.path import *` used; unable to detect undefined names
order_service.py:5:5: N802 Function name `FindNames` should be lowercase
order_service.py:8:12: E721 Use `is` and `is not` for type comparisons, or `isinstance()` for isinstance checks
order_service.py:15:12: BLE001 Do not catch blind exception: `Exception`
Found 4 errors.
import・命名・型の比べ方・例外の握りつぶしの4つが、行番号つきで指摘されました。 終了コードは1なので、CI でそのまま止められます。
5. CIとエディタで「守るのが当たり前」にする
| 場所 | すること | 効果 |
|---|---|---|
| エディタ | 保存時にフォーマッタを実行 | 書式の差分がレビューに出なくなる |
.editorconfig |
文字コード・改行・インデントをそろえる | エディタが違ってもそろう |
| コミット前(pre-commit など) | フォーマッタとリンターを実行 | 崩れたコードがリポジトリに入らない |
| CI(プルリクエストごと) | prettier --check・リンターを実行し、失敗ならマージしない |
規約を守ったかを人が見なくてよくなる |
# .editorconfig
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
[*.java]
indent_style = space
indent_size = 4
既存のコードに後から入れるときは、一度に全部を直すと差分が大きくなりすぎます。 書式だけを直すコミットを1回に分ける、リンターは新しく変えたファイルから対象にする、など段階を決めて入れます。
6. レビューで見ること(ツールでは見られないこと)
| 観点 | 例 |
|---|---|
| 名前が中身と合っているか | calc では何を計算するか分からない → divideOrZero など |
| 例外の扱いが正しいか | 0 で割ったときに 0 を返してよいのか、仕様に照らす |
| ログに出してよい内容か | 氏名・メールアドレス・パスワードを出していないか |
| 規約の例外を使った理由が書かれているか | 抑止コメントに理由があるか |
レビューの観点は、関連記事「コードレビューの観点チェックリスト|優先順位と伝え方」で扱っています。
よくある質問
Q. 規約は何ページくらいがいいですか。 A. 書式と命名の形をツールに任せると、文書に残るのは「人が判断する決まり」だけになり、数ページに収まることが多くなります。長い規約ほど読まれにくいので、ツールで守れるものは文章から外します。
Q. タブかスペースか、インデントは何文字かで揉めます。 A. 土台にした規約に合わせるか、フォーマッタの既定値に合わせると、議論が短くなります。大事なのは、決めたあとはフォーマッタが自動で守ることです。
Q. 生成AIが書いたコードにも規約を守らせたい。 A. AIが書いたコードも、同じフォーマッタ・リンター・CI を通せば守らせられます。プロジェクトの説明ファイル(CLAUDE.md など)に「フォーマッタとリンターを実行してから終える」と書いておく方法もあります。AIのコードの確かめ方は、関連記事「AI生成コードの確認チェックリスト|品質とセキュリティ」で扱っています。
Q. 規約を守らない人がいます。 A. 人に注意するより、CI で止める仕組みにするほうが、関係もこじれません。ツールで止められない決まりは、レビューの観点表に入れて、誰が見ても同じ指摘になるようにします。
まとめ
- 規約は フォーマッタ(書式)・リンター(決まり)・レビュー(意味) に分けて作る
- 公開されている規約を土台にし、変えるところだけを書き足す
- Prettier で整えても、命名・ワイルドカード import・文字列の
==・例外の握りつぶしは残った - リンター(Checkstyle・Ruff など)は 行番号つきで指摘し、終了コード1で CI を止められる
- 文書には 「なぜその決まりか」 を1行添え、CI で守るのを当たり前にする
参考・出典
確認日はいずれも 2026年10月12日です。
- Google Java Style Guide:https://google.github.io/styleguide/javaguide.html
- PEP 8(Style Guide for Python Code):https://peps.python.org/pep-0008/
- Checkstyle「Checks」:https://checkstyle.org/checks.html
- Prettier ドキュメント「CLI」(--check・--write):https://prettier.io/docs/cli
- prettier-plugin-java 2.11.0(npm):https://www.npmjs.com/package/prettier-plugin-java
- Ruff ドキュメント「Rules」:https://docs.astral.sh/ruff/rules/
- EditorConfig:https://editorconfig.org/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「コーディング規約の作り方|テンプレートと自動チェックの設定」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。