はじめに
以前インターンでコードレビューをしてもらったとき、「命名規則に注意しろ」というようなことを言われました。
なので、今回は様々な言語・フレームワークに対しての命名規則をまとめてみました。
命名規則の用語
命名規則を考える際、よく出て来る用語があるので、ここでまとめておきます。
キャメルケース
- 先頭の単語だけ小文字
- それ以外の単語の先頭が大文字
- 例:
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
制約
各要素に対する命名規則
- クラス名:パスカルケース
- 関数名:キャメルケースやスネークケース
- 変数名:キャメルケースやスネークケース
- 定数名:アッパースネークケース
おわりに
どの言語やフレームワークを用いていても、スムーズに開発を行えるようにするためには、命名規則を遵守することが重要だと感じました。
今回調べたことをしっかりと覚えておき、今後の開発などに生かしていきたいと思います。
参考文献
命名規則についてまとめてみた(キャメルケース,パスカルケース,スネークケース,ケバブケース, 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