電子書籍の厳選無料作品が豊富!

http://yukimura1227.blog.fc2.com/blog-entry-49.h …
上記ページにSpringを使用したサンプルプログラムがあり試しに動かしてみたのですが
疑問に思ったことがあるので質問させてください。main()関数の中に

SearchGoodsService searchGoodsService = appContext.getBean(SearchGoodsService.class);

という記述があり戻り値の型はSearchGoodsService(インターフェース)となっています。
ここをインターフェースではなく実装クラスのSearchGoodsServiceImpl
ではダメなのでしょうか。
上記ページの下部の方に
「インターフェースを使うのはSearchGoodsServiceImplにプログラムが依存しないようにするためで、
SearchGoodsServiceImplがどう変わろうが、変更の必要がない」
という趣旨の記述があります。
ここで1つ疑問なのですが 戻り値の型が実装クラスの型であっても
SearchGoodsServiceImplがどう変更(メソッドが増えたり、減ったり)しても影響がないと思います。
また、戻り値の型がインターフェースであたとしてもSearchGoodsServiceという
インターフェース名の変更があった場合、呼び出し元の
全てのプログラムを修正しなくてはならないと思いますがいかがでしょうか。

A 回答 (3件)

> 呼び出し元を変更せずにこれらのexecuteService()を


> 呼び出すように変更したいとなったときにはどうすればよいのか

/spring/conf/applicationContext.xmlを修正する。
Spring以外なら、Factoryメソッドを修正する。
    • good
    • 0

メソッドが増えたり減ったり、名前が変わったりという話ではありません。


この例では実装クラスが1つしかないため、インターフェースを用いる利点がわかりにくいですが、
SearchGoodsServiceの実装クラスが増えた場合のことを考えてみてください。

呼び出し元ではSearchGoodsServiceと書いておけば、
機能拡張で新しくSearchGoodsServiceImpl2やSearchGoodsServiceImpl3も扱う必要がでてきても、
呼び出し元を修正する必要はありません。

この回答への補足

ご回答ありがとうございます。
すみません。実際に
SearchGoodsServiceImpl2やSearchGoodsServiceImpl3
を作ってみたのですが
呼び出し元を変更せずにこれらのexecuteService()を
呼び出すように変更したいとなったときにはどうすればよいのか
がイメージできないです。教えていただけますでしょうか。

補足日時:2013/03/30 23:41
    • good
    • 0

> ここで1つ疑問なのですが 戻り値の型が実装クラスの型であっても


> SearchGoodsServiceImplがどう変更(メソッドが増えたり、減ったり)しても影響がないと思います。
変更する必要性があって修正しているのですから、影響は出ますよね。

> また、戻り値の型がインターフェースであたとしてもSearchGoodsServiceという
> インターフェース名の変更があった場合、呼び出し元の
> 全てのプログラムを修正しなくてはならないと思いますがいかがでしょうか。
もちろんです。そういうことをしなくていいように設計しなければなりません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!