今日の役に立たない一言 - Today’s Trifle! -

古い記事ではさまざまなテーマを書いていますが、2007年以降はプログラミング関連の話がほとんどです。

インタフェースと実装クラスの命名

Java のコアAPIの中でも、実装クラスの名前にインタフェース名+Impl とした命名をしているクラスがある。確かにダサい。そういった命名をされているクラスのドキュメントを見ると分かるんだけど、そういったクラスは、コアAPIの中でもかなり初期のころに作られたクラスであることが多い。
Java のドキュメントを見ると分かるように、多くのクラスやメソッドが deprecated になっている。それは、一旦は実装したが、後々になって、仕様上問題があることがわかった場合はもちろんだけど、より良い命名規約が作られて、新しい命名規約の元に新しいメソッドが定義され、古いメソッドが deprecated になっているものも多い。ソースを見てみると、新しいメソッドの中から古いメソッドが呼び出されているだけだったりする。つまり、命名理由以外に deprecated とする理由がない訳だ。
インタフェースと実装クラスの命名について Java のコアAPIを調べると、一般的に次のような命名が多く採用されている。よく使われているクラスを例にあげるとすれば、java.util.Collection や java.util.List がそのインタフェースにあたる。
多くのインタフェースには、その一般的な実装が作られることが多い。そのインタフェースの実装クラスならば、どのクラスでも共通となる最低限の実装を持った抽象クラスが作られる。例えば java.util.List インタフェースに対する抽象クラス名は java.util.AbstractList。そして、一般的な実装を持つ抽象クラスを継承して、Concrete クラスが作られていく。java.util.List に対しては、java.util.ArrayListjava.util.Vetor、java.util.Vector をさらに継承した java.util.Stack など。
業務系のクラスでインタフェイスの実装クラス名に「インタフェイス名+Impl」って名前をつけるのはダサいよね。

インタフェイスに対して実装が1クラスになる場合にはインタフェイスと実装を分離する必要が無いとボクは思うね。

確かに必要はないと思うけど、分離する意味はあるんじゃない?
もし分離する場合は、分離する意味を実装クラスのクラス名で表現すればいい。例えば、java.util.List と java.util.Vector みたいに、実装クラス名にインタフェース名を含む必要もない。クラス名を見て実装が分かる方が大切。
仕様は仕様、実装は実装。
そして名前は重要。名前は「見える化」の第一歩なんだから。