- PR -

イベントの伝播

投稿者投稿内容
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-05-16 20:27
引用:

うーん??
UserControlAの選択が変更されたときの通知のタイミングが問題だと思ったんですが
これもそれで解決できるんですか?



子 View がトップレベルの Doc を直接参照するのではなく、親 View が保持する「子 View 用の Doc」を参照する方式を採用する場合、親がイベントで受け取ったトップレベル Doc の変更を、親 View が保持する子 View 用の Doc に反映して、それをイベントで子 View に通知する、てな具合すればよいのではないかと。

そういう話ではなくて、ですか?
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-05-16 20:27
indigo-xさんの説明をどう受け取るかとか
自分の経験してきた事例の違いとかが出ますねぇ。

引用:

問題なのはイベントのコストですが、
まずパフォーマンスはここでは考えるべきでないと思いますし
試してませんが問題になるレベルじゃないと思います。


ええ。気になるほどではないですね。
「イベントを使う方法」と「参照と関数呼び出し」の二つが
ほぼ同等の機能であって、
どっちかを選ばなければならないので
より無駄の無いほうを選んだだけです。

引用:

渋木宏明(ひどり)さんの書き込み (2008-05-16 16:40) より:
これは「ちゃんと Doc/View(あるいは MVC)すればよいパターン」だと思います。



MVCをいちいち実装するのは結構めんどくさいのですよね。
それに、Cを内蔵するVがあるので、
GUIによってはVとCがなかなか分けられない。ListViewとか。

前の投稿で述べたように作るとM/VC(〜Doc/View)になるので
普通はその程度で終わりにしてます。

DBが噛んでない限りはその程度の規模のものしか作りません。
ユーザーがいっぺんに把握できるデータの量というのはそれほど多くないので、
MVCをがっちり組むコストに見合わないことが多いのですよね。

まぁその人のEnvironmentに依る話ですね
私はそういったEnvironmentにいるだけです。

ところで。

引用:

そう言えばWndProcを使っても見たことあります
  WndProcなら制御ぽくなって良いのかもしれませんが。。。。


引用:

昔やった時もそんな感じで作ったのですが、
更新イベントの順番が登録順になるので



ん〜?
この辺を読む限り話が通じてない感じがします。

引用:

それでできるところはそれがいいですね。
View内のクラス間で更新があるのでそれも問題だと思いますが。


引用:

UserControlAの選択が変更されたときの通知のタイミングが問題だと思ったんですが
これもそれで解決できるんですか?



こちらもほぼ同様で。

そんなに「更新」の管理が大変でしょうか?
特殊なインタフェースなのでしょうか?

MVCならタイミングはきちんとCが解決できなければならないわけで。
更新のタイミングもCが管理するべきで。

Changed、Selectedで何かしなければいけないなら、
VがCに指示を仰げばいいだけなので、
そんな複雑にはならないはずですが。

WndProcとかの話もさっぱり見えませんし。

もしかしてぜんぜん違う次元をしてるのかしら。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-05-16 20:35
引用:

引用:

これは「ちゃんと Doc/View(あるいは MVC)すればよいパターン」だと思います。



MVCをいちいち実装するのは結構めんどくさいのですよね。
それに、Cを内蔵するVがあるので、



なので、「お行儀よく MVC で」とは書かず、Doc/View をメインに書いてみました。
がっちりとした MVC を組まなくても、モデルがしっかり分離されていれば、それほど酷いことにはならないです。

引用:

GUIによってはVとCがなかなか分けられない。ListViewとか。



僕の場合は TreeView で悩みますね。
作ってるブツの規模や複雑度なんかによっては、元ネタを TreeNode.Tag に放り込んでオシマイにすることもあります。

ListView の場合はハナから元ネタをコレクション等々で持ってることが多いので、逆に悩みません。
(そもそも元ネタが配列や単純なコレクションで表しやすい、てのもありますが)
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-05-16 21:17
引用:

未記入さんの書き込み (2008-05-16 20:22) より:
UserControlA (View) は Model を知っている。(参照を持っている。)
UserControlA…ツリーでしたっけ? これの選択行が変更されるというのは Model が変更されるということ、つまり、UserControlA が Model.SelectedItem とか何かを変更すればいい。

Model の変更にともなって、SelectionChanged のようなイベントを送出する。それを契機に、それぞれの View が自分の表示を更新したらよい。


なるほど!
それはいいデザインですね。

引用:

渋木宏明(ひどり)さんの書き込み (2008-05-16 20:27) より:
子 View がトップレベルの Doc を直接参照するのではなく、親 View が保持する「子 View 用の Doc」を参照する方式を採用する場合、親がイベントで受け取ったトップレベル Doc の変更を、親 View が保持する子 View 用の Doc に反映して、それをイベントで子 View に通知する、てな具合すればよいのではないかと。

そういう話ではなくて、ですか?


親 View が子 View に通知するっていうところが同じなので
あんまり変わらないと思うんですよね。
未記入さんの発言で気づきましたが Selection も Model のほうにカプセル化すればいいと思いました。 (親 View で子 View 用の Doc を作るより)
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-05-16 22:31
引用:

indigo-xさんの書き込み (2008-05-15 20:02) より:
この時にいくつか組合せがあると思いますが。。。
@UserControlA→(Event)→Form→(Call)→UserControl1,2,3(ポリモフィズムLike)
AUserControlA→(Event)→Form→(Event)→UserControl1,2,3(逆イベントキャッチ)
BUserControlA→Observer→UserControl1,2,3(オブザーバーLike)

と@ABの逆方向

(この他もあるとは思いますが)


難しくて人の回答はちゃんと読んでいませんが、とりあえず自分の書きたいことだけ書いておきます。

まず、簡単のため「逆方向」は考えないとします。

そして、(1), (2), (3) のどれかと言えば、私は(1)を選びます。これは Form をコントローラーとして働かせたいからです。Form が UserControlA からのイベントを受けて、それを解釈して、コントローラーの仕事として、UserControl1,2,3 のメソッドを呼び出します。

Form がコントローラーだけではなく、モデルとしての立場も併せ持つ場合は (2) でも良いと思います。この場合は Form が UserControlA をモデルとして集約している、と考えられます。ただし、こうなると構造が複雑になってきます。

(3) は意味が良く分かりませんでしたが、UserControlA と UserControl1,2,3 の関係が密すぎてまずいような気がします。

つぎに「逆方向」も考えた場合ですが、UserControlA と UserControl1,2,3 の立場が入れ替わったものが、並列して存在するというような作りにするほうが良いと思います。単純に順方向と逆方向のものが独立して重なって存在しているような感じです。このためにも仕組みは (1) にしておくと、単純さが保たれると思います。(2) にするとイベントだらけになって破綻しやすくなりそうに思います。
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-05-17 07:08
沢山の回答ありがとうございます。
  (なかなか文章だけでは伝わりにくくて。。。)

その中でModel/Viewにならない理由の一つに
指摘の以下があります

引用:

渋木宏明(ひどり)さんの書き込み (2008-05-16 20:35) より:

僕の場合は TreeView で悩みますね。
作ってるブツの規模や複雑度なんかによっては、元ネタを TreeNode.Tag に放り込んでオシマイにすることもあります。



この様なタイプも何回か作成していますが、TreeView自体がモデルにならなけば
ならない事も多いいですね。
ノード操作(追加/削除/移動)が出来てかつTree構造自体をシリアル化する場合など。。。。

今作成しているのはノード操作ができてTreeNode.TagにはKeyと更新日時とその他
入れています。でノード操作の場合は即DBを更新しています。

あと、以下も気になりますが。。。
・ModelがViewの更新順を知っていていいのかどうか?
・ModelがViewの更新順を知るべきなのか?
・FormであればViewの更新順は知ってて問題ないと思いますが
(Form=Modelにすれば参照も少なくなる?)
・Eventを使う場合はEventの通知順は誰が決める?誰が参加する順番を決める

[ メッセージ編集済み 編集者: indigo-x 編集日時 2008-05-17 07:30 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-05-17 11:14
引用:

indigo-xさんの書き込み (2008-05-17 07:08) より:
あと、以下も気になりますが。。。



> ・ModelがViewの更新順を知っていていいのかどうか?

よくないと思います。

> ・ModelがViewの更新順を知るべきなのか?

知るべきでないと思います。

> ・FormであればViewの更新順は知ってて問題ないと思いますが
> (Form=Modelにすれば参照も少なくなる?)

Form がコントローラーとして動くのならば、知っててもそれ自体は問題ないと思います。ただ、そもそも View の更新順を気にしないといけないのはなぜなのか、という疑問もあります。

> ・Eventを使う場合はEventの通知順は誰が決める?誰が参加する順番を決める

イベントを使う場合に、順序を気にしないというのは、イベントの使い方が通知以上のことをしているのではないでしょうか。私は、イベントを使うときは、順序を気にしないようにしています。
もっとも、開発の当初から一発ではうまくいかず、開発時(設計時)やデバッグ時に順序を意識したりしますが、リファクタリングの段階で、順序を気にしないですむようにします。イベントの順序に依存したコードが残っているのは、私としてはそれはバグだと考えています。

#以下、追記。

上記の中で、「イベントを使う場合に、順序を気にしないというのは」という箇所は、「イベントを使う場合に、順序を気にしないといけないというのは」でした。

[ メッセージ編集済み 編集者: unibon 編集日時 2008-05-17 11:32 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-05-17 11:24
引用:

この様なタイプも何回か作成していますが、TreeView自体がモデルにならなけば
ならない事も多いいですね。



「ならなければならない」ことはないと思います。
「その方が楽だから」それを選択することがあるだけなんじゃないかと。

引用:

ノード操作(追加/削除/移動)が出来てかつTree構造自体をシリアル化する場合など。。。。



Doc に(も)その機能を実装すればおkです。

TreeView で表示する必要があるということは、Doc(あるいは Doc の主要なメンバ)が階層構造をもったデータであるはずです。

ひょっとして、Doc が「たった1個のクラスインスタンスで構成されなければならない」という思い込みでもあるんでしょうか?

引用:

・ModelがViewの更新順を知っていていいのかどうか?
・ModelがViewの更新順を知るべきなのか?



知らずに済むのがベストだと思います。

引用:

・Eventを使う場合はEventの通知順は誰が決める?誰が参加する順番を決める



どうして順番が重要なのか分かりません。

スキルアップ/キャリアアップ(JOB@IT)