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"は、"Next Step"の略です。)

###大文字と小文字の使い分け規約
検索性という意味では、大文字小文字の使い分けは重要になります。大文字と小文字の使い分けに関しては、[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 "ユビキタス言語")を名前付けに用いるべきです。ドメインの領域とプログラムを分けて考えない。プログラムを、プログラムっぽくしないことが重要です。何のためのプログラムなのか、アプリケーションなのかを考えると、自然とモデルが洗練されてくるような気がします。
この考えは、達人プログラマーでは、『専用の言語』として紹介されています。
>常にアプリケーション領域のボキャブラリーを使ったコード記述を試みましょう。-中略-さらにこれを推し進めれば、アプリケーション領域のボキャブラリー、シンタックス、セマンティックスーつまり専用の言語を用いて実際にプログラムを行うこともできるのです。
>-アンドリュー・ハント/デビッド・トーマス『達人プログラマー』

###コード中の名前に関するガイドラインやテクニック
一般的な名前付けは、[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)