質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

Q&A

解決済

2回答

7692閲覧

MVPパターンでダイアログをPresenterで記述してはいけないのはなぜですか?

shiroma77

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

アーキテクチャ

アーキテクチャとは、情報システム(ハードウェア、OS、アプリケーション、ネットワーク等)の設計方法、設計思想、設計思想に基づいて構築されたシステム構造をアーキテクチャと呼びます

0グッド

0クリップ

投稿2017/04/19 04:38

WinFormsでMVPパターンを適用しようと考えていますがダイアログの記述箇所がわかりません。

Model-View-Presenterパターンにおいて、
ダイアログはViewに記述すると StackOverFlow に記載されていますが、
なぜPresenterやModelでダイアログを表示してはいけないのでしょうか。

例えば

c#

1public class Form1 : Form 2{ 3 public void ShowAlert(string message) 4 { 5 MessageBox.Show(message); 6 } 7} 8 9public class Presenter 10{ 11 Form1 _form1; 12 13 public void ButtonClick() 14 { 15 _form1.ShowAlert("Hello!"); 16 } 17}

が一般的なダイアログの表示方法と考えていますが、

c#

1public class DialogView 2{ 3 public void ShowAlert(string message) 4 { 5 MessageBox.Show(message); 6 } 7} 8 9public class Presenter 10{ 11 DialogView _dialogView; 12 13 public void ButtonClick() 14 { 15 _dialogView.ShowAlert("Hello!"); 16 } 17}

のような方法を取るとPresenter側でDialogを表示するのも可能と考えています。またModel側でも

c#

1public class Model 2{ 3 Presenter _presenter; 4 5 public void DoSomething() 6 { 7 _presenter.ShowAlert(); 8 } 9} 10 11public class Presenter 12{ 13 DialogView _dialogView; 14 15 public void ShowAlert() 16 { 17 _dialogView.ShowAlert("Hello!"); 18 } 19} 20 21public class DialogView 22{ 23 // 以下同じ... 24}

のような方法でダイアログを表示可能と考えています。

このようにPresenter側でも、Model側でもダイアログの表示は可能と考えていますが、なぜView側でダイアログを表示するメソッドを用意する必要があるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

MVCでもMVVMでもそうですが、やりたいことは、責務の分離なので、
表示するというViewで行う責務を、他のところでやるのはよくないということです。

まぁ、動くし、後々苦しむのは、その後メンテする人なので、ご自由に。

投稿2017/04/19 05:01

kiichi54321

総合スコア1984

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroma77

2017/04/19 05:17

回答ありがとうございます。よく理解できました。 MVPを適用するにあたって、厳密に適用しなくても動作できるのが不思議でしたが、 厳密に適用しなくても動作はするがそのぶん後で苦しむ事になるって事ですね。 それだと個人の理解度によってViewをどの範囲まで含めるかが分かれてくる気がします。(それは理解していないとも言えそうですけど その理解を深めるためにMVPにおけるアンチパターンをよく知っておく必要がありそうですね。 ありがとうございました!
guest

0

動きますがそういうルールではありません。

機械の操作パネルを前面に付けるのを
操作パネル自体が機械の後ろからアームを伸ばして前に持ってきている状態にしているのです。

これが、目で見ることができる状態なら簡単なのですが、
カバーがあったら、アームを使ってるかわかりませんよね?

つまり、次メンテナンスする人がいちいちカバーをはずして、
どこからアームを出ているのか探さないといけなくなります。

ルールに従わないとメンテナビリティの低下につながり、
思わぬ時間とコストの浪費が発生する可能性があると言うことです。

投稿2017/04/19 05:20

lazhuward

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shiroma77

2017/04/19 06:14

すみません。追加で質問です。 Model側でダイアログを表示する場合は、操作パネルにアームをつけているイメージがつくのですが、 Presenter側でDialogViewを呼ぶ場合は、操作パネルにアームをつけているイメージが湧かず、わかりづらいです。 仮に、PresenterでViewを2つ持つとしたら、 Presenter(アーム)が2つのView(操作パネル)に繋がってしまっているということでしょうか? そうなると、片方のViewのみを修正したいのに、もう片方のViewも見なければならなくなりメンテナビリティが低下してしまうという事ですか?
lazhuward

2017/04/19 07:13 編集

そういうことになりますね。 そのメソッドがどこで使われているのかを、全部総なめして修正していいのかを判断することになります。 MVPモデルはプレゼンターが凄く頑張るモデルで、べらぼうにでっかくなるので Viewで使う表示側のメソッドは、View側で実装してあげることで判りやすくしているのです。 ダイアログ関係で言うと他のモデルでも画面で出すものは画面で実装します。 この場合、同じものを書くことになるので共通クラス化させますね。 特に.NET開発は、プログラマが内部で起こっているエラーを握り潰す(エラーを無かったことにする)実装をしてしまうことが多いので、特にエラー表示には慎重に実装しなければなりません。
shiroma77

2017/04/19 07:27

わかりました。詳細な解答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問