Javaのサーバーサイドの技術についてお聞きします。

(1)サーブレットでは、インターフェースをオブジェクトそのもののように扱っているように思えるのですが、どういう仕組みで動いているのでしょうか?「内部的に実装されている」ということらしいのですが、まだうまく理解できません。
(2)ウェブアプリケーションをつくる設計思想(?)としてMVCというものがあることがわかりました。それでは他にどんなものがあるのでしょうか。それらのメリットデメリットなどもあわせて教えてください。

回答の条件
  • 1人2回まで
  • 登録:2007/02/10 18:03:56
  • 終了:2007/02/11 10:16:30

ベストアンサー

id:flashrod No.3

flashrod回答回数31ベストアンサー獲得回数32007/02/10 22:09:42

ポイント80pt

(1)オブジェクト指向なプログラミングではインターフェース(仕様)に対してインプリメンテーション(実装)をするものなんです。これは仕様と実装を分離するものなんです。ある仕様が一つ決まっても、実装は複数ありえるわけです。オブジェクトを扱うときはそのオブジェクトを実装したクラス(型)を生で使うのではなく、インターフェースを通じて使います。そうするとインタフェース経由でオブジェクトを使う限り、複数ある実装の違いを意識せずに使うことができます。

インターフェース経由で普通のオブジェクトのように扱えるのが気持ち悪いといわれると困るのですが、そうできるようにするためのものなので気持ちよくなっていただくのが一番です。

サーブレットに限った話ではなく、サーブレットでは良く見かけるだけです。サーブレットコンテナは、J2EEの仕様で決まっているわけですが、J2EEの仕様を満たしていれば、どんなコンテナを作ってもいいわけです。それで各社が様々なサーブレットコンテナの製品を世の中に出すことができます。

(2)プログラムというのは何らかの問題解決をするものです。大きな問題を解決するときは、小さな問題に分割して解決します。MVCはその分割する考え方の一つです。表示する部分(V)と、いろんな表示形式に関係ないモデルの部分(M)と、モデルに変更があったときビューに反映したりビューにインタラクションしたときモデルに反映するなどの部分(C)に分けて考えましょう、というものです。役割り分担をしているわけです。

この「分けて考える」というのはあらゆるプログラミングの基本です。他には上に掲げたように「仕様と実装に分ける」というのもあります。「抽象と具象に分ける」「全体と部分に分ける」「中心的関心事と横断的関心事に分ける」「データ構造とアルゴリズムに分ける」など、いろいろあります。どれも、大きな問題を一発で解決するのは難しくても、小さい問題に分けたら簡単、というものです。

具体的なパターン名はデザインパターン本でも読んでください。

id:javabenkyo

返信が前後しました。(1)、ありがとうございます。

(2)こちらもありがとうございます。「分けて考える」というプログラムの基本的な考え方ですか、納得しました。最後、急にぶっきらぼうになった気がしますが、「デザインパターン」なる分野の本を読めばわかるということですね。

2007/02/10 22:51:31

その他の回答(2件)

id:interview No.1

interview回答回数29ベストアンサー獲得回数02007/02/10 20:45:24

ポイント5pt

下記のサイトをご参考いただければと思います。

http://www.javaroad.jp/servletjsp/index.html#servlet

id:javabenkyo

私の質問があいまいだったせいかと思いますが、ご紹介いただいたサイトを見てもちょっとわかりませんでした。下に書きましたコメントを見ていただきまして再度回答願えればありがたいです。

2007/02/10 21:32:07
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/02/10 21:47:43

ポイント60pt

(1)単純にインターフェイスと言うものの利点を理解されていないように思えます。

それぞれは普通のクラスのオブジェクトですよ。


Servlet コンテナとしてよく使われる Tomcat の場合、doGet(),doPost() メソッドの引数に渡されるオブジェクトは実際には以下のクラスのインスタンスになります。

Request (Tomcat API Documentation)

Response (Tomcat API Documentation)

当然どのようなオブジェクトが渡されるかはアプリケーションサーバーごとに違います。

メソッドのシグネチャがクラスであるとアプリケーションサーバーを変更するたびに再コンパイルが必要になってしまいます。

これを防ぐ為、必要なメソッドを定義したインターフェイスを用います。


(2)Web アプリケーションでは MVC 以外のパターンはほとんど見受けられません。

id:javabenkyo

(1):かなりわかった気がしました。つまり、まず各コンテナがHttpServletRequestインターフェースを実装したクラスを用意すると。それでサーブレットクラスのメソッドの引数にインターフェースを書いておき、実際はインターフェースを実装したクラスが渡されていると。インターフェースはそれを実装したクラスのオブジェクトを代入することができるので問題なく使用できる。引数にインターフェースを使用することでコンテナごとにプログラムを書き換える必要がなくなると。こういうふうに理解しました。ありがとうございます。

(2):他の方の意見も一応お聞きしたく思います。

2007/02/10 22:17:36
id:flashrod No.3

flashrod回答回数31ベストアンサー獲得回数32007/02/10 22:09:42ここでベストアンサー

ポイント80pt

(1)オブジェクト指向なプログラミングではインターフェース(仕様)に対してインプリメンテーション(実装)をするものなんです。これは仕様と実装を分離するものなんです。ある仕様が一つ決まっても、実装は複数ありえるわけです。オブジェクトを扱うときはそのオブジェクトを実装したクラス(型)を生で使うのではなく、インターフェースを通じて使います。そうするとインタフェース経由でオブジェクトを使う限り、複数ある実装の違いを意識せずに使うことができます。

インターフェース経由で普通のオブジェクトのように扱えるのが気持ち悪いといわれると困るのですが、そうできるようにするためのものなので気持ちよくなっていただくのが一番です。

サーブレットに限った話ではなく、サーブレットでは良く見かけるだけです。サーブレットコンテナは、J2EEの仕様で決まっているわけですが、J2EEの仕様を満たしていれば、どんなコンテナを作ってもいいわけです。それで各社が様々なサーブレットコンテナの製品を世の中に出すことができます。

(2)プログラムというのは何らかの問題解決をするものです。大きな問題を解決するときは、小さな問題に分割して解決します。MVCはその分割する考え方の一つです。表示する部分(V)と、いろんな表示形式に関係ないモデルの部分(M)と、モデルに変更があったときビューに反映したりビューにインタラクションしたときモデルに反映するなどの部分(C)に分けて考えましょう、というものです。役割り分担をしているわけです。

この「分けて考える」というのはあらゆるプログラミングの基本です。他には上に掲げたように「仕様と実装に分ける」というのもあります。「抽象と具象に分ける」「全体と部分に分ける」「中心的関心事と横断的関心事に分ける」「データ構造とアルゴリズムに分ける」など、いろいろあります。どれも、大きな問題を一発で解決するのは難しくても、小さい問題に分けたら簡単、というものです。

具体的なパターン名はデザインパターン本でも読んでください。

id:javabenkyo

返信が前後しました。(1)、ありがとうございます。

(2)こちらもありがとうございます。「分けて考える」というプログラムの基本的な考え方ですか、納得しました。最後、急にぶっきらぼうになった気がしますが、「デザインパターン」なる分野の本を読めばわかるということですね。

2007/02/10 22:51:31
  • id:b-wind
    > インターフェースをオブジェクトそのもののように扱っているように思える
    具体的にどの部分に関してそう感じていますか?
    全体的に漠然としすぎてどのように答えてよいか分かりかねています。
  • id:javabenkyo
    javabenkyo 2007/02/10 21:29:42
    >b-windさん
    サーブレットクラスのdoGet()やdoPost()メソッドの引数として
    (HttpServletRequest req,HttpServletResponse res)
    と書く、と紹介されていることが多いかと思います。
    このHttpServletRequestはインターフェースのはずですが、
    「req」などと、普通のクラスのように扱われています。
    ここがすごく気持ち悪いのです。
    表現が拙いですが、伝わりましたでしょうか?

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません