http://martinfowler.com/bliki/InterfaceImplementationPair.html

すべてのクラスをインタフェースとペアにする手法である。 たとえば、ICustomerとCustomer、CustomerとCustomerImplのようなペアができる。 この場合、インタフェースと実装の型が分かれてしまうが、 これは、各クラスにヘッダファイルを付けるというC/C++の慣習を踏襲しているためである。

この手法のメリットは、 インタフェースの実装を別のものにすることで、 いつでも丸ごと入れ替えることができる点である。

ただ、私はこの手法があまり好きではない。 複数の実装がないのにインタフェースを使ってしまうと、インタフェースと実装とを同時に変更しなければならない分、手間がかかるからだ(IDEが補完してくれるが、やはり面倒だ)。 また、これだと裏に複数の実装があることを隠してしまう。

よくあることだが、これも、アプリケーションのクラスを作っているのか、ライブラリを作っているのかによって、トレードオフの仕方が変わってくる。 アプリケーションを作っている場合だと、インタフェースが用意されていない場合はインタフェースの抽出を行えばよい。それで終わりだ。 公布済みのライブラリだと、ユーザは素早いフィードバックを受けられないので、公布済み型のインタフェースを作るとよいだろう。 ただし、公布済みインターフェイスの中でクラスを実装したかのようにするだけでは、うまくはいかない。 インタフェースは様々なクライアントの要求に合わせて設計される必要があるが、 インタフェースが実装に合わないこともしばしばあるのだ。