4

我对 WPF 很陌生,今天早上我与来自 C、C++ 背景的架构师进行了讨论。

我们正在尝试创建一个依赖本机 dll 的视频通话应用程序PInvoke。WPF 应用程序主要是 UI,在后面的代码中,我们正在Pinvoke调用视频/音频并列出可用的驱动程序。

因此,如果我们谈论来自数据库的数据,那么我们的应用程序中涉及的“数据”并不多。

我们正在尝试修改的 WPF 应用程序是Boghe,令人惊讶的是他们也没有使用 MVVM。

虽然我热衷于实现 MVVM,但架构师指出它不必要地将文件分成 3 个部分

他说,如果我们想要更改视图中的任何内容,例如更改按钮或任何控件,则可以直接在后面的代码中完成。那么为什么要使用 MVVM 呢?

虽然我有理论上的答案,但不禁同意他的观点。他真的是对的吗?

4

5 回答 5

6

他说,如果我们想要更改视图中的任何内容,例如更改按钮或任何控件,则可以直接在后面的代码中完成。那么为什么要使用 MVVM 呢?

当然也可以采用这种方式。问题是是否应该这样做。

对于一个相当小的代码库,您可能可以在后面的代码中混合数据访问、核心逻辑和 UI 操作。然而,从长远来看,这不会产生可维护或可测试的代码,而且随着时间的推移,混乱可能会变得更糟并变成意大利面条式代码。相信我的话,因为我工作中的很大一部分时间都花在了扭转这些陈旧的烂摊子上。

在代码隐藏中混合所有内容的一些后果是:

  • 从根本上违反“单一职责原则”(SRP)的代码。
  • 很难理解的代码,因为它在同一个地方做了非常不同的事情。
  • 容易破坏的代码。我在这里改变了一些东西,出于某种神秘的原因,那里的一些功能中断了。
  • 代码重复/违反“不要重复自己”(DRY)原则。您经常在多个地方发现相同的逻辑。这是偶然的,还是故意的?如果我在这里更改逻辑,是否也必须更改相同/相似的逻辑?

请注意,除了第一点之外,这些都不是理论上的问题,而是典型的“遗留”代码库的非常现实、直接的问题。

在我看来,说 MVVM 引入了更多的代码隐藏类并不完全正确。这显然是一个不理解当您将数据、业务逻辑和 UI逻辑层彼此隔离时所带来的基本关注点分离的人的声明:即使使用 MVVM,您的视图也只有一个代码隐藏类。其他两个类(是的,可能还有两个)根本不能被认为是“代码隐藏”,因为它们没有直接与视图/设计器相关联。

于 2012-07-12T06:15:12.647 回答
2

简短的回答:不!ViewModel 与不同文件中的 Codebehind 不同。

通过适当的 MVVM 实现,您没有代码隐藏,或者至少没有一个非常小的代码隐藏。

但是在 ViewModel 中,您不能直接访问窗口,因为在 MVVM 中,ViewModel 和 View 之间的通信是通过 Binding 完成的,没有直接引用 View(通常)。

与以视图为中心的方法相比,MVVM 带来了一些巨大的优势。它是可测试的,它更容易改变,它是一个适配器,......

编辑 如果他真的是你的软件架构师,他应该知道得更好……至少那是我对软件架构师的期望

于 2012-07-12T06:17:02.927 回答
2

我也同意stakxMare Infinitus ;MVVM 提供了很多好处,而不仅仅是在文件后面创建多个代码。

根据我的经验,MVVM 是学习和使用 WPF 强大功能的最佳方式,它鼓励并强迫您使用 WPF 功能,如、 、BindingCommands。我已经看到在没有 MVVM 的情况下开发应用程序,结果证明它们是 WPF 应用程序在 Winforms 风格中提到了 stakx 的问题(以及更多)。StylesConverters

除了 UnitTesting(我认为在您的应用程序中非常重要)、可重用性等。使用 MVVM 的一个非常重要的好处是它可以支持多个视图,即您可以为您的应用程序拥有多个 UI,所有这些都可以使用相同的视图模型;这可能不是您今天的要求,但您可能需要几年后有一个新界面或支持其他平台,如 Silverlight 或 Metro,在这种情况下,MVVM 将为您节省大量精力。

我建议您阅读这篇解释 MVVM 的真正好处并解释其他所谓好处的帖子(尽管我觉得它们在实践中是真正的好处) - MVVM Backlash

于 2012-07-12T07:36:06.043 回答
1

一个目的是您可以在没有视图的情况下对视图逻辑(视图模型)进行单元测试。

这里是 Rachel 关于 viewmodel 第一种方法的一个很好的评论:

请记住,使用 MVVM,您的 ViewModel 就是您的应用程序。View 只是一个漂亮的界面,它允许用户与您的 ViewModel 进行交互。

于 2012-07-12T06:05:28.573 回答
0

如果你在项目中只有两个人,而且每个人都是一体的,他是对的。

但是,如果您不希望设计师弄乱控制器(或 ViewModel),或者不希望程序员将视图更改为某些东西,您知道,就像程序员进行设计一样。

此外,您无需搜索庞大的文本文件即可立即知道在哪里进行更改。

此外,MVVM 或 MVC 的分离是编程的基本原则之一,它是 Data-Logic-View 分离,如果架构师说你不这样做,可能是时候问另一个架构师了 :)

于 2012-07-12T05:58:48.497 回答