- ベストアンサー
インターフェースとは
ちょっとよく理解していないのですが (メリットとデメリットがハッキリしていない現状です。) 共同開発プロジェクトではインターフェースは欠かせないもの なのでしょうか? 逆に個人レベルでアプリケーションを作成する場合などには インターフェースを自作したりするべきではないのでしょうか? インターフェースを理解するにあたって おすすめの書籍などあったら教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
システム開発でインターフェースを使うと便利なケースは、 例えばJavaのソフトを画面(GUI)チームと、機能チームに分かれていて、 画面チームが進行が早く、機能チームが遅れていた場合、 画面チームが画面のチェックをしようとしても ボタンを押した時の処理は機能チームが作ってるとこなので、そのままではコンパイルが通らない。 そこでインターフェースとテスト用のクラス(実際はボタンを押しても何も起きないようにしたやつとか)を機能チームからもらっておき、 ボタンを押した場合は、それを使うように(つまりボタンを押しても何も起きないように)しておくと、 画面チームは画面のレイアウトなどのテストができる。 機能チームからちゃんとした機能が入ったクラスをもらえば、インスタンスの生成部分をテストクラスから本番用クラスに差し替えるだけでOK。 もしも機能の変更があっても、生成部分を別の変更後のクラスにすればそれでOK、となる。 これがインターフェースのメリットのひとつ。 >例えば、標準APIで示されているインターフェースっていうのは実態はどこにあるんですか? 大きく2種類あると思われます。 AWTやSwingのリスナーインターフェースは、実態(実装クラス)はなく、それを使うプログラマーに実装してもらう。 (アダプタクラスとかはある意味実態だけど、特殊なので省略) もうひとつは、実装クラスはあるけど一般には使わない、インターフェースを使うというもの。 インターフェースのもうひとつの利点として、「実装は気にしなくてもいい」というのがある。 必要な機能の呼び出し方、つまりメソッド名と引数(シグネチャ)を知っていれば、 「実際にどう動くかは分からないけど呼べばちゃんと動く」という、カプセル化を活かしたものになってるわけです。 >それなら抽象クラスで同じ作用を代替させることもできるのでは。 抽象クラスでも問題ないけど、よくある「多重継承の問題」にぶち当たるので、インターフェースでないとまずいケースが多い。 というわけで、ざっと回答してみました。 分かりづらいところがあると思うので、そこは補足にでも入れてください。
その他の回答 (2)
- ggaogg
- ベストアンサー率43% (38/88)
すぐに業務で使うわけではないのであれば、 しばらく(50時間くらい)Javaの標準APIを使って趣味のプログラミングをしているだけでも、インターフェイスの意義がわかってきます。 つまりJavaの標準APIが、知らず知らずのうちにインターフェイスのお手本を示してくれます。
お礼
例えば、標準APIで示されているインターフェースっていうのは 実態はどこにあるんですか? それはimplementsするクラスで実態を定義するということですよね。 どのボタン押したとかいうイベントを受け取るような なんとかリスナーとかいうインターフェースは プラットフォームに依存した特別なインターフェースなんですかね。
- m-oosgi
- ベストアンサー率62% (10/16)
開発手法にも依りますが、僕の場合、まずインタフェースを定義してから実装することが多いです。(すべてではないですが) インタフェースをimplementsするクラスは、インタフェースによって仕様が決められているため、実現方法や内部の状態について、これを利用する側に影響がすくないという利点があります。 たとえば、 interface Book{} class Novel implements Book{} class Comic implements Book{} があり、これを利用するクラス class Provider{} は、Bookについて知りたいとき、Bookがどのような実装であれ、Providerはインタフェースが定めるBookの状態を知ることができます。
お礼
共同開発では、よくインターフェースを別のチームに提供する という話があるようですが まぁいうなれば窓口のような物ですよね。 例えば、銀行が各地の支店やコンビニにATMというインターフェースを提供しているというようなことですよね。 つまり インターフェースの利点はクライアント側が 目的に対して、最も簡潔な利用手順さえ知っていれば 結果が得られるということなんでしょうか。 それなら抽象クラスで同じ作用を代替させることもできるのでは。 抽象クラスなら部分実装もできるし、インターフェースの存在価値が またよく分からなくなってきます。
お礼
この回答でよく分かりました。ありがとうございます。 確かに多重継承の問題は忘れていました。 また何か不明な点が出てきたら質問させていただきたいと思います。