问题标签 [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.

0 投票
1 回答
564 浏览

c++ - 使用 MVP,如何从另一个视图创建一个视图,链接到同一个模型对象

背景

我们在应用程序中使用 Model-View-Presenter 设计模式以及抽象工厂模式和“信号/插槽”模式,以满足两个主要需求

  • 增强可测试性(非常轻量级的 GUI,每个动作都可以在单元测试中模拟)
  • 使“视图”完全独立于其余部分,因此我们可以更改实际的视图实现,而无需更改任何其他内容

为此,我们的代码分为 4 层:

  • 核心:持有模型
  • Presenter:管理视图界面(见下文)和核心之间的交互
  • 视图接口:它们定义视图的信号和槽,但不定义实现
  • 视图:视图的实际实现

当演示者创建或处理视图时,它使用一个抽象工厂并且只知道视图接口。

它在视图接口之间进行信号/槽绑定。它不关心实际的实现。在“视图”层,我们有一个处理实现的具体工厂。

信号/槽机制是使用基于 boost::function 的自定义框架实现的。

真的,我们所拥有的是这样的:http ://martinfowler.com/eaaDev/PassiveScreen.html

一切正常。

问题

但是,有一个问题我不知道如何解决。

让我们以一个非常简单的拖放示例为例。

我有两个 ContainersView(ContainerView1、ContainerView2)。ContainerView1 有一个 ItemView1。我将 ItemView1 从 ContainerView1 拖到 ContainerView2。

ContainerView2 必须创建一个不同类型的 ItemView2,但它“指向”与 ItemView1 相同的模型对象。

因此 ContainerView2 获得了一个回调,该回调调用了以 ItemView1 作为参数的放置操作。它调用 ContainerPresenterB 传递它 ItemViewB

在这种情况下,我们只处理视图。在 MVP-PV 中,视图不应该知道有关演示者或模型的任何信息,对吗?

如何从 ItemView1 创建 ItemView2,不知道 ItemView1 代表哪个模型对象?

我考虑为每个视图添加一个“itemId”,这个 id 是视图所代表的核心对象的 id。

所以在伪代码中,ContainerPresenter2 会做类似的事情

我不会过多介绍细节。那只是工作。我在这里遇到的问题是那些 itemId 就像指针一样。并且指针可以悬空。想象一下,我错误地删除了 itemView1,这也删除了 coreObject1。itemView2 将有一个 coreObjectId,它代表一个无效的 coreObject。

没有更优雅和“防弹”的解决方案吗?

尽管我从未做过 ObjectiveC 或 macOSX 编程,但我还是忍不住注意到我们的框架与 Cocoa 框架非常相似。他们如何处理这类问题?在谷歌上找不到更深入的信息。如果有人可以对此有所了解。

我希望这个问题不会太令人困惑......

0 投票
2 回答
676 浏览

.net - 如何在 .NET 中为 MVP 模式公开用户控件的属性

我正在实现一个UserControl实际上很花哨的简单TextBox. 它的功能之一是您可以设置格式规范,并且此格式会自动应用于其内容。例如,如果您将格式规范设置为"000",内容为"42""042"则将出现。

我正在UserControl按照 MVP 模式实现这一点。实现类似这样:如何在winforms mvp模式中实现usercontrol?. 另外,检查这个问题:被动视图和显示逻辑

方法#1

我的Title财产View如下所示:

我觉得这个实现增加了不必要的耦合。例如,如果我更改Presenter'Format方法,那么我将必须遍历所有Views 并适当地更改 call 语句。

方法#2

我的Title财产View如下所示:

我的Title财产Presenter如下所示:

现在我必须在接口和实现中添加SetTitle方法:ViewView

因此,通过这种方法,我得到了这种丑陋SetTitle的类似 Java 的方法。

方法#3

而不是调用在中SetTitle创建一个新属性并设置它。这个前缀仍然很难看。RealTitleViewReal

你的方法

你能想出更好的方法吗?

用例

UserControl应该这样使用:

此代码段应显示"042"UserControl.

大图

A 和 B 动作是什么?我希望格式化的文本出现在 UI 中。格式代码在Presenter. View有一个将titleTextBox在 UI 中保存文本的。

0 投票
2 回答
3998 浏览

design-patterns - MVP Passive View 和 Supervising Controller 的集合实现差异

我已经开始思考整个MVP模式,尽管我在单个对象方面做得很好,但在集合方面开始变得困难。

因此,假设我们正在构建一个简单的 WinForms 应用程序,该应用程序由 Form 中的 DataGrid 组成,数据模型是一个简单的东西集合,其中这些东西有一堆属性,而 View 将实际显示它们:

模型

看法

主持人

那么我应该在 View 的List<People> ListOfPeoplegetter 上实现什么以及我应该如何调用 Presenter 的UpdateView()呢?

通常,为了分别实现 MVP Passive ViewSupervising Controller ,有哪些额外的 Presenter 方法会很有趣?

任何建议、代码风格审查或意见将不胜感激。提前非常感谢。

0 投票
1 回答
707 浏览

model-view-controller - 在 Model-PassiveView-Controller 中动态创建 UI 组件

在 GUI 应用程序中,我使用的是带有被动视图的 MVC,如此所述。

这种模式是模型-视图-控制器和模型-视图-展示器的另一种变体。与这些一样,UI 分为处理显示的视图和响应用户手势的控制器。被动视图的显着变化是视图完全被动,不再负责从模型中更新自身。因此,所有的视图逻辑都在控制器中。因此,视图和模型之间的任一方向都没有依赖关系。

到目前为止,我的控制器注册为被动视图本身在初始化时创建的现有静态组件的侦听器。现在,控制器需要根据模型动态创建可变数量的 UI 组件具体来说,现在我说的是复选框网格 - 网格的尺寸是可变的)。

这是我犹豫的地方:

  1. 这个动态 UI 创建代码是否应该在 Controller 中实现?这将导致由于保持视图不知道模型而导致的代码不太复杂,但部分演示文稿将由控制器决定......
  2. View 是否应该提出一种通用的、模型独立的方式来按需创建 UI 组件,让 Controller 使用它并将侦听器注册到检索到的 UI 组件?在这里,控制器必须在模型对象和通用对象(具体来说,字符串,整数,...)之间来回转换。
0 投票
1 回答
1060 浏览

.net - 带有 WinForms 和 UserControls 集合的 Humble View/MVP

我正在重构一个 WinForms (.NET 4) 应用程序,该应用程序使用 TabControl 来包含一个 UserControl——UserControl 在每个 TabPage 中实例化,最终结果是每个选项卡中的编辑器。这些正在编辑一组项目,这些项目最终会输入到整个表单正在编辑的对象中。

作为示例类结构:

  • class School
    • string Name
    • string Address
    • s 的集合Course,每个都有几个适当的字段(DepartmentName等)

(它实际上不是与学校相关的应用程序,但比喻有效。)

在视觉上,UserControls 集合管理Coursees,而父 Form 处理School信息。

现在,我有一个 Form/School 的演示者和一个 UserControl/Course 的演示者,每个都有一个视图。然而,学校的演示者需要控制课程的一些信息。例如,为一门课程选择的选项会限制其他课程的选项。该School模型正在处理该计算,但它需要到达课程的演示者。

我在 MVP 讨论中找到这种类型关系的例子并没有取得多大成功,这是我第一次采用 MVP 方法。处理这个问题有什么好的选择?学校的演示者是否适合拥有课程演示者的集合来代表该集合?学校的观点应该持有课程观点的集合吗?(最终的 UserControls 最终必须以某种方式和某处附加到表单,对吗?)

我的主要目标是(毫不奇怪)提高可测试性和可维护性,到目前为止,该过程的主要来源是 Michael Feathers 的“The Humble Dialog Box”和 Jeremy Miller 的“Build You Own CAB”系列。

0 投票
4 回答
737 浏览

c# - 被动视图方法中的数据绑定

正如在“构建自己的 CAB”博客文章系列中提到的那样,当您使用被动视图设计模式时,不可能利用数据绑定。对我来说并没有我想要的那么清楚。那么,你们中的任何人都可以展示在监督控制器模式中可以进行数据绑定的任何示例以及在被动视图中该示例的模拟吗?假设它是 .NET 4 WinForms 应用程序。

提前致谢!

0 投票
3 回答
186 浏览

c# - 模型依赖于两个存储库。如何嘲笑其中之一?

我有一个Project实体,其中包含一组Word实体。我的WordsRepository取决于Project实体。它应该对项目包含的单词集进行操作。

现在让我们深入挖掘一下。这是我的ProjectsModel

当模型的选定项目发生更改时,它应该重新创建WordsRepository,但不能以这种方式进行测试。

我怎么能嘲笑它?

0 投票
1 回答
1095 浏览

winforms - 在 MVP 方案中,presenter 和 view 之间如何通信?

据我所知,基本上有两种选择。

第一个是查看展示者应该订阅的通知事件。当用户单击视图上的某个按钮时,视图只会触发一些事件,通知某些内容发生了变化。

第二种只是使用观察者模式,让演示者干预一些合同。让它成为一个接口,其中包含我上面告诉你的事件之类的方法。应将演示者观察者附加到视图。

正如 Jeremy Miller 在其传奇的“构建自己的 CAB 系列”博文中所说,他最好使用第二个选项。

你对这个话题有什么看法?您如何在项目中绑定演示者和视图?每个选项的优点或缺点是什么?

让我们在这里进行一些民意调查。我认为这会很有用。提前致谢!


为了回应彼得里奇的回答。

我的问题是我缺乏经验,我应该依靠别人的意见来做出决定并选择一种对我来说似乎正确的方式。

接口的缺点是你有特定的耦合。视图与接口耦合,并且必须实现该接口

但另一方面,事件服务不是像某种契约(像接口一样)吗?它将演示者绑定到视图,因为它应该对这些事件做出反应。

0 投票
2 回答
1057 浏览

java - 使用 JSP 和 POJO 的被动视图设计模式示例

我试图了解被动视图设计模式如何适用于简单的 Web 应用程序。

有人可以使用以下要求提供此模式的简单示例:

  1. View 是一个打印 HELLO WORLD 的 JSP!
  2. 数据以“hello world”的形式保存在数据存储中,检索数据的调用可以是存根
  3. 为片段(演示者、视图等)提供示例文件,并指出每个文件代表的模式片段。
  4. 除了 jstl/el(可选)之外,不应使用任何框架/DSL

谢谢

更新1:增加我对如何构建的理解。

// 主持人; 负责特定视图的多个“再现”(显示、索引、编辑、摘要等)

// 视图使用的模型

// 查看 show.jsp

或者

我不确定的事情是:

  1. 由于 View 不应该知道 Presenter,Presenter 将如何暴露给 View (JSP)。不过,我可能正在混合语义,而 HelloWorldShowModel(充当某种“ViewModel”,是关于 Presenter 的不应该知道的)。

    1. 我什至应该有 HelloViewShowModel 抽象,还是应该getText()在我的 Presenter 上有一个方法,在 JSP 中调用它来获取请求的文本。

    2. 如果我对一个资源有多个“视图”(例如 Show、Index、Edit、Summary 等),我应该有多个 Presenter 吗?应该如何打破这个逻辑?从共享演示者继承的多个演示者?每个 Presenter 应该只负责返回一个 ViewModel 吗?

我已经阅读了 Fowlers 的文章以及其他一些文章——问题(对我来说)是它们是在 .NET 应用程序的上下文中编写的,我不明白它们的所有对象是如何连接起来的。

我希望这会减轻我对“懒惰”并寻找“分发”答案的担忧:)

0 投票
1 回答
412 浏览

gridview - 具有 Gridview 选定行的 MVP

我正在尝试为我正在处理的项目实施 MVP 模式(使用 webforms),但是我陷入了事件之后该怎么做的困境,特别是源自 gridview 的事件。目前,视图实现了一个接口,以便演示者可以调用视图上的方法。

我的gridview 包含了本质上是一些缩减的员工对象(尽管它不知道这一点),每个对象都有一个我已经必须隐藏在网格中的ID。

当在网格行上按下某些按钮时,可能会发生不同的事件(例如,删除、添加到作业等)。演示者需要访问员工 ID 才能执行功能(这可能会触发具有所述 ID 的服务层命令)。我试图让视图保持被动,但我认为在这个例子中这是不可能的。

在我看来,只有少数几种方法可以做到这一点。

  1. 在gridrow select上,在View的状态(不是gridrow id)中填充一个“选定的ID字段”,并触发通知演示者(事件或演示者调用)。演示者随后将访问此字段。选择事件需要从 gridview 推断 ID。

  2. 将 Id 直接传递给演示者,通过演示者通知上的参数(或事件参数,如果使用事件通知演示者)。选择事件需要从 gridview 推断 ID。

如果这是一个下拉列表,那将很容易,因为您可以只使用 GetSelectedValue,并在此周围有一个包装器方法(实现视图接口方法)。

希望你能帮忙。

谢谢。