はじめに
以前インターンでコードレビューをしてもらったとき、「命名規則に注意しろ」というようなことを言われました。
なので、今回は様々な言語・フレームワークに対しての命名規則をまとめてみました。
命名規則の用語
命名規則を考える際、よく出て来る用語があるので、ここでまとめておきます。
キャメルケース
- 先頭の単語だけ小文字
- それ以外の単語の先頭が大文字
- 例:
camelCase
スネークケース
- 全て小文字
- 単語の区切りにアンダースコアを用いる
- 例:
snake_case
アッパスネークーケース
- 全て大文字
- 単語の区切りにアンダースコアを用いる
- 例:
SNAKE_CASE - 定数名に用いられることが多い
パスカルケース
- 先頭・単語の区切りが大文字
- それ以外は全て小文字
- 例:
PascalCase
ケバブケース
- 小文字を用いる
- 単語をハイフンで区切る
- 例:
kebab-case
ハンガリアンケース
- 変数名の先頭に型を示す接頭辞を付ける
- 変数名本体はキャメルケース
- 例:
strName(文字列型の変数名)
ドットケース
- 小文字を用いる
- 単語をドットで区切る
- 例:
dot.case
アンチパターン
命名の際に避けたほうが良いパターンです。
以下具体的なものをまとめてみます。
変数名
-
data,info,valueなど- 中身が名前から想像できない
- そもそも「データ」「情報」「値」はプログラム上の全てに当てはまることなので意味がない
- 連番
-
player1,player2など - 番号がハードコーディングになっており変更がしづらい
- そもそも番号に意味はない
-
- 意味が広い単語
-
target,resultなど - 行う処理や行った処理に紐づいた名前としたほうがよい
-
メソッド名
-
check- 何をチェックするのかが明確ではない
- 戻り値がBoolean型の変数を返す場合、
isやhasなどの接頭辞をつけ、チェック対象を明確にするべき
-
and,orなど- 1つのメソッド内に複数の処理がある可能性がある
- メソッドを分割すべき
クラス名
-
manager- 何を管理しているのかが明確ではない
- そもそもクラスは何かを管理するものなので、わざわざ言う必要はない
- 複数形
- クラス名は単数形であるべき
- 手段を示す言葉
-
Wrapper,Builderなど - 目的を示す言葉を使うべき。
-
- 抽象的な言葉
-
Managerなど - 名前に抽象的な言葉が使われていると、クラスの中身が膨大になる
-
言語・フレームワークごとの命名規則
ここからは各言語・フレームワークごとの命名規則(指針)をまとめてみます。
Java
制約
- 全てのUnicode文字を使用可能だが、主に以下のみを使用する
- 英数字
- アンダースコア
- 先頭文字は英字またはアンダースコア
- 文字数に制限はない
- 大文字と小文字は区別される
- 予約語は使用できない
各要素に対する命名規則
- ファイル名:クラス名+
.java - クラス名:パスカルケース
- メソッド名:キャメルケース
- フィールドの値に対する取得・設定:先頭が
getまたはset、以降はキャメルケース -
boolean変数を返すメソッド:is+形容詞、has+名詞、can+動詞の形のキャメルケース
- フィールドの値に対する取得・設定:先頭が
- 変数名:キャメルケース
- 定数名:スネークケース
Python
PEP8で定められているようです。
制約
-
listやdict、strなどの組み込み関数に使われている名前は避ける- 衝突回避のためには、最後に
_を付ける
- 衝突回避のためには、最後に
- インスタンスメソッドの第一引数は
selfとする - クラスメソッドの第一引数は
clsとする - 1文字変数において、
l(小文字のL)、O(大文字のO)、I(大文字のI)は避ける(数字の0や1と混同するため)- 1文字変数のスコープは1画面で見渡せる範囲に収める
各要素に対する命名規則
- パッケージ名:全て小文字、なるべく短いもの、アンダースコアは非推奨
- モジュール名:スネークケース
- ファイル名:モジュール名+
.py - 型名:パスカルケース
- クラス名:パスカルケース
- 例外名:パスカルケース
- メソッド名:スネークケース
- 関数名:スネークケース
- 変数名:スネークケース
- 定数名:アッパースネークケース
- 内部変数名・内部メソッド名:アンダースコアで開始したスネークケース
- 予約名:
__[name]__の形式
Ruby
制約
- モジュール名・クラス名にアンダースコアは使用しない
- 略語は大文字のままとする
- 例:
HTML、URLなど
- 例:
各要素に対する命名規則
- ディレクトリ名:モジュール名をスネークケースとしたもの
- ファイル名:クラス名・モジュール名をスネークケース+
.rbとしたもの - モジュール名:パスカルケース
- クラス名:パスカルケース
- メソッド名:スネークケース
- 真偽を返すメソッド:最後に
?を付ける(isなどの接頭辞はつけない) - 破壊的なメソッド:最後に
!を付ける
- 真偽を返すメソッド:最後に
- 変数名:スネークケース
- 定数名:アッパースネークケース
Ruby on Rails
各要素に対する命名規則
- コントローラ名:スネークケース
- コントローラクラス名:パスカルケース、末尾に
Controller - コントローラファイル名:コントローラクラス名+
.rb、スネークケース
- コントローラクラス名:パスカルケース、末尾に
- モデル名:スネークケース
- モデルクラス名:パスカルケース、単数形
- モデルファイル名:スネークケース+
.rb、単数形 - テーブル名:スネークケース、複数形
C++
各要素に対する命名規則
- ファイル名:スネークケース+
.cpp - 型名:パスカルケース
- クラスのデータメンバ名:スネークケース、末尾に
_- 例:
my_variable_
- 例:
- 構造体のデータメンバ名:スネークケース
- 関数名:パスカルケース
- 変数名:スネークケース
- 定数名:先頭に
k、その後はパスカルケース- 例:
kMyConstant
- 例:
- 列挙型名:先頭に
k、その後はパスカルケース- 例:
kMyEnum
- 例:
- マクロ名:アッパースネークケース
JavaScript
各要素に対する命名規則
- ファイル名:キャメルケースかスネークケース+
.js - コンポーネント名:パスカルケース
- クラス名:パスカルケース
- 関数名:キャメルケース
- 変数名:キャメルケース
- 定数名:アッパースネークケース
TypeScript
制約
-
nullやundefinedは使用しないことが望ましい - 引用符号としては
'を使用することが望ましい - スぺースは2つを使用する
-
_や$を使用しない - 略語を使用する際、プラットフォーム名で必要とされない限りは先頭だけ大文字にする
- 例:
Url、Http、XML、PHPなど
- 例:
各要素に対する命名規則
- ディレクトリ名:ケバブケース
- ファイル名:キャメルケース+
.ts - コンポーネントファイル名:パスカルケース+
tsx - 型名:パスカルケース、型名を示す名前を付けない
- 関数名:キャメルケース
- 変数名:キャメルケース
- 定数名:アッパースネークケース
- プロパティ名:キャメルケース
- インターフェース名:パスカルケース
- メンバ名:キャメルケース
- プレフィックスにはIをつけない
- 名前空間名:パスカルケース
- Enum名:パスカルケース
- メンバ名:パスカルケース
React
制約
- 1つのファイルに1つのコンポーネントを定義する
各要素に対する命名規則
- コンポーネント名:パスカルケース
- ファイル名:コンポーネント名+
.tsx - 関数名:キャメルケース、短く直感的で説明的、単語の収縮は避ける
- 変数名:キャメルケース、短く直感的で説明的、単語の収縮は避ける
- 定数名:アッパースネークケース
- インスタンス名:キャメルケース
SQL
制約
- 大文字を使用しない
- ローマ字を避ける
各要素に対する命名規則
- テーブル名:スネークケース、複数形
- カラム名:スネークケース、ある瞬間の状態を表す名前
-
id、created_at、updated_atは必ず入れる - 外部キーは
[テーブル名の単数形]_id - 略語を使用しない
- 時間を表すカラムは
[受動態]_onか[受動態]_at
-
- ユニーク制約名:
uq_[テーブル名]_NN - インデックス名:
idx_[テーブル名]_NN- ユニークインデックスは
ui_[テーブル名]_NN
- ユニークインデックスは
HTML/CSS
Trello CSS Guide
- class名:ケバブケース
- JavaScript用のclass属性には
js-を付ける
- JavaScript用のclass属性には
- idはCSSで使わない
PHP
各要素に対する命名規則
- クラス名:パスカルケース
- 関数名:キャメルケースやスネークケース
- 変数名:キャメルケースやスネークケース
- 定数名:アッパースネークケース
bash
制約
-
#!/bin/shではなく#!/bin/bashを用いる - インデントは半角スペース2つ
-
usage()などを用いて処理内容・使い方をスクリプト内に記載する -
getoptsなどでオプション解析を行う - 定数には
readonly宣言をする - 関数には
function宣言をする - ファイル名は定数として定義する
- 変数の宣言箇所
- 値を変更する可能性がある(ハードコーディングしてる)なら冒頭
- 値を変更せず、内部的に利用するなら利用箇所の直前
- 関数は必ず
returnを行うようにする- 正常終了は
0、異常終了はそれ以外
- 正常終了は
- パイプの前後には半角スペースを1つずつ
- リダイレクトは前に半角スペース1つ、後にはスペースなし
- リダイレクトはグルーピングを行う
-
ifとthenは同一行に書き、ifは省略しない- 条件のあとのセミコロンの後ろには半角スペース1個
-
forやwhileのdoやdoneは揃える
各要素に対する命名規則
- 関数名:動詞と名詞を用いたスネークケース
- 変数名:スネークケース
- ローカル変数名:先頭にアンダースコア
- 定数名:アッパースネークケース
- ファイル名:末尾に
/を付けない
おわりに
どの言語やフレームワークを用いていても、スムーズに開発を行えるようにするためには、命名規則を遵守することが重要だと感じました。
今回調べたことをしっかりと覚えておき、今後の開発などに生かしていきたいと思います。
参考文献
命名規則についてまとめてみた(キャメルケース,パスカルケース,スネークケース,ケバブケース, etc...) #命名規則 - Qiita
クラスの命名のアンチパターン #オブジェクト指向 - Qiita
各プログラミング言語の一般的な命名規則まとめ | 株式会社一創
Python命名規則一覧 #コーディング規約 - Qiita
Python命名規則:PEP8とリーダブルコードより #Python3 - Qiita
Google C++ スタイルガイド(日本語全訳) Google C++ Style Guide (Japanese)
JavaScriptの命名規則早見表(と記法) #JavaScript - Qiita
スタイルガイド(コーディング規約) | TypeScript Deep Dive 日本語版
React / TypeScript の設計前に、改めて命名規則について把握する #React - Qiita
[TS] 命名規則のまとめ #TypeScript - Qiita
htmlのid属性とclass属性の命名はハイフンかcamelかsnakeか #HTML - Qiita