Twitter Facebook github

TypeScriptのインターフェースに「I」のプリフィクスを付けるのはよくないのか

タイトル長くてすみません。
最近TypeScriptの勉強をしていて、様々な文章を読ませていただいています。

その一つが次のものなのですが、納得できなかったところがあったので自分なりにまとめてみます。

“TypeScript早わかりチートシート【1.5.3対応】 (2015/08/03)”
http://www.buildinsider.net/language/quicktypescript/01

上の解説では、TypeScript 1.5の文法解説などが分かりやすく書かれており、とても参考にさせていただきました。

“I”は使うべきではない?

インターフェースの宣言には、通常のクラスではないことを示すために、接頭辞に”I”を追加することが多々あります。例えば、”User”クラスはインターフェースとして”IUser”インターフェースを実装している、といったようにです。

先に挙げたページの、インターフェースについての解説で著者は次のように述べています。

命名規則として、先頭にIを付けていた時期もありましたが、現在ではマイクロソフトのガイドライン上で、Iは付けないこと、と改められています。

これを読んだとき、どうしても納得できませんでした。
「Iをつけること」ならまだしも「つけないこと」をガイドラインで明文化されているというのは、自分の中で全くもって同意できなかったからです。

ガイドラインを読んでみる

すごく頭の中でもやもやして仕方が無かったので、この情報のソースを探すことにしました。
TypeScript Guidelineでググった結果、すぐに次の文章に辿り着きます。

“Coding guidelines · Microsoft/TypeScript Wiki”
https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines

確かに次の一文があります。

  1. Do not use “I” as a prefix for interface names.

これはTypeScriptのWiki内にあるので、確かにTypeScriptを開発しているMicrosoftによって決められたルールであることは間違いありません。

実はTypeScriptそのものへの規約だった

上のガイドラインをよく読むと、最初に次のような注意書きがありました。

NOTE: These are Coding Guidelines for TypeScript Contributors

While these guidelines are mainly meant for contributors to the TypeScript project, certain suggestions apply as to how idiomatic TypeScript code > should be written (e.g. the “Names” and “Style” sections).

このように書かれていて、実はこのガイドラインというのはTypeScriptユーザーに向けたものでなく、TypeScriptコミッタへのガイドラインであることが分かります。

また、一部はTypeScriptの慣用的な書き方として提案はされていますが、そのように書くように推奨されているわけではありません。

ガイドラインに関する

結論

堂々とIUserインターフェースを作ろう

これらから、「インターフェースの命名規則で接頭辞に”I”を使ってはいけない、ということはないし、”I”を付けないことを推奨しているわけではない」と私は解釈しました。
Iを使う命名規則が有用だと考えるなら臆せずにその命名規則を採用しましょう。少なくとも私は有用だと考えているので、積極的に取り入れていくつもりです。

先の文章では、どうもユーザーに対して接頭辞”I”を使わないのがモダンである、というように聞こえてしまって仕方がありません。。

とはいえ、TypeScript自体のガイドラインで接頭辞”I”が使用禁止ということについても驚きが残りました。歴史的理由によるものであれば納得するのですが、このルールを制定するにあたった背景や議論、解説を探してみたのですが、どこにもありませんでした。

その他のインターフェース命名パターン

~Impl命名パターン

横道に逸れますが、インターフェースの命名規則で接頭辞”I”を使わないパターンで有名なのは、Javaでたまに見かける実装側のクラスに”Impl”を付ける規約ではないでしょうか。(e.g. Userインターフェースを実装したUserImplクラス)

なんだか格好よくて私自身作ったこともありますが、インターフェース1つに対して複数の実装クラスがあることが多く冗長であると言えますし、インターフェース名だけを見て、それがインターフェースなのかクラスなのか区別することができません。

ちなみにIDEを使用している場合、implementするインターフェースを入力する際、接頭辞のIを入力することでインターフェースのみをサジェストしてくれる利点もあると思っています。(賢いIDE+Javaなどであれば、そもそもIを打たずともインターフェースだけをサジェストしてくれますが…)

~able命名パターン

JavaのRunnableのように、 ~able の形でインターフェースを定めることもありますね。
特定のメソッドが存在する保証、という意味ではよりセマンティックで良い命名規約だと思っています。

・・・が、実際にコードを書く中で、このタイプの命名をできるケースってそれほど多くなく、また命名のセンス(と若干の英語力)が求められてしまいます。

例えば外部へ公開するAPI仕様としてインターフェースを作っていると、大抵実装クラスは名詞になってしまうので、この命名が通用しないケースが多いです。。

所感

命名規則は大切です。他人を参考するのも良いですが、自分のプロジェクトに合った規則を見つけて取り入れることが重要だと思います。

コメントを残す

メールアドレスが公開されることはありません。