こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Viewクラスからロジック部分への繋ぎについて

Java SE 6 の SingleFrameApplication を用いたアプリケーションについて質問です。
NetBeans6.5.1 にて、Javaデスクトップアプリケーションを新規作成すると、AppクラスとViewクラスが作成されます。

ここに肉付けしてゆくとき、UI部分をViewに実装し、ロジック部分をおそらく新しくオリジナルで作成するクラス(仮にDocとする)に実装するのだと思います。このとき、ViewとDocの繋ぎは、通常どのような方法を取りますか?

App で Doc のインスタンスを作成し、テンプレートに実装されている getApplication() と同じ方法で getDocument() するような方法でしょうか?

宜しくお願いします。

投稿日時 - 2009-03-26 21:10:19

QNo.4829474

困ってます

質問者が選んだベストアンサー

>ビジネスロジック(MFCで言うDoc?)の部分についてはどうでしょう?

MFCはあまり使ったことがないのでわからないが、要するにウインドウごとにモデル管理するドキュメント・クラスを用意し、それをウインドウ(=ビュー)やイベントトリガーであるリスナークラスとどう結びつけるか、ということだろうか。

どうも、こちらで回答している内容と、そちらで質問する内容が、ずれてる気がするな。お互いに頭で考えているイメージがずれているというか。

感覚的にウインドウを「ただ画面に表示されているだけの部品」ととらえ、画面に表示されるウインドウと背後で動いているビジネスロジック・オブジェクトがそれぞれ分離して存在しているような感覚で見ていないだろうか。うろ覚えだが、MFCとかは、画面に表示されるウインドウなどは、リソースデータとして用意し、それにロジック部分を結び付けていたように記憶している。だからこそ、トリガーとなるものがどう結び付けられるかを考えて設計しなければいけなかった。もし、同様の感覚で考えてるとしたら、その感覚そのものを捨てないといけない。

Javaのウインドウは、単に画面に表示されるパーツではなく、すべての機能を内包する「コンポーネント」だ。要するに、ウインドウの部品は、その中にデータも持っているしイベント処理も持っている。ウインドウのコンポーネントのオブジェクトをぽんと画面に出せば、イベント処理からデータ処理から、およそそのウインドウで必要となるすべての機能はコンポーネントの中にちゃんとそろっている、という感覚。それがオブジェクト指向の基本なわけだから。オブジェクトは、自身に必要なものをすべて自身で備えており、独立して存在でき機能しなければならない。

もちろん、それを単一のクラスとして実装することはない。ウインドウの中に、各種のイベント処理をするイベントリスナーのオブジェクトを組み込み、ドキュメント管理するオブジェクトを組み込む。そうやって多数のオブジェクトを自分自身の中に保持して機能する。いわば「幕の内弁当」のようになっている。が、自身の中に内包しているわけだから、お互いの関連付けも結びつきもへったくれもない。自分の中に保管している変数をただ呼び出すだけ、という感覚だ。


イベントリスナーにしろ、ドキュメントにしろ、Javaにはシステムのクラスライブラリにその基本インターフェイスと、具体的な実装クラスが用意されており、それを直接使ったり、単純継承するだけで使えるようになっている。だから、まずは実際にサンプルなどを見ながらいくつかコードを書いて動かしてみれば、オブジェクトの中にオブジェクトが組み込まれて機能する流れがわかってくると思う。百聞は一書にしかず。

投稿日時 - 2009-03-31 10:07:40

お礼

>画面に表示されるウインドウと背後で動いているビジネスロジック・オ
>ブジェクトがそれぞれ分離して存在しているような感覚で見ていないだ
>ろうか。

おっしゃる通りです。

>Javaのウインドウは、単に画面に表示されるパーツではなく、すべての
>機能を内包する「コンポーネント」だ。

なるほど。とすると、viewクラスにビジネスロジック(仮にdocクラス)を実現するクラスを所有させてしまうわけですね。view->docへはインスタンスに直接アクセスし、doc->viewはobserverパターンのような(たとえば独自のイベント&リスナ)などで更新通知を行うという感じですかね。

>百聞は一書にしかず。

そうですね。ちょっと急ぎ過ぎたようです。
ありがとうございました。

投稿日時 - 2009-03-31 11:01:47

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

>ViewとDocの繋ぎは、通常どのような方法を取りますか?

Javaでは、通常、GUIで操作したときの処理はイベントリスナーが行う。したがって、イベントリスナークラス(アダプタークラス)としてロジックを定義し、それをGUIのイベント発生するコンポーネントにaddする。

このとき、どういう実装スタイルをとるかだが、無名クラスや内部クラスと呼ばれる形で定義するならば、ビュークラス内にあるコンポーネントは直接タッチできるからつなぎなど考える必要もない。独立したクラスとして定義するなら、コンストラクタでビューのインスタンスを渡して保持すればよい。

あるいは、イベントリスナーあるいはアダプターとは別に、ビジネスロジックだけのクラスを用意してつなぎたい、ということだろうか?

投稿日時 - 2009-03-26 23:51:35

補足

ご回答ありがとうございます。

人間が古いものでDoc-ViewのMFC的考え方でしたが、JavaではViewをMVCで言うVとCに分割するのですね?確かにそのほうがリスナーインタフェースを使うのに便利な気がしてきました。ありがとうございます。

ビジネスロジック(MFCで言うDoc?)の部分についてはどうでしょう?
Appクラスでビジネスロジッククラスのインスタンスを作り、ViewとリスナークラスからはApp経由でビジネスロジッククラスのインスタンス参照を求める方法が素直な実装でしょうか?その場合、ビジネスロジッククラスからViewクラスへの更新通知はどのような方法を取るのでしょうか?

たびたびになりますが、よろしくお願いします。

投稿日時 - 2009-03-27 11:30:14

あなたにオススメの質問