【问题标题】:Are the advantages of Model-View-ViewModel (MVVM) pattern worth the overhead?Model-View-ViewModel (MVVM) 模式的优势值得付出代价吗?
【发布时间】:2011-08-03 12:15:00
【问题描述】:

主题中提出了问题:模型-视图-视图模型 (MVVM) 模式的优势是否值得开销?

在许多情况下,实现视图模型涉及复制模型属性的相当大的开销,有时还涉及模型和视图模型数据成员之间的同步。例如,目前在 Silverlight 4 和 WCF RIA 中,不生成视图模型(如果开发人员遵循 MVVM 模式,则由他来创建视图模型,通常在 ViewModel 中复制相应模型的属性,这没什么意义,但将模型称为存储)。

为什么不扩展 Model 类,提供额外的属性使其易于被 View 使用呢?

【问题讨论】:

    标签: silverlight mvvm


    【解决方案1】:

    为什么不扩展 Model 类,提供额外的属性以使其易于被 View 使用?

    实际上这就是PresentationModel 的用途。 MVVM 强烈基于哪个。不同之处在于 ViewModel 是视图的模型,而不是数据的模型。因此,您更关心视图如何处理数据。

    如果您有一个简单的 UI,它所做的只是呈现模型,那么我建议在 ViewModel 的属性上公开模型并绑定到该属性。确保模型确实实现了INotifyPropertyChanged 等。

    ViewModel 的强大之处在于您可以响应用户操作。然后 ViewModel 可以支持命令,调用服务和验证,从而将模型作为数据容器

    【讨论】:

    • 除了原始数据之外,为什么不简单地扩展模型以包含为视图定制的计算属性?
    • 我同意@Reed Copsey 对同一问题的评论。然后实际上你有一个 ViewModel,当你将它进一步向下传递到域/服务层时,它会在那里包含域不会理解或关心的东西,并且会混淆其他开发人员
    【解决方案2】:

    为什么不扩展 Model 类,提供额外的属性以使其易于被 View 使用?

    在简单的情况下,这就是 ViewModel 正在做的所有事情 - 包装 Model 以便它以 View 可以使用的方式扩展。如果您的模型可以直接绑定,欢迎您这样做。

    话虽如此,ViewModel 层不仅仅是包装模型 - 这也是应用程序特定逻辑的地方 - 即:应用程序的管道,将发生。必须正确地从模型类发出请求并将逻辑组合在一起。

    【讨论】:

    • 为什么不简单地扩展模型以包含原始数据之外的应用程序逻辑?
    • @Dmitry:此时您正在混合关注点 - (en.wikipedia.org/wiki/Single_responsibility_principle) - 此外,这会将您的模型与您的特定应用程序和使用联系起来。尤其是数据部分,可以在特定应用程序之外拥有生命。
    • 我的模型在这个单一的应用程序之外没有任何意义。我也可以理解关注点的分离,但在这种情况下,它的代价——拥有两个同步的数据类层次结构——不是太高了吗?
    • @Dmitry:这完全取决于您的应用程序的复杂性。我什至无法计算我开始使用您描述的方法的次数(直接绑定到模型类,有时使用少量简单属性扩展它们),只是发现我后来不得不将它分解为视图模型无论如何,因为随着复杂性的增加它变得太丑陋了。所以现在我经常硬着头皮使用视图模型。我发现在一天结束时,它得到了回报。
    【解决方案3】:

    如果您担心额外的工作,您始终可以创建一个 ViewModelBase(INotifyPropertyChanged,错误/验证,通用的东西)以由您的 ViewModel 继承,它可以最大限度地减少您认为可能需要花费时间来复制的事情。此外,Silverlight/Wpf 为我们提供了绑定,这大大减少了我们的编码,此外 XAML 还通过标记提供功能来做到这一点。除此之外,您还可以通过使用屏幕、控制器等来进一步设计。

    对我来说,我没有看到任何关于使用 MVVM 的“开销”;如果有,那就值得了。它正确地处理了关注点的分离。它为开发提供了一个很好的平台,尤其是在团队中,人们可以在不影响其他团队成员代码的情况下处理应用程序的不同方面(尤其是在开发人员和设计人员之间)。

    希望对你有帮助

    【讨论】:

      【解决方案4】:

      MVVM 的好处

      1. 降低复杂性。
      2. 设计和开发的隔离。
      3. 依赖注入。
      4. 主要优势是当您拥有一个结构良好的 MVVM 结构的 Windows Phone 应用程序并希望为 Windows Metro Desktop 开发相同的应用程序时,您只需专注于设计,因为可以使用相同的视图模型。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2010-12-02
        • 2011-01-17
        • 2012-02-10
        • 1970-01-01
        • 2019-05-29
        • 2012-03-19
        • 1970-01-01
        • 2011-01-06
        • 2011-04-15
        相关资源
        最近更新 更多