Kotlinの命名規則を再確認する

# はじめに
こちらは、株式会社 RetailAI X Advent Calendar 2022 の 25日目（最終日）の記事になります
24日目は、@k-yoshigaiさんの「[Go の Workspace を試す](https://qiita.com/k-yoshigai/private/cb094cf5ba0a26013f56)」でした

# 概要
普段使用している言語である _**Kotlin**_ の難解な技術や知識に関することを書こうかと思っていました
が、そんなことよりも基本的なことなのに未だに理解しきれていない **命名規則** について再確認しながら書いていこうと思います

# Kotlinの命名規則について（基本）
まずは基本
[公式](https://kotlinlang.org/docs/coding-conventions.html#naming-rules)の情報を要約して確認しましょう
 - パッケージ名
   - 小文字で「 _（アンダースコア）」は使用しない
   - 複数の単語を使うことは非推奨である
   - どうしても複数の単語が必要な場合は、全て小文字かキャメルケースで記述する
 - クラス、オブジェクト
   - 大文字から始まるキャメルケース
 - 関数、ローカル変数
   - 小文字のキャメルケース
   - 「 _（アンダースコア）」は使用しない
   - 例外として、クラスのインスタンスを作成するために使用されるファクトリ関数は、上記のルールを無視して抽象戻り型と同じ名前を持つことができる
 - テストメソッド
   - バッククォートで囲まれたスペースを含むメソッド名を使用できる
   - 「 _（アンダースコア）」が使用できる
 - プロパティ名
   - 定数の名前は大文字のスクリーミングスネークケース
   - 動作、あるいは可変なデータを保持するトップレベル宣言またはオブジェクトプロパティの名前は小文字のキャメルケース
   - シングルトンオブジェクトの参照を保持するプロパティには宣言時と同様の名前を使用する
   - 列挙定数（enum）については、大文字のスクリーミングスネークケースと大文字のキャメルケースを使用用途によって使い分ける
 - バッキングプロパティ
   - 概念的には同一だが、片方はパブリックで、もう片方が実装の詳細である2つのプロパティがクラス内にあるとき、プライベートなプロパティの名前は先頭にアンダースコアをつける
 - その他規則
   - **名前は目的が何であるか明確になるようつける**
   - よく分からない場合はJavaのコード規約に従う

こんな感じですね
文章で書くとわかりにくく感じますが、実際にはかなりシンプルな規約と言えます
> **名前は目的が何であるか明確になるようつける**

**この部分だけは例外ですが**

明確な名前というのがどういったものなのか、いつも迷いながら命名しています
というわけで、「どんな名前をつけることが正解になるのか？」を中心に考えていきましょう

# 明確な名前とは？
例えば、商品一覧を管理するテーブルがあったとして、以下の情報を持っています
| 1 | 2 | 3 |
|:-:|:-:|:-:|
|JANコード |商品名|商品価格|

これらの値をそれぞれ受け取る必要がある時、どういった名前の変数に格納すればいいでしょうか？
#### 1.JANコード
　ストレートに __*janCode*__ と命名することもできますが、 __*jan*__ だけでも問題ないと思われます
　理由は、JANコード以外に「JAN」と呼ばれるものが基本的には存在しないからです
　例外的に「1月(January)」のことを「JAN」と略称することがありますが、1月を単体で変数にすることはまずないので考慮する必要はないでしょう
　このように、**同様の意味を持つ単語が他に存在しない**場合はとても短い変数名でも明確であると言えます
#### 2.商品名
　__*name*__ とつけても良さそうに見えますが、名前に関連するデータは大抵の場合複数あるので、なんの名前なのかというのまでわかるようにしたほうが明確です
　これの場合は「商品の」「名前」なので __*productName*__ などがわかりやすいでしょうか
　このように、**似たような意味の単語が複数存在する可能性が高い**場合は明確にするために少し長めに名前をつける必要があります
#### 3.商品価格
　__*productPrice*__ という命名でもわかりやすいですし、「価格」という情報は「名前」に比べると複数使われる可能性が低い情報なので、 __*price*__ でも明確になる可能性があります
　どちらも正解に見えますが、同じテーブルに __*productName*__ という変数が既に存在しているので、 __*productPrice*__ の方が明確さという点では正しいのではないかと私は思います
　このように、**明確な名前の正解が状況によって変わる**という場合が最も判断に困ると思います

以上のように、明確な名前の基準には様々な要因が存在するので、自信を持って命名できるようになるためには慣れが必要になってきます

# Bool系の難しさ
変数名の中でもほんのちょっと名前を変えただけで全く違う意味になってしまうのが **Bool系** です
*true* と *false* の２パターンしか情報がないので、明確な変数名がつけられていないと混乱してしまいます
ログインという動作を例に考えてみましょう

あるアプリでログインに関する情報が必要になったときに、以下のどの変数名が正解でしょうか？
| 1 | 2 | 3 |
|:-:|:-:|:-:|
|isLogin|hasLogin|canLogin|


欲しい情報次第ですが**全部正解**です

現在ログインしているかどうかの判定が欲しい -> __*isLogin*__
ログインデータを所持しているかどうかの判定が欲しい -> __*hasLogin*__
ログイン可能かどうかの判定が欲しい -> __*canLogin*__

全て意味が違うので、正しい使い方をしないと誰にも意味が伝わらなくなってしまいます
しっかりとアプリの仕様を理解した上で使い分ける必要がありますね

# まとめ
命名規則というものは、プログラミングを始めたら最初の方に学ぶことになるいわば初歩的なことであり、コーディングに慣れてきた頃には身についているかその気になっていることだと思います
個人で開発を行なっている人だと、自分が読めれば問題ないのでめちゃくちゃな変数名で実装してる人なんかもいるかもしれません
もしチームで開発している場合は、一度チーム内で変数の命名について意見交換してみてください
実は命名規則が分かってなかった人や、明確な名前の考え方が違う人がいた場合に、情報を共有し合うことでチーム全体の品質アップにつながるかもしれません

以上、「Kotlinの命名規則を再確認する」でした。

# 最後に
これで **株式会社 RetailAI X Advent Calendar 2022** の全25記事投稿完了となります
いかがでしたでしょうか？
今回の参加者はそれぞれが職歴も普段の業務もバラバラで、それ故に個性的で素晴らしい内容の記事達が出来上がったと思っています
いずれかの記事が何かの気付きのきっかけになっていただければ幸いです

今後とも、**株式会社 RetailAI X** をよろしくお願いいたします！