WPF架构设计MVVM

MVVM的目的是什么?

简单总结起来一句话:分离UI逻辑和业务逻辑。这一点和被大家熟知的MVP和MVC是一致的。

总结起来MVVM的好处有:

   

1、分离业务逻辑(business logic)和表现层逻辑(presentation logic)

2、Support testability 易于测试,正如martin flower 在xunit partten中提到的,对于程序unit test的建设要在设计之初便有所考虑。(对于这点是容易被很多人忽略的,因为多数coder甚至都不清楚什么叫Unit Test)而这一点事实上也是MVVM带来的很重要的好处。

3、从笔者的经历来看,mvvm的另一个意义在于,提高团队协作的效率。

   

为什么这么说呢?类比《设计模式》一书,设计模式这本书的重要作用在于,给程序员之间一个很好的名字契约,因此沟通时,只需要说我用了XX模式,那么对方很直观便明白了具体的实现。一个标准的架构的意义也在于此,比如团队使用MVVM来架构,那么只需要团队中的成员对MVVM有所了解,对各层的职责明确清楚,那么接下来继续要开展的工作就容易很多。这和招聘iOS研发要需要理解MVC是一个道理,大家都了解的统一的程序架构,是协作的很重要的前提。

   

看过了MVVM 的作用,我们接下来要做的便是明确各层的职责。单纯的把类名起名叫ViewModel却不做VM该做的事情,那还是建议压根就不要起名为VM来混淆试听了。(不能说拿来一个橙子告诉别人我这是橘子,而别人质疑的时候,辩解到这是改良的橘子)(虽然MVVM和MVX系列很相似,但他也是单独命名出来的,而不是叫做变种的MVP)

(因此建议不要再同其他人交流的过程中说,我用了MVVM架构,但说出来却完全不是那么回事儿,干脆说叫MVVMNB算了也免得产生误会)

   

【MVVM各层的职责界定】

   

为了权威仍然引用msdn中对于mvvm的各层的职责界定:




很清楚的可以看出View的职责:

定义用户在屏幕中所看到的各个UI元素。

需要说明的是:

1、一般情况下在view的code behind里面应只包含构造函数,构造函数中执行InitilizeComponent方法。例外的场景是,在xaml中不容易实现的复杂的ui逻辑等。

2、不应将任何需要进行单元测试的逻辑放到view层中

3、在MVVM中View的DataContext是在ViewModel中。通常情况下View和ViewModel是一对一的关系

   

对于View层的理解比较简单

需要注意的:


1、对于VM的职责,有一点非常容易理解错误,就是VM和Business logic的关系。


View Model 从名字来看就可以看出它是View的Model,因此它需要为View提供数据,以及操作接口,View Model中不应该包含Business Logic


2、VIewModel与View的关系如上面的图中所描述,ViewModel是不该知道View的,即ViewModel不该持有View的实例(It has no direct reference to the view or any knowledge about the view's specific implementation or type.)


3、ViewModel是可以脱离View和Model进行Unit Test的(the view model is testable independently of the view and the model.)


   


4、View通过Binding的方式将ViewModel中定义的数据以及行为(command)关联到一起


ViewModel

需要注意的:

1、对于VM的职责,有一点非常容易理解错误,就是VM和Business logic的关系。

View Model 从名字来看就可以看出它是View的Model,因此它需要为View提供数据,以及操作接口,View Model中不应该包含Business Logic

2、VIewModel与View的关系如上面的图中所描述,ViewModel是不该知道View的,即ViewModel不该持有View的实例(It has no direct reference to the view or any knowledge about the view's specific implementation or type.)

3、ViewModel是可以脱离View和Model进行Unit Test的(the view model is testable independently of the view and the model.)

   

4、View通过Binding的方式将ViewModel中定义的数据以及行为(command)关联到一起


Model

需要说明的有:

1、Model层定义Business logic 和Data。

2、Model层不依赖于View和ViewModel层

 

   

总结

对于MVVM的职责划分正如上面所阐述的,很清晰,如此划分,我们可以很好的根据职责来组织代码的结构,增加程序的可维护性

   

综上,笔者的结论是,MVVM是配合WPF系列技术中Binding等强大特性而出现的一种程序的架构方式,清晰而简单,值得推荐使用。

   

参考:

http://en.wikipedia.org/wiki/MVVM

http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

http://stackoverflow.com/questions/1644453/why-mvvm-and-what-are-its-core-benefits

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值