🤔
暗黙的なインターフェースのメリットとは?
Goのインターフェースは暗黙的であるのが特徴らしいのですが、明示的なインターフェースとの差は分かるもののメリットがいまいち分からないので自分が思ったメリットを書いてみたいと思います。
まずGoで書くとこうなります。
type InterfaceA interface {
methodA(String msg)
}
type implA struct{}
func (i implA) MethodA(msg string) {
fmt.Println(msg)
}
実装側implA
にはこのインターフェースを実装するということが明示されていないため暗黙的なインターフェースと呼ばれます。
一方、javaのような明示的なインターフェースを持つ言語で書くとこうなります。
interface InterfaceA {
public void methodA(String msg);
}
class inpleA implements InterfaceA {
public void methodA(String msg) {
System.out.println(msg);
}
}
両者の違いとしてはimplements interfaceA
があるかないかの違いだけで、実装の方にこのインターフェースを実装しているということが分かるというドキュメント的なメリットくらいしかない気がしています。
(Goもコンパイル時にインターフェースに必要な実装がないとエラーになるので記述がないと実装漏れが発生するかといえばそうではない)
あるとすれば暗黙的インターフェースのメリットは実装にどのインターフェースを実装するか明示する必要はないので、たとえばUserRepositoryのようなUserテーブルを扱うレポジトリにメソッドがいくつかあって、それをそれぞれのユースケースで使う場合、ユースケースごとのにインターフェースができるはずです。
その場合明示的インターフェースはimplements A,B,C,D,...
のように逆にドキュメント部分の記述が膨らみすぎてドキュメントの意味をなさないし、むしろ混乱の元になるので暗黙的インターフェースの方がすっきりしていると思います。
と、ここまで書いてみたものの両者でそこまで差があるものではないかなーと感じているので、上記以外に暗黙的なインターフェースのメリットがあれば教えていただけると幸いです。
Discussion
この記事に近いことが書いてある。
また初めてのGo言語ではインターフェースは型安全なダックタイピングと表現されていた。
明示的なインターフェースより柔軟で、コンパイル時にインターフェースを満たしているかチェックできるという面でダックタイピングより安全であるのがよいところなのか。