タイトルでは「Javaで」と書きましたが、別に特定言語に限った話題じゃないです。
たまたま、直近ではJavaの開発が多く、その時の実例から「Javaで」と付けましたが、
Java以外にも手持ちの言語に適用してくれればと思います。
と言う事で、先に結論だけ書いておくと、こんな感じの内容です。
- 他の言語のキーワードを借用する。
- 他のライブラリの命名を借用する。 ※ 他の言語の標準ライブラリも含む
(*'▽') 興味が湧いた人は続きを読んでみてね!
■ネーミングについて
プログラミングに於いて、特に集団開発やオープンソースなど、不特定多数の人が読むコードに於いては、ネーミングは非常に重要です。
しかし、非常に重要ではあるものの、クラス名やメソッド名に 適切な名前 を与えていくのは思っている以上に時間が掛かる作業です。
ネーミングに関してのアンチパターンとかはまた大きなテーマなので今回は割愛しますが、
良くないネーミングは避けつつ、解り易く良い名前を付けるのは大変な頭脳労働になります。
と言う事で、少しでも効率よく適切な命名をする為に、普段実践している事を紹介します。
◇ネーミング時の思考フロー
せっかく改めてQiitaに記事を書くので、ただ普段やってる事を書いただけでは はてなブログ と大差ないな。
と思ったので、普段ぼくがプログラミングする時のネーミングパターンを振り返ってみました。
- 普段良く使っている名前を使う。
(過去に使ったネーミングを再利用) - 特に常用している名前が無かったら、その時初めて名前を考え始める。
- その言語で一般的に使用されている用語を軽く調べる。
(目安:ぐぐって1ページ以内に出て来るレベル) - 他の言語のキーワードや、他のライブラリの命名を拝借する。
(具体例は後述します) - どうしても良いのが無かったら、仕方ない、いい感じに英訳して名前付けるか。
(本当に「名前を考える」としたらこの最終手段としてやる。基本的には定義済みの単語をどこかから持って来る。) - 【補足】
なんか時間が掛かりそうだったら名前を仮置きしといて、
FIXME付けて後でリファクタリングする事にして先に進む。
※モノによって優先順位は多少前後するかな、と思いますが、基本形はこんな流れになるかなと。
(*'▽') まぁ、普通の事だと思うよ!
◇他言語のキーワード転用
上記思考フローに書いた通り「他の言語での相当機能などからキーワードを拝借する」は結構便利です。
具体的に、ぼくが実際にやった「転用」例を幾つか紹介します。
例: Javaの開発でC#のキーワードから流用。
マルチスレッド処理を行う共通部品に async / await / aggregate と言う名前を付けた。
Javaのマルチスレッド系の標準実装(java concurrency utilities)をラップしたマルチスレッド部品を作った時、
C#(厳密にはC#3.x系でしたっけ)には、言語構文として非同期処理を簡潔に書ける async/await が機能追加されてますので。
相当機能としてその辺のネーミングをパクりました。
aggregate はキーワードとしては追加されてませんが、これは昔から良くある名前として使ってます。
例: Java6の開発でJava6以降の追加機能の名前を流用。
TryWithResources と言うクラスを作った。(実装内容はお察し)
いや、素直にJDKのバージョン上げろよwww
そりゃあぼくもそう思いましたわ、そんな事は百万回言った猫ですわ。 しかしながら日本の開発現場というのはまだまだ保守的な所が多いのが実情で、 政治的な事情によってバージョンを上げる事を断固として拒否される事もままあります。 *よね?* 或いは、**バージョン上げても良いけどそれならシステムの全機能の全テストやってね**、とか言われたりね。 *んな事言って、未だにJDK6なんか使ってセキュリティリスクとかどうすんの??って思いますけどね、、、まぁ神様であらせられるお客様のたってのご希望でしたので。(意訳:もう知らん)*try-with-resources構文の代替として使える、確実なリソース開放を行う為のユーティリティクラスに付けた、どストレートな名前です。
勿論、これは「JDK7に上げれりゃこんなクラスを作る必要なんて無かったんだよ!!」と言うアピールです。
javadocにも「将来的にはJDK7以上に上げて、この悪しきクラスはバシッと消してくれ」って書いときました。
まぁでも、今でも消されずに生き残ってるんでしょうね・・・。
例: LINQのメソッド名なんかもパクりやすいよ。
条件を指定するオブジェクトに対して predicate って名付けたり、
或いはそういうインタフェースに対して IPredicate って名付けたり。
LINQのメソッド名(多くは対応するデリゲート名だったりしますが)なんかも、非常に汎用性が高く、パクりやすい良い名前が多いです。
◇ネーミングをパクる事のメリット
他の実装からネーミングを拝借して来る事、特にキーワードレベルになっているものを利用する事は、
名前を考える時間を短縮する事以上に、以下のようなメリットがあり、ぼくとしてはこちらが本命になっています。
- 定義済みである為、情報密度が高い。
- そのワードでぐぐって情報が出て来る。
- なんだったら公式のドキュメントがあったりするのでURL書いといて参照飛ばし出来る。
◇定義済みのワードを使用するメリット
特に一つ目のメリットは非常に大です。
体系的な知識・情報を簡潔に言い表す手段として、定義済みの名称を使用すると言うのは非常に有効です。
一言で伝えられる情報量が他に比べて段違いに多く、少ないコードで表現できる内容が充実します。
下手をするとイチ単語で全てが完結するレベルです。
つまり、クラス設計にデザインパターンを用いるのと同じようなものですね。
このクラスのインスタンスはシステムのプロセス中、ただ一つだけ生成される事が保証されており、システム全体で共通する情報のキャッシュや共有の為に用いられます。
と言うよりも
このクラスはシングルトンです。
と言った方が早いし正確です。
◇開発ドキュメントからリンクを貼れる。
そして javadoc の see タグで Wikipedia - シングルトンパターンとかに参照飛ばししとけば良いのです。
こうすれば、自分で長々とjavadocを書く手間も減りますし、より一般的でオープンな情報を取り込む事が出来ます。
◇キーワードはぐぐり易い。
また、キーワードになっている場合、ほぼ間違いなく言語仕様が存在するので、ぐぐってすぐに情報が(恐らくは標準ドキュメントが)ヒットします。
若しくは、標準ドキュメントがヒットせずとも、それらに関して解説した入門サイト(若しくはブログ、或いはQiita記事など)がヒットする可能性が高く、検索性が高いというメリットがあります。
ぼくの場合、C#からパクってきたキーワードをネーミングに使う事が多いですが、この場合は 「このキーワードでググってMSDNがヒットしたら正解だからそれをじっくり読んでね!!」 と言う事を 通常コメントで 埋めておきます。
(一応、開発としてはJavaの開発案件なので、堂々と別言語のドキュメントにリンクを張るのは気が引けたので、
通常コメントで、コードを読もうと言う意思のある人向けにヒント文として仕込んでおく事にしています。
或いはもっと直接的に、それら読んでおいて欲しいページのURLを直接書いておく事もありますね。)
■おまけ: ネーミング時に使用しているチートシート
どうしても良い拝借元が見付からなかった場合、頑張って自分でいい感じの名前を付けに行く訳ですが、
この辺はどうしても時間が掛かるので、出来る限り簡単に調べたい。
と言う事で、この辺をよく参考にさせて貰ってます。
プログラマ向けネーミング辞書「Codic」:
https://codic.jp/engine
プログラミングで変数名や関数名のネーミングに迷ったときに便利なカンニングペーパーまとめ:
上記Codicの紹介はじめ、それ以外の名前付けで役立つものが沢山まとまっています、お気に入りの物を探してください
https://nelog.jp/programming-words
(*'▽') 大変お世話になってます!
■参考資料集
プログラムのネーミングに迷ったら GitHub でコード検索すると参考になる説
GitHubでコード検索するという画期的な手法が提唱されています。
https://qiita.com/kyoshidajp/items/c5d4f060df636ea20cbb
プログラミングでよく使う英単語のまとめ【随時更新】
最強of最強なネーミングチートシートを見付けてしまった。
https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923
よりよいネーミングを目指して
ネーミングに関する規約というか、指針が纏まっています。
https://qiita.com/takasek/items/693c57dc9ddc6c1eb1ba