色々な言語・フレームワークの命名規則をまとめてみる

<!-- 色々な言語・フレームワークの命名規則をまとめてみる -->

## はじめに

以前インターンでコードレビューをしてもらったとき、「命名規則に注意しろ」というようなことを言われました。

なので、今回は様々な言語・フレームワークに対しての命名規則をまとめてみました。

## 命名規則の用語

命名規則を考える際、よく出て来る用語があるので、ここでまとめておきます。

### キャメルケース

- 先頭の単語だけ小文字
- それ以外の単語の先頭が大文字
- 例: `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文字を使用可能だが、主に以下のみを使用する
  - 英数字
  - アンダースコア
- 先頭文字は英字またはアンダースコア
- 文字数に制限はない
- 大文字と小文字は区別される
- [予約語](https://www.k-cube.co.jp/wakaba/server/java_reserved.html)は使用できない

#### 各要素に対する命名規則

- ファイル名：クラス名+``.java``
- クラス名：パスカルケース
- メソッド名：キャメルケース
  - フィールドの値に対する取得・設定：先頭が`get`または`set`、以降はキャメルケース
  - `boolean`変数を返すメソッド：`is+形容詞`、`has+名詞`、`can+動詞`の形のキャメルケース
- 変数名：キャメルケース
- 定数名：スネークケース

### Python

[PEP8](https://pep8-ja.readthedocs.io/ja/latest/)で定められているようです。

#### 制約

- ``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-``を付ける
- idはCSSで使わない

### PHP

#### 制約


#### 各要素に対する命名規則

- クラス名：パスカルケース
- 関数名：キャメルケースやスネークケース
- 変数名：キャメルケースやスネークケース
- 定数名：アッパースネークケース

## おわりに

どの言語やフレームワークを用いていても、スムーズに開発を行えるようにするためには、命名規則を遵守することが重要だと感じました。

今回調べたことをしっかりと覚えておき、今後の開発などに生かしていきたいと思います。

## 参考文献

[命名規則についてまとめてみた（キャメルケース，パスカルケース，スネークケース，ケバブケース, etc...） #命名規則 - Qiita](https://qiita.com/shota0616/items/4ac7a8696b3f6ccbe2bc)

[命名アンチパターン - Neo's World](https://neos21.net/tech/programming/naming-anti-patterns.html)

[命名アンチパターン #オブジェクト指向 - Qiita](https://qiita.com/power3812/items/5eb0db4b53e5a8d4c913)

[クラスの命名のアンチパターン #オブジェクト指向 - Qiita](https://qiita.com/magicant/items/8134edf969f9629fa66e)

[各プログラミング言語の一般的な命名規則まとめ | 株式会社一創](https://www.issoh.co.jp/tech/details/2339/)

[Java言語の命名指針 #命名規則 - Qiita](https://qiita.com/rkonno/items/1b30daf83854fecbb814)

[Javaの予約語](https://www.k-cube.co.jp/wakaba/server/java_reserved.html)

[Python命名規則一覧 #コーディング規約 - Qiita](https://qiita.com/naomi7325/items/4eb1d2a40277361e898b)

[Python命名規則の基本](https://zenn.dev/the_exile/articles/python-naming-convention-)

[Pythonの命名規則とルール](https://zenn.dev/gakkie555/articles/b7d89442365943)

[Python命名規則：PEP8とリーダブルコードより #Python3 - Qiita](https://qiita.com/shiracamus/items/bc3bdfc206b39e0a75b2)

[【Ruby超入門】命名規則](https://zenn.dev/yyykms123/articles/2019-11-20-naming-convention)

[Ruby 命名規則まとめ #Ruby - Qiita](https://qiita.com/TakeshiFukushima/items/647a652439b55525945f)

[Railsにおける命名規則 #Rails - Qiita](https://qiita.com/gakkie/items/3afcd505c786364aa5fa)

[Google C++ スタイルガイド(日本語全訳) Google C++ Style Guide (Japanese)](https://ttsuki.github.io/styleguide/cppguide.ja.html)

[C++命名規則一覧 #コーディング規約 - Qiita](https://qiita.com/naomi7325/items/fbf118f1b14d7e482322)

[JavaScriptの命名規則早見表（と記法） #JavaScript - Qiita](https://qiita.com/RyosukeSomeya/items/90f8e780b37c53758276)

[スタイルガイド（コーディング規約） | TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/styleguide)

[React / TypeScript の設計前に、改めて命名規則について把握する #React - Qiita](https://qiita.com/shuhosaka/items/4a11158b3e9060d3b612)

[[TS] 命名規則のまとめ #TypeScript - Qiita](https://qiita.com/mistylady/items/21843c01f0b7289a6c83)

[データベースオブジェクトの命名規約 #規約 - Qiita](https://qiita.com/genzouw/items/35022fa96c120e67c637)

[htmlのid属性とclass属性の命名はハイフンかcamelかsnakeか #HTML - Qiita](https://qiita.com/itagakishintaro/items/168667d5ee4c56b30d52)

[Trello CSS Guide](https://gist.github.com/bobbygrace/9e961e8982f42eb91b80)

[雑にしていない？PHPの命名規則を理解し、効率よく開発を進めよう - 忍者CODEマガジン](https://ninjacode.work/magazine/programming/php17/)