MMVC

一、MMVC总结

    首先,温习下MVC的含义。

 


MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,

一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设

前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个

性化定制而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和

输出功能在一个逻辑的图形化用户界面的结构中。

 


MMVC即是在MVC中间,加入了一层ViewModel。起到适配(一些Model建模为了与其他系统实现完全隔离,存储的只是id,此处需要根据id去组装起所需的数据)、隔离、扩展的功能。

二、MMVC实践

Model        

清晰的、自然、符合逻辑、简洁。一些界面操作也需要建模的。        

           


完全隔离的Model,只会被引用不会被引用外部的东西。所以一些外部建模的东西,常常只会存其id,在使用时,进行组装。内部建模时,只对需要使用的字段进行建模,其余不需要的无需加入。            

               


 

View        

承担各种界面事件交互逻辑,其核心关键词是:数据展示、操作。其中除了特定的操作、交互功能外,最为重要的三个功能点,即是初始化、刷新、返回值、事件。        

           


 初始化

 界面初始化,分为控件初始化以及传入参数绑定。、

控件初始化时,一般的”拖拽流“,没有什么好说的,但对于比较高级的动态生成控件,或者是模板类控件,需要注意布局中的控件位置,千万不能在动态控件代码中,写死像素,因为不是每个电脑的像素都是一样的,在1280*900的电脑上正常,换成800*600的电脑上就悲催了。例如,某个界面上,在某个场景下,OK,Cancel,Apply会依此显示,但是某些场景下Apply没有必要显示,就需要整体右挪一下,如果这时直接将OK,Cancel的Loaction分别写成Cancel、Apply的,就会有问题,因为.Net在像素有问题时,会调整界面控件的布局,所以OK、Cancel、Apply的Location可能就是当初设定的像素位置了。

参数初始化,需要注意将传入的数据对象进行clone,不能直接使用传入数据对象,这会造成对源数据的篡改,很多Bug就是这么出来的。同时返回界面结果时,也需要进行一次Clone。

刷新

我更喜欢叫做数据的展示,这是数据的再绑定。在一些比较复杂的场景下,界面的刷新也需要注意很多,要注意当前操作需要”怎样的刷新“,例如一个表格,我只对导入正确的数据进行刷新,错误的不刷新。这么就有两种方案:

A:重绑数据,刷新整个表。

B:只对对的数据进行刷新。

很多人会用第一个,原因很简单,简易实用。但是在很多场景下,A方案问题很多,如果数据十分大,几十万条呢,整表刷新会直接卡死。所以对于数据的刷新,需要仔细对待,万万不能直接当做”重绑数据“,”再次初始化“来简单对待。

好了,现在SE又说,客户需要加入筛选功能,能进行行、列筛选,在用户导入数据时,筛选结果需要保持。很多人看到这,OK,我就先刷数据源,再把界面上展示的,需要刷新的”找出来“进行刷新。其实,这种刷新的思路是比较正确的,既刷新了数据又保留了用户的操作习惯。但是如果数据量一大,这样一个个”找“,耗时是很大的。控件本身只是展示的,为什么要在展示的控件上进行过多的逻辑处理呢。要是只改了数据源,控件展示的内容就实时变动多好。微软对此是给予了解决方案的,就是虚态模式,很多控件对此都有支持,详情查下MSDN即可。

返回值

界面经过一堆操作后,需要返回界面上设置的值,正如上面所说,需要进行clone来隔离引用。这点也可以在内部Model转为外部Model的过程中完成。

事件

view的事件可以分为控件事件和自定义事件。控件事件主要功能是为实现交互操作,不再讨论。自定义控件,常用方式是实现不同view层间的联动功能,特别是在大量使用userControl的view设计中,不同userControl间使用事件来进行数据的交互联动。在很多需要外部数据(初始化未传入,未在设计进内部Model)时,也会使用事件来进行传入。


 

Control        

特定的比较复杂的逻辑功能(界面交互或者特定功能的),均可提出为Control层。如果说界面负责输入部分的话,这里就是对输入的处理了。        

           


最常见的Control层,即是需要对界面输入数据进行处理,再反馈到界面上的功能。以及对界面数据的校验功能。将这些功能与界面隔离开来,可以大大增加代码的复用程度,例如在界面上进行的校验逻辑,进行分离,这样以后有导入功能的话,也可以在导入功能中初始化使用。这里需要注意的是,一些校验可能需要外部数据,如果再它在初始化时,直接传入这些数据,可能这些数据在用户的操作时有所联动改变,这时再使用其进行校验,就会有问题。这些所需的数据,最好做成按需传入,在使用时再加载进来,这种延迟加载,事件刚刚可以胜任,在校验需要它时,直接对外抛个事件去找数据。


 

 

posted on 2013-09-22 00:29  suriyel  阅读(12090)  评论(0编辑  收藏  举报

导航