为什么在WPF MVVM中使用私有方法?

时间:2014-04-09 08:31:10

标签: c# wpf xaml mvvm

我最近接手了一个相对成熟的WPF MVVM项目的开发,该项目没有进行大量的单元测试。所以,一旦我理解了大部分代码的作用,我认为写一些代码是个好主意。

现在,我对MVVM或WPF都没有多少经验,但似乎很明显,鉴于UI和代码之间基于属性的相对有限的绑定,很多逻辑可以被锁定在后面私人方法。这就是我所做的,也是我的前任所做的。

单元测试私有方法有点痛苦(我知道如何使用PrivateObject,但它很笨拙),并阅读有关该主题的讨论,似乎有相当多的人传福音减少使用私人方法以促进测试。

所以这让我思考:锁定私有方法背后的主要原因是使用该对象的其他开发人员不会被近乎无用的方法所淹没,对吧?但是在WPF MVVM中你要调用XAML中的对象,那里的智能感知有限,你需要知道你之前调用的名字。

那么......在这个范例中编码时使用私有方法有什么好的理由吗?或者,鉴于MVVM的一个主要优点是提高了可测试性,将事情公开可能更好吗?

2 个答案:

答案 0 :(得分:1)

MVVM中的视图模型实际上是模型上的一种外观,可以绑定到视图,因此视图没有与模型的直接耦合。它提供了特定于视图的类型和接口,如ObservableCollection,INotifyProperyChanged,ICommand等.XAML不能绑定到我所知道的任何私有类。我倾向于把我认为你所描述的内容作为私人成员,并将它们放在一个物理上不同的类(或类)中,我将其归类为"模型"。 (更新开始)通常,如果这种事情是私有的,那就是业务逻辑。 (如果视图使用它 - ala命令 - 它们需要公开)。(更新结束)可以独立于视图模型进行测试。

我认为您会发现,一旦您这样做,您就不会对视图模型进行多次测试,因为您实际上只是测试ObservableCollection等框架元素,或者是否实现了接口正确。并且为了使VM使用该模型,其成员将需要是公共的并且因此是可测试的。

<强>更新 要明确的是,&#34;逻辑&#34;没有错。在视图模型中 - 只要该逻辑直接支持视图(或其他事情)。例如命令。

答案 1 :(得分:0)

对我而言,私有成员是确保封装的方法。这是足够的理由尽可能使用它们。

关于XAML中的Intellisense - 一旦你走出XAML-Codebehind世界,它就永远不会特别有用。由于View与ViewModel的连接方式,没有编辑器(ReSharper,VS)能够支持它,也许永远不会。想象一下动态加载的子VM​​ - 您可以做的最好就是相信您的属性路径是有效的。因此,无论是公共还是私人XAML都无法应对。这是对私人成员的赞美。

私有对象无论如何都是黑客攻击,但它提供了我所需要的东西,允许我保护我的虚拟机免受不可预测的私人成员使用。