. net中的MVVM与Cocoa中的MVC有何不同?



我正在阅读MVVM,对于我的生活不能告诉MVVM的'模型-视图'是如何从根本上不同于MVC中的'控制器',在Cocoa编程中使用。

我甚至读过一些对其他人来说应该是"啊哈"时刻的解释,但仍然没有抓住其中的区别。我所做的有限的Cocoa GUI编程涉及到将控制器作为管理数据的中心点,通过使用键值观察从视图到模型进行AND操作。

在所有重要的方面,对我来说,这似乎是"模型-视图"所做的,除了它可能是一个微妙的实现差异,属于。net中的WPF <> c#桥。也就是说,如果Cocoa GUI用不同于应用程序代码的语言指定,并且控制器用与GUI而不是应用程序相同的语言编码(即WPF用XAML而不是c#指定),那么Cocoa中的MVC可能被称为MVVM。

或者可能在非Cocoa环境中的MVC,没有所有的键值观察等,与在Cocoa中应用的MVC大不相同,这导致人们发现MVVM和MVC之间的差异比我更大。

我疯了吗?

多年来我一直是WPF中的MVVM的忠实粉丝,最近又开始使用Cocoa中的MVC。一开始它们看起来一模一样,然后很相似,现在随着我更多地与Cocoa打交道,一切都不一样了。

我的感觉是差异是在绑定的方向上。

在MVVM中,View绑定到ViewModel对象的属性(V -> VM)。更改ViewModel对象的属性,然后使用NotifyPropertyChanged稍微做点小改动,视图就会神奇地更新自己。视图被动地读取视图模型对象中的属性,而ViewModel对视图一无所知——你可以删除视图,它仍然可以工作。这使您可以灵活地重写、更改或组合视图,并使它们"正常工作",而无需更改视图模型代码行。

在Cocoa (iOS)下的MVC中,视图控制器通过显式的IBAction/IBOutlet属性将自己绑定到视图(VC -> V) -你在视图控制器中有对视图对象的直接引用。你直接告诉视图上的一个控件在你的视图控制器中改变,而ViewController对视图的内部有非常深入的了解。删除视图,ViewController会抛出运行时异常。

对我来说,这是关于绑定的方向。

使用MVC模式的Cocoa,你可以直接通过视图控制器"控制"视图(按理说,对吧?)

在MVVM/WPF中,你让视图控件通过观察ViewModel对象的变化来更新自己——绑定是另一种方式,并且是被动的。

没有MVVM的WPF就像iOS的Cocoa MVC,感觉有点像ASP。净形式。

Cocoa for OSX确实有一个更像mvvm的绑定策略,但这在iOS上是不可用的。

相关内容

最新更新