問題タブ [passive-view]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - MVPを使用して、同じモデルオブジェクトにリンクされた別のビューからビューを作成する方法
バックグラウンド
Model-View-Presenterデザインパターンを、アプリケーションの抽象ファクトリパターンおよび「シグナル/スロット」パターンとともに使用して、2つの主要な要件を満たします。
- テスト容易性の強化(非常に軽量なGUI、すべてのアクションを単体テストでシミュレートできます)
- 「ビュー」を他のビューから完全に独立させて、他に何も変更せずに実際のビューの実装を変更できるようにします
そのために、コードは4つのレイヤーに分割されています。
- コア:モデルを保持します
- プレゼンター:ビューインターフェイス(以下を参照)とコア間の相互作用を管理します
- ビューインターフェイス:ビューの信号とスロットを定義しますが、実装は定義しません
- ビュー:ビューの実際の実装
プレゼンターがビューを作成または処理する場合、抽象ファクトリを使用し、ビューインターフェイスについてのみ認識します。
ビューインターフェイス間の信号/スロットバインディングを実行します。実際の実装は関係ありません。「ビュー」レイヤーには、実装を処理する具体的なファクトリがあります。
シグナル/スロットメカニズムは、boost::functionに基づいて構築されたカスタムフレームワークを使用して実装されます。
本当に、私たちが持っているのはそのようなものです:http: //martinfowler.com/eaaDev/PassiveScreen.html
すべてが正常に動作します。
問題
しかし、解決方法がわからない問題があります。
たとえば、非常に単純なドラッグアンドドロップの例を見てみましょう。
2つのContainersView(ContainerView1、ContainerView2)があります。ContainerView1にはItemView1があります。ItemView1をContainerView1からContainerView2にドラッグします。
ContainerView2は、異なるタイプのItemView2を作成する必要がありますが、これはItemView1と同じモデルオブジェクトを「指します」。
したがって、ContainerView2は、ItemView1をパラメーターとしてドロップアクションに対して呼び出されるコールバックを取得します。ContainerPresenterBを呼び出し、ItemViewBを渡します。
この場合、ビューのみを扱っています。MVP-PVでは、ビューはプレゼンターやモデルについて何も知らないはずですよね?
ItemView1がどのモデルオブジェクトを表しているのかわからないまま、ItemView1からItemView2を作成するにはどうすればよいですか?
すべてのビューに「itemId」を追加することを考えました。このIDは、ビューが表すコアオブジェクトのIDです。
したがって、擬似コードでは、ContainerPresenter2は次のようになります。
詳細についてはあまり詳しく説明しません。それはうまくいきます。私がここで抱えている問題は、それらのitemIdがポインタのようなものであるということです。そして、ポインタがぶら下がっている可能性があります。誤ってitemView1を削除すると、coreObject1が削除されると想像してください。itemView2には、無効なcoreObjectを表すcoreObjectIdがあります。
よりエレガントで「防弾」のソリューションはありませんか?
私はObjectiveCやmacOSXプログラミングを行ったことがありませんが、私たちのフレームワークがCocoaフレームワークと非常に似ていることに気づかずにはいられませんでした。彼らはこの種の問題にどのように対処しますか?グーグルでそれについてのより詳細な情報を見つけることができませんでした。誰かがこれに光を当てることができれば。
この質問があまり混乱しないことを願っています...
.net - MVP パターンの .NET でユーザー コントロールのプロパティを公開する方法
私UserControl
は実際には派手な単純なものを実装していTextBox
ます。その機能の 1 つは、書式設定の仕様を設定できることです。この書式設定はコンテンツに自動的に適用されます。たとえば、書式指定を に設定し"000"
、内容が"42"
の場合、 then"042"
が表示されます。
UserControl
MVPパターンに従ってこれを実装しています。実装はこれに似ています: winforms mvp パターンでユーザーコントロールを実装する方法? . また、この質問を確認してください:パッシブビューと表示ロジック
アプローチ #1
の私のTitle
プロパティは次のView
ようになります。
この実装により不要なカップリングが追加されているように感じます。たとえば、Presenter
のFormat
メソッドを変更すると、すべてView
の を調べて call ステートメントを適切に変更する必要があります。
アプローチ #2
の私のTitle
プロパティは次のView
ようになります。
の私のTitle
プロパティは次のPresenter
ようになります。
ここで、インターフェイスと実装にSetTitle
メソッドを追加する必要があります。View
View
したがって、このアプローチでは、この醜いSetTitle
Java のようなメソッドが得られます。
アプローチ #3
呼び出す代わりにSetTitle
、新しいプロパティを作成しRealTitle
てView
設定します。このReal
プレフィックスでは醜いままです。
あなたのアプローチ
もっと良い方法を考えられますか?
使用事例
は次のUserControl
ように使用する必要があります。
このスニペット"042"
はUserControl
.
大きな絵
AアクションとBアクションとは?書式設定されたテキストを UI に表示したい。書式設定コードはPresenter
. View
にはtitleTextBox
、UI にテキストを保持する があります。
design-patterns - コレクションの MVP パッシブ ビューと監視コントローラーの実装の違い
私はMVPパターン全体に頭を悩ませ始めました。単一のオブジェクトでうまくやっているにもかかわらず、コレクションに関しては難しくなり始めています。
では、フォーム内の DataGrid で構成される単純な WinForms アプリケーションを設計しているとしましょう。データ モデルは単純なコレクションであり、そのようなものには多くのプロパティがあり、View は実際にそれらを表示します。
モデル
意見
プレゼンター
では、View のList<People> ListOfPeople
getter に何を実装し、Presenter をどのように呼び出せばよいのUpdateView()
でしょうか?
そして一般的に、MVP Passive ViewとSupervising Controllerをそれぞれ実現するために、どの追加の Presenter メソッドがあれば興味深いでしょうか?
アドバイス、コード スタイルのレビュー、または意見をいただければ幸いです。よろしくお願いします。
model-view-controller - Model-PassiveView-Controller で UI コンポーネントを動的に作成する
GUI アプリケーションでは、ここで説明されているように、パッシブ ビューで MVC を使用しています。
このパターンは、model-view-controller および model-view-presenter のさらに別のバリエーションです。これらと同様に、UI は、表示を処理するビューと、ユーザーのジェスチャーに応答するコントローラーに分割されます。パッシブ ビューの重要な変更点は、ビューが完全にパッシブになり、モデルから自身を更新する必要がなくなったことです。その結果、すべてのビュー ロジックはコントローラー内にあります。その結果、ビューとモデルの間でどちらの方向にも依存関係はありません。
これまでのところ、私の Controller は、初期化時に Passive View 自体によって作成された既存の静的コンポーネントにリスナーとして登録します。ここで、コントローラーは、モデルに応じて可変量の UI コンポーネントを動的に作成する必要があります (具体的には、今、チェックボックスのグリッドについて話している - グリッドの寸法は可変です)。
ここに私の躊躇があります:
- この動的 UI 作成コードをコントローラーに実装する必要がありますか? これにより、ビューがモデルを認識しないようにすることで、コードがより単純になりますが、プレゼンテーションの一部はコントローラーによって決定されます...
- ビューは、オンデマンドで UI コンポーネントを作成するためのモデルに依存しない一般的な方法を提案し、コントローラにそれを使用させ、取得した UI コンポーネントにリスナーを登録させる必要がありますか? ここで、Controller は Model オブジェクトと汎用オブジェクト (具体的には、文字列、整数など) の間で相互に変換する必要があります。
.net - WinForms と UserControls のコレクションを備えた Humble View/MVP
TabControl を使用して UserControl を格納する WinForms (.NET 4) アプリケーションをリファクタリングしています。UserControl は各 TabPage でインスタンス化され、最終結果は各タブのエディターになります。これらは、フォーム全体で編集されているオブジェクトに最終的にフィードされるアイテムのコレクションを編集しています。
クラス構造の例として:
class School
string Name
string Address
Course
それぞれにいくつかの適切なフィールド (Department
、Name
など)がある のコレクション
(実際には学校関連のアプリケーションではありませんが、メタファーは機能します。)
視覚的には、UserControls のセットがCourse
es を管理し、親 Form がSchool
情報を処理します。
現在、Form/School のプレゼンターと UserControl/Course のプレゼンターがあり、それぞれにビューがあります。ただし、学校のプレゼンターは、コースの一部の情報を制御する必要があります。たとえば、あるコースで選択されたオプションは、他のコースのオプションを制限します。モデルはそのSchool
計算を処理していますが、コースのプレゼンターに到達する必要があります。
MVP の議論でこの種の関係の例を見つけることにあまり成功していません。MVP のアプローチを取るのはこれが初めてです。これを処理するための適切なオプションは何ですか? 学校のプレゼンターがコースのプレゼンターのコレクションを持ってセットを表すことは適切ですか? 学校のビューは、コースのビューのコレクションを保持する必要がありますか? (最終的な UserControls は、最終的に何らかの方法でフォームに接続する必要がありますよね?)
私の主な目標は (当然のことながら) テスト容易性と保守容易性を高めることであり、これまでのプロセスの主な情報源は、Michael Feathers の「The Humble Dialog Box」と Jeremy Miller の「Build You Own CAB」シリーズです。
c# - パッシブ ビュー アプローチでのデータ バインディング
「独自の CAB を構築する」というブログ投稿シリーズで述べたように、パッシブ ビュー デザイン パターンを使用している場合、データ バインディングを利用することはできません。私が望んでいるほど明確ではありません。では、スーパーバイズ コントローラー パターンでデータ バインディングが可能なサンプルと、パッシブ ビューでのこのサンプルの類似物を見せていただけますか? .NET 4 WinForms アプリだとしましょう。
前もって感謝します!
c# - モデルは2つのリポジトリに依存します。それらの1つをあざける方法は?
Project
エンティティのセットを含むWord
エンティティがあります。私は実体WordsRepository
に依存します。Project
プロジェクトに含まれる一連の単語に対して機能する必要があります。
それでは、もう少し深く掘り下げましょう。これが私のProjectsModel
です。
モデルの選択したプロジェクトが変更されると、を再作成する必要WordsRepository
がありますが、この方法ではテストできません。
どうすればそれをモックできますか?
winforms - MVP スキームでプレゼンターとビューの間でどのように通信しますか?
私が知っているように、基本的に2つのオプションがあります。
1 つ目は、プレゼンターがサブスクライブする必要があるビュー公開通知イベントです。ユーザーがビューのボタンをクリックすると、ビューは何らかのイベントをトリガーし、何かが変更されたことを通知します。
2 つ目は、オブザーバー パターンを使用して、プレゼンターにコントラクトを干渉させることです。上記で説明したイベントのようなメソッドとのインターフェースにしましょう。プレゼンター/オブザーバーをビューにアタッチする必要があります。
Jeremy Miller が伝説的な"Build your own CAB series" ブログ投稿で述べたように、彼にとっては 2 番目のオプションを使用することをお勧めします。
このトピックについてどう思いますか。プロジェクトでプレゼンターとビューをどのように結び付けますか? すべてのオプションの長所と短所は何ですか?
ここでいくつかの投票を行いましょう。役に立つと思います。前もって感謝します!
ピーター・リッチーの答えに答えるために。
私の問題は、私の経験不足と、誰かの意見に頼って決定を下し、自分にとって正しいと思われる方法を選択する必要があることです.
インターフェイスの欠点は、特定の結合があることです。ビューはインターフェースに結合されており、何かがそのインターフェースを実装する必要があります
しかし一方で、イベントは何らかのコントラクト (インターフェースのようなもの) のような役割を果たしているのではないでしょうか? そのイベントに反応する必要があるため、プレゼンターをビューに結び付けました。
java - JSPとPOJOを使用したパッシブビューデザインパターンの例
パッシブビューのデザインパターンが単純なWebアプリでどのように機能するかを理解しようとしています。
誰かがこれらの要件を使用してこのパターンの簡単な例を提供できますか?
- Viewは、HELLOWORLDを出力するJSPです。
- データは「helloworld」としてデータストアに保持されます。データを取得するための呼び出しはスタブになる可能性があります
- ピース(プレゼンター、ビューなど)のサンプルファイルを提供し、各ファイルがパターンのどのピースを表すかを示します。
- jstl / el(オプション)以外のフレームワーク/DSLは使用しないでください
ありがとう
更新1:これがどのように構造化されるかについての私の理解を追加します。
// プレゼンター; 特定のビューの複数の「レンディション」(表示、索引付け、編集、要約など)を担当します
//ビューで使用されるモデル
//show.jspを表示します
また
私が確信していないことは次のとおりです。
ビューはプレゼンターについて知る必要がないため、プレゼンターがビュー(JSP)にどのように公開されるか。ただし、セマンティクスを混合している可能性があります。HelloWorldShowModel(一種の「ViewModel」として機能しているのは、プレゼンターについて知っておくべきことです)。
HelloViewShowModel抽象化を使用する必要がありますか、それとも
getText()
、要求されたテキストを取得するためにJSP内で呼び出されるプレゼンターのメソッドを使用する必要があります。リソースに複数の「ビュー」がある場合(例:表示、索引、編集、要約など)、複数のプレゼンターを用意する必要がありますか?このロジックはどのように分割する必要がありますか?共有プレゼンターから継承する複数のプレゼンター?各プレゼンターは、1つのViewModelのみを返す責任がありますか?
私はファウラーの記事や他の多くの記事を読みました-問題は(私にとって)それらが.NETアプリのコンテキストで書かれていることであり、すべてのオブジェクトがどのように接続されているのか理解できません。
これが私が「怠惰」で「手渡し」の答えを探しているという懸念を和らげることを願っています:)
gridview - Gridview で行を選択した MVP
私が取り組んでいるプロジェクトに MVP パターン (Web フォームを使用) を実装しようとしていますが、イベントの後に何をすべきか、特にグリッドビューから発生したものに行き詰まっています。現在、view はインターフェイスを実装しているため、プレゼンターはビューでメソッドを呼び出すことができます。
私の gridview には、基本的にいくつかの削減された従業員オブジェクトが含まれており (ただし、これは認識されていません)、それぞれに ID があり、グリッドで非表示にする必要があります。
グリッド行で特定のボタンが押されると、異なるイベントが発生する場合があります (削除、ジョブへの追加など)。プレゼンターは、機能を実行するために従業員 ID にアクセスする必要があります (おそらく、この ID を使用してサービス レイヤー コマンドが起動されます)。ビューをパッシブに保とうとしていますが、この例では不可能だと思います。
私の見方では、これを実行できる方法はごくわずかです。
グリッド行の選択時に、ビューの状態 (グリッド行 ID ではありません) 内の「選択された ID フィールド」にデータを入力し、通知プレゼンター (イベントまたはプレゼンター呼び出し) を起動します。プレゼンターはこのフィールドにアクセスします。[イベントは gridview から ID を推測する必要があります] を選択します。
プレゼンター通知のパラメーター (イベントを使用してプレゼンターに通知する場合はイベント引数) を介して、ID を直接プレゼンターに渡します。[イベントは gridview から ID を推測する必要があります] を選択します。
これがドロップダウン リストの場合は、GetSelectedValue を使用するだけで簡単に作成でき、これにラッパー メソッドを使用できます (ビュー インターフェイス メソッドを実装します)。
お役に立てれば幸いです。
ありがとう。