Naming -名前付け-

#Naming -名前付け-

プログラミングで最も重要な技術の一つが、名前付けです。
且つ、センスが問われるものなので、上達は難しいものでもあります。
この記事では、様々な文献から抽出した名前付けに関する情報を雑多にまとめました。

>-名前重要-
ソフトウェアの設計のアプローチとして、『まず名前から入る』というのは、あまり語られていない秘訣としてもっと広く知られても良いように思います。
> - まつもとゆきひろ 『プログラマが知るべき９７のこと』

#コミュニケーションの基礎

名前は、コミュニケーションの基礎となるものです。
私にもあなたにも名前が無ければ、疎通することは困難になります。
名前をコミュニケーションの基礎と見た場合に重要なルールは以下の通りです。

* 発音可能であること
* 検索可能であること

※現実世界のみであれば検索可能じゃなくても良いかも知れません。
プログラミングは、チームや複数人で行うことのほうが多いと思います。その際、コードがコミュニケーションのツールとなるので、発音・検索可能でないと、不便極まりないです。生産性がかなり変わってきます。

>ある会社でgenymdhmsという名前を使っていました。
このため、「ジェン ワイ エム ディー エイチ エム エス」といいながら仕事をする必要がありました。
> - ロバート C. マーチン 『Clean Code』


##ガイドライン

###システムハンガリアンは使用しない

発音可能な名前を付けたいのであれば、[システムハンガリアン](http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95 "Wikipdia")はやめたほうが良いと考えます。
システムハンガリアンとアプリケーションハンガリアンは意味が違うので注意してください。アプリケーションハンガリアンに関する良い文献は[間違ったコードは間違って見えるようにする](http://local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B "Joel Spolsky")です。

###略語および、頭字語は使用しない
>一般的に、識別子に略語または頭字語を使用してはいけません。名前については簡潔さよりも読みやすさのほうが重要です。一般的に理解されていない略語および頭字語を使用しないことも同様に重要です。すなわち、ある分野におけるエキスパートではない大多数の人々は、それが何を意味するのかすぐにはわからないのです。

>-Krzysztof Cwalina,Brad Abrams 『.NETのクラスライブラリ設計』

例えば、UIや、XMLは、広く一般的に受け入れられています。これらはコード内に登場しても、理解を妨げる要因にはなりません。
AppleのCoding Guideline for Cocoaには、推奨する略語がまとめられています。[Acceptable Abbreviations and Acronyms](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/APIAbbreviations.html#//apple_ref/doc/uid/20001285-BCIHCGAE "Acceptable Abbreviations and Acronyms")

Appleが公開しているObjective-Cのクラスライブラリ群は、クラス名にPrefixをつけています。
UIViewや、NSStringです。これらは、Objective-Cが名前空間を持たないことから、仕方なくつけているのだと理解しています。（※ちなみに"NS"は、"NeXTSTEP"の略です。)

###大文字と小文字の使い分け規約
検索性という意味では、大文字小文字の使い分けは重要になります。大文字と小文字の使い分けに関しては、[MSDN](http://msdn.microsoft.com/ja-jp/library/ms229043(v=vs.100).aspx)が非常に参考になります。


#Code Naming

##ユビキタス言語/専用の言語
コード内の、とりわけモデル層においては、[ユビキタス言語](https://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap1.html "ユビキタス言語")を名前付けに用いるべきです。ドメインの領域とプログラムを分けて考えない。プログラムを、プログラムっぽくしないことが重要です。何のためのプログラムなのか、アプリケーションなのかを考えると、自然とモデルが洗練されてくるような気がします。
この考えは、達人プログラマーでは、『専用の言語』として紹介されています。
>常にアプリケーション領域のボキャブラリーを使ったコード記述を試みましょう。-中略-さらにこれを推し進めれば、アプリケーション領域のボキャブラリー、シンタックス、セマンティックスーつまり専用の言語を用いて実際にプログラムを行うこともできるのです。
>-アンドリュー・ハント/デビッド・トーマス『達人プログラマー』

##クラス名は名詞と動名詞
クラス名は基本的には名詞です。
ドメイン駆動設計の中に、サービス(Services)というパターンが出てきます。
これはすごい便利です。ユビキタス言語ではないけど、ソフトウェアとして必要な処理群ってアプリケーションを普通に作る上で絶対出てくると思うのです。簡単な例だと、CSVパーサーとか、Windowsならレジストリアクセサとか。
これらは名前の最後にServiceを付けます。
CSVParserは、しっくりくるのでOKですね。CSVParingServiceより良い感じがします。
RegistoryAccessorは、どうでしょう？"Accessor"ってあんまり出てこない感じがします。そうゆう場合は、RegistoryAccessingServiceか、AccessingとってしまってRegistoryServiceですね。
*役割の名前を付けられなかったら、動名詞にして末尾にServiceをつけると格好良くなります（笑*


##メソッド名は動詞から始める
これは有名ですね。「メソッドはそのオブジェクトに命令を下すもの」なので、命令型が良いのです。なので動詞からすぐはじめる。
以下のリストでほとんどカバーできていると思います。

| 動詞名    | 日本語表現         | 主な戻り値                                               |
|-----------|--------------------|----------------------------------------------------------|
| Get       | 取得する           | オブジェクト                                             |
| Set       | 設定する           | void                                                     |
| Update    | 更新する           | void(updateした件数返す場合も)                           |
| Delete    | 削除する           | void(deleteした件数返す場合も)                           |
| Insert    | 挿入する           | void                                                     |
| Select    | 選択する           | オブジェクト                                             |
| Find      | 選択する           | オブジェクト                                             |
| Add       | 追加する           | void                                                     |
| Remove    | 削除する           | オブジェクト                                             |
| Clear     | クリアする         | void                                                     |
| Append    | 追記する           | void or 追加後のオブジェクト                             |
| Trim      | 整形する           | オブジェクト                                             |
| Compare   | 比較する           | 比較結果(-1,0,1)                                         |
| Concat    | 結合する           | オブジェクト                                             |
| Split     | 分割する           | オブジェクト                                             |
| Enumerate | 列挙する           | 配列                                                     |
| Move      | 移動する           | void                                                     |
| Copy      | コピーする         | void                                                     |
| Create    | 作成する           | オブジェクト                                             |
| Make      | 作成する           | オブジェクト                                             |
| Generate  | 作成する           | オブジェクト                                             |
| New       | 生成する           | オブジェクト                                             |
| Build     | 組み立てる         | オブジェクトもしくはvoidで引数に与えられた変数を組み立て |
| Flush     | フラッシュする     | void                                                     |
| Begin     | 始める             | void                                                     |
| End       | 終わる             | void                                                     |
| Initialize | 初期化する         | void                                                     |
| Load      | ロードする         | void                                                     |
| Merge     | マージする         | オブジェクト                                             |
| Read      | 読む               | オブジェクト                                             |
| Write     | 書く               | void                                                     |
| To        | 変換する           | オブジェクト                                             |
| Convert   | 変換する           | オブジェクト                                             |
| Accept    | 許容する           | void                                                     |
| Fill      | 満たす             | void                                                     |
| Apply     | 適用する           | void                                                     |
| Show      | 表示する           | void                                                     |
| Union     | 和集合を取得する   | オブジェクト                                             |
| Intersect | 積集合を取得する   | オブジェクト                                             |
| Do        | 実行する           | void                                                     |
| Run       | 実行する           | void                                                     |
| Shutdown  | シャットダウンする | void                                                     |
| Save      | 保存する           | void                                                     |
| Cancel    | キャンセルする     | void                                                     |
| Refresh   | リフレッシュする   | void                                                     |
| Execute   | 実行する           | bool(成功か失敗か)                                       |
| Resolve   | 解決する           | オブジェクト                                             |
| Invoke    | 呼び出す           | オブジェクト                                             |
| Handle    | ハンドルする       | オブジェクト                                             |
| Raise     | 呼び出す           | void                                                     |
| Is        | 〜かどうか？       | bool                                                     |
| Contains  | 含んでる？         | bool                                                     |
| Exists    | 存在する?          | bool                                                     |
| Verify    | 確認する/評価する   | bool(voidでNGなら例外でもいいかも）                      |
| Validate  | 検証する           | bool                                                     |
| Try       | 試みる             | bool(voidでNGなら例外でもいいかも）                      |
| Has       | 持っている？       | bool                                                     |
| Equals    | 比較する           | bool                                                     |
| Can       | できるか？         | bool                                                     |

名が体を表さないのはNG。Getメソッドなのに、メソッド内でSetしちゃっているとか良くみかけるコードです。

##メソッド名にてメソッド内の処理を具体的に表現しちゃう
これは割りと最近知ったテクニックで、オープンソース見るとよく出てきますね。
例えば、
.NETでは、CreateDirectoryというメソッドがありますが、これをWrapして、
もし存在しなかったらディレクトリを作るというメソッドを作る場合に
CreateDirectoryIfNotExists
とか、英文っぽいメソッドですね。長くなりすぎると微妙ですけど。

##コード中の名前に関するガイドラインやテクニック
一般的な名前付けは、[MSDN](http://msdn.microsoft.com/ja-jp/library/ms229002(v=vs.100).aspx)が参考になります。
また、日本語でわかりやすい例とともに紹介されている[Okapi](http://www.okapiproject.com/java/java_codeconventions/jcc_naming.htm)も参考になります。boolean型を返すメソッド名等。
[リーダブルコード](http://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?ie=UTF8&qid=1412456813&sr=8-1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)は、ページ数も少なく持ち運びも便利です。挿絵はあまり好きになれませんが。。。


##意図の明白なインターフェース
>ある開発者があるコンポーネントを使用するために、その実装についてじっくり考えなければならないのであれば、カプセル化の価値は失われる。
>エリック・エバンス 『ドメイン駆動設計』

メソッドの型・名前・引数名を駆使して、そのメソッドの内部詳細を知らずとも使えるようなインターフェースを用意する必要があります。エリック・エバンスは、そのことを[意図の明白なインターフェース](https://www.ogis-ri.co.jp/otc/hiroba/technical/DDDEssence/chap2.html)として紹介しています。

#参考書籍
Kevlin Henney[『プログラマが知るべき９７のこと』](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D97%E3%81%AE%E3%81%93%E3%81%A8-%E5%92%8C%E7%94%B0-%E5%8D%93%E4%BA%BA/dp/4873114799/ref=sr_1_cc_1?s=aps&ie=UTF8&qid=1412459215&sr=1-1-catcorr&keywords=%EF%BC%99%EF%BC%97%E3%81%AE%E3%81%93%E3%81%A8)
ロバート C. マーチン [『Clean Code』](http://www.amazon.co.jp/Clean-Code-%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%81%94%E4%BA%BA%E3%81%AE%E6%8A%80-Robert-Martin/dp/4048676881/ref=sr_1_1?ie=UTF8&qid=1412457687&sr=8-1&keywords=Clean+Code)
Krzysztof Cwalina,Brad Abrams [『.NETのクラスライブラリ設計』](http://www.amazon.co.jp/NET%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E8%A8%AD%E8%A8%88-Microsoft-net-Development-Krzysztof-Cwalina/dp/4891006765/ref=sr_1_1?ie=UTF8&qid=1412457709&sr=8-1&keywords=.NET%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E8%A8%AD%E8%A8%88)
アンドリュー・ハント/デビッド・トーマス[『達人プログラマー』](http://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E2%80%95%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%E3%81%AE%E8%81%B7%E4%BA%BA%E3%81%8B%E3%82%89%E5%90%8D%E5%8C%A0%E3%81%B8%E3%81%AE%E9%81%93-%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AA%E3%83%A5%E3%83%BC-%E3%83%8F%E3%83%B3%E3%83%88/dp/4894712741/ref=sr_1_1?ie=UTF8&qid=1412457747&sr=8-1&keywords=%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC)
Dustin Boswell/Trevor Foucher[『リーダブルコード』](http://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655/ref=sr_1_1?ie=UTF8&qid=1412456813&sr=8-1&keywords=%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89)
エリック・エバンス [『ドメイン駆動設計』](http://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Eric-Evans-ebook/dp/B00GRKD6XU/ref=sr_1_1?ie=UTF8&qid=1412457769&sr=8-1&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88)
Jaroslav Tulach [『APIデザインの極意』](http://www.amazon.co.jp/API%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E6%A5%B5%E6%84%8F-Java-NetBeans%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E6%8E%A2%E7%A9%B6%E3%83%8E%E3%83%BC%E3%83%88-Jaroslav-Tulach-ebook/dp/B00LGJTXT8/ref=pd_sim_kinc_1?ie=UTF8&refRID=0GRDEK64FGYAYSJN9E3X)
[Namingのプレゼン資料](http://www.slideshare.net/kokishimizujp/naming-47170579)