阅读更多

22顶
3踩

企业架构

转载新闻 MVC模式不好用?何不试试MOVE

2012-07-05 17:19 by 副主编 MnouW 评论(22) 有18862人浏览
MVC模式在编程中的应用,是一个很了不起的主意。“数据模型(Model)”可以封装与应用程序的业务逻辑相关的数据及对数据的处理方法;“视图层(View)”能够实现数据有目的的显示;“控制器(Controller)”能够在不同层面间起到组织作用,对应用程序的流程进行控制。

不过,可能你在使用这种三层架构模式的过程中会逐渐迷惑。因为有很多代码你不知道把它放哪,就只好把它放到控制层,最后发现在控制层中塞了太多的代码。

LinkedIn的软件工程师Conrad Irwin也遇到同样的问题,于是他开始使用另一种模式:MOVE,即Models(模型)、Operations(操作)、Views(视图)、Events(事件)。

近日Conrad Irwin在个人博客上分享了关于这种模式的一些观点。


概述

Irwin结合上图对MOVE模式先作了简单定义:

  • Models,封装该应用程序中知道的一切;
  • Operations,封装该应用程序要做的一切;
  • Views,帮助用户与应用程序完成交互;
  • Events,用于安全地连接所有这些组件。
为了避免意大利面条式的代码,图中标示出了对哪种类型的对象进行操作是允许的。例如,视图允许监听由模型产生的事件;操作允许修改模型,但模型不应涉及视图或操作。

Models(模型)

这里以一个“User”对象为原型,它至少应用有一个Email地址,也可能有用户名和电话号码。

在一个MOVE模式的Models中只包装知识。这意味着除了Get和Set功能,它们可以包含检查用户密码是否正确这样的方法,但不会包含把密码保存到数据库或传递给外部API这样的功能,因为后面这些工作将由Operations来完成。

Operations(操作)

对应用程序来说,一个常见的操作是用户登陆。这实际上是由两个子操作组成:首先从用户那里获得邮件地址和密码,然后从数据库载入“user”模型并检查密码是否匹配。

Operations是MOVE模式中的行动者。它负责修改模型,在正确的时间显示正确的视图,以及响应由用户交互引发的事件。在一个分解良好的应用程序中,每个子操作都可以独立运行。

采用这种方式的操作有一点很令人振奋,即程序启动后,整个应用本身就可以被当作一个Operations。它会根据需要生成尽可能多的子操作,其中每个子操作都并行地运行。当所有子操作都完成时,程序也便退出。

Views(视图)

登陆页面即是一个视图,它负责显示一些文本框给用户。当用户点击“登陆”按钮时,视图将产生一个“loginAttempt”事件,其中包含用户输入的用户名和密码。

用户能够看到的内容,以及能感受到的互动都由视图提供支持。它们会以一种用户能理解的形式呈现应用反馈,同时还能将简单的用户交互转换成有意义的事件。更重要的是视图不会直接改变模型,它们只是向Operations发起事件,然后通过监听等待由模型发起的事件。

Events(事件)

当用户登陆时,视图会发起“loginAttempt”事件。在登陆操作完成后,“currentUser”模型会发起一个事件通知应用登陆状态已改变。

事件监听让MOVE(及MVC)实现控制反转,允许模型更新视图。这是一种强大的抽象技巧,允许组件互不干扰地耦合在一起。

为什么是现在?

当然,Conrad Irwin并不想被人认为自己是在暗示MVC模式很差,这种大型应用程序架构在过去的几十年里确实非常成功。不过几十年后的今天,新的编程技术已经变得越来越流行,所以你也会在使用过程中逐渐产生一些疑惑。

MVC模式确实很了不起,但它毕竟是几十年前为老的技术而设计。MOVE模式是在其基础上的升级,让你可以更好地利用当前已有的新工具。

  • 大小: 41 KB
来自: 36氪
22
3
评论 共 22 条 请登录后发表评论
22 楼 gaoyongbo026 2012-09-14 13:16
瞎掰,基本还是mvc,而event这是组件间信息传递的一个方式而已
21 楼 liguocai2009 2012-07-09 09:17
aegeanmoon 写道
事件驱动最简洁,其他根本不能节省工作量。
什么简洁 合理 优美都是浮云 ,都是拿理念折腾程序员
客户根本不关心这个

事件驱动具体是怎样的?有比较好的文章推荐吗?

客户端发送的请求会关联到一个指定的action,action根据客户端参数,转向到具体的service。这个过程,好像挺完美的样子...事件驱动解决什么问题?
20 楼 roland1125 2012-07-09 09:08
aegeanmoon 写道
事件驱动最简洁,其他根本不能节省工作量。
什么简洁 合理 优美都是浮云 ,都是拿理念折腾程序员
客户根本不关心这个


事件驱动最简洁! 同感!
19 楼 田梦桦 2012-07-09 08:40
个人认为根据项目的大小,选择更适合的设计模式是最重要的。
18 楼 lection.yu 2012-07-08 10:11
MVC,其实我的理解还是重点是V和MC的分离。
如果有多个地方需要复用的代码或者需要完整事务的代码,我就放到服务层。
我一直很享受这种编程方式。
17 楼 aegeanmoon 2012-07-08 00:10
事件驱动最简洁,其他根本不能节省工作量。
什么简洁 合理 优美都是浮云 ,都是拿理念折腾程序员
客户根本不关心这个
16 楼 fireflyc 2012-07-07 23:45
引用
Operations是MOVE模式中的行动者。它负责修改模型,在正确的时间显示正确的视图,以及响应由用户交互引发的事件。在一个分解良好的应用程序中,每个子操作都可以独立运行。


我没找到中文,在struts1.3的首页上找到这个
引用

Under MVC, an application is seen as having three distinct parts. The problem domain is represented by the Model. The output to the user is represented by the View. And, the input from the user is represented by Controller.

引用

The Controller is focused on receiving requests from the client (typically a user running a web browser), deciding what business logic function is to be performed, and then delegating responsibility for producing the next phase of the user interface to an appropriate View component.

你觉得两者有区别吗?开发者热衷于发明新名词,每一个人都宣称自己找到了很牛B的东西。其实很多时候他们不但对“前人的努力”视而不见而且还充满敌意否认一切。这就是为什么那么多开发者喜欢发明新模式、新概念,写新framework,并且一副牛B哄哄的样子。
15 楼 mmhotsky 2012-07-07 23:31
wqq2012 写道
有谁知道那副uml图是用啥画的不?

这是iPad上的Paper画的,微软开发的一个绘图程序。我用过还是很不错的,只有一支画笔免费,其余的几支笔需要花钱买
14 楼 KimHo 2012-07-07 15:01
wqq2012 写道
有谁知道那副uml图是用啥画的不?

粉笔
13 楼 mengyancui 2012-07-07 14:42
其实就是MVP设计模式
12 楼 wqq2012 2012-07-07 12:38
有谁知道那副uml图是用啥画的不?
11 楼 leavesforeye 2012-07-06 14:25
我们经常用的一种方式,entity里面复写 equals 复写hashcode  在顶层model定义各种方法比如排他检查,甚至在model里面定义自身销毁自身插入等方法,还不都是为了互不干扰各司其职
10 楼 leavesforeye 2012-07-06 14:24
我还是觉得,什么MVC啊 什么MOVE啊 什么CCTV WTO啊 其实都只是看你的项目什么样罢了。重点是我们还不是负责显示的就负责显示别的不干,负责存储数据的就负责存储数据别的不干,负责处理逻辑的就处理逻辑别的不干。控制层什么服务层,还不都是为了让各个步骤各司其职。
就好像公司管理要有上下级流程一样。

软件业有工作流嘛,所以不管什么模式都不重要,重要的是你能不能做到各司其职,互不干扰。
9 楼 elveny 2012-07-06 12:36
Action-->service-->Dao-->Model
8 楼 geminiyellow 2012-07-06 10:15
MVVM? 模式太多啦。
7 楼 leavesforeye 2012-07-06 09:33
其实就是“面向事件” 和“面向操作” 嘛。
把我们常用的service改成interface XXEvent 然后 每次都 model.fireEvent(new XXEvent handler())
不都是一样的。 我觉得只是个javas wing 适用下web开发
6 楼 demonkind 2012-07-06 09:29
楼主了解下DDD吧
5 楼 jnoee 2012-07-06 09:07
作者对MVC的理解有问题。
所谓MOVE模式也是已经在用的东西,例如wicket。
4 楼 rox 2012-07-05 23:46
事件驱动,.net就是这个啊。
3 楼 youarestupid 2012-07-05 22:39
beming 写道
....我一早就是这样子用了,很多处理总不能放到Controller,我是增加一个service层,MVCS!

Service层早就用得很广泛了。
至于event事件方式来触发操作,这种响应方式还是在桌面软件开发中比较合适,在web开发中,用户操作与应用响应,是一问一答的远程交互式过程,event能起什么好的作用?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 整数之和

    题号: 10505 时限:1000ms 限制内存:32768KB 题目: 描述 密码问题迎刃而解,即刻响起一串轻快的开机音乐,哈哈,手机终于可以使 用了!忽然,一个神秘的手机精灵从屏幕上出现了,她笑嘻嘻的问卡卡西:“卡 卡西,你是不是想见超人啊?”卡卡西迫不及待的点点头,手机精灵说:“那你 需要再回答我一个问题。请你随便报出一个正整数 n,我会即刻在手机屏幕上生 成一串由递增的不同的正整数所组...

  • 哈哈。终于找到问题了。写错方法了。呵呵

    今晚不错。改写了一个文件上传的类 UP_LOADCS.PAS  unit up_loadcs; interface uses  System.Collections, System.ComponentModel,System.IO,System.Web, System.Web.SessionState,  System.Web.UI, System.Web.UI.WebControls

  • 问题终于解决了

    上周把桌面共享做好之后,发现一个bug,在我写的flash server中如果客户端调用服务器端函数发送一个很大的数据的时候,如果这个时候再调用一个其他的函数, 接收数据的客户端会死掉,上周一直都在弄这个问题,很烦,把fms的数据包再分析了一次也没有少处理了什么数据。       今天问题终于发现了,这个问题很隐藏和fms数据包也没有关系,竟然是我写的软件底层有问题。 网络发送部分有问题...

  • 终于可以使用了

    前些日子看到javaeye上有很多有用的资料,随即注册了一个。没想到要3天以后才能使用正常的功能。呵呵,感觉这个规定不太人性化。初学java没多久,以后准备把自己的学习历程都写在这个博客上,希望热心的人多指点我一下。呵呵。 :) ...

  • 在若干个整数中找到相加之和为某个整数的所有组合的算法

    给定一个数t,以及n个整数,在这n个整数中找到相加之和为t的所有组合,例如t = 4,n = 6,这6个数为[4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合,它们的相加之和为4:4, 3+1, 2+2,2+1+1。 我用c#实现的,定义了一个栈来存放符合条件的数据。代码如下. 1 int a = 4; 2 int[] iArr = new i...

  • LeetCode-371. 两整数之和

    不使用运算符+ 和-​​​​​​​,计算两整数​​​​​​​a、b​​​​​​​之和。 示例 1: 输入: a = 1, b = 2 输出: 3 示例 2: 输入: a = -2, b = 3 输出: 1分析:看见题目知道用位运算解决,但是具体操作并不熟悉,所以 含义Pascal语言C语言C#语言Java 按位与 a and b a & b ...

  • 昨天的问题终于解决了

    唉,真是太高兴了.昨天的问题终于解决了 原来是我在第一次写实体BEAN的时候,定义错了,然后就把它布署到JBOSS里面去了,以后我虽然写对了,但是我布署进JBOSS里的JAR文件还在那里,所以每次都会出错,以至于我重新安装了NB都会出错,唉,我当时怎么不重装一下JBOSS呢,重装JBOSS问题就可以解决了.不过现在我也没有重装JBOSS,只是把JBOSS下面的我以前布署的JAR文件删掉就可以了 其...

  • 哈哈

  • FreeTextBox的问题终于解决了

    FreeTextBox的问题终于解决了  这两天,FreeTextBox的问题一直困扰着我。这个问题在以前的文章中我已简单描述过。也就是在回复页面, 如果我用FreeTextBox代替TextBox,提交时却不能得到FreeTextBox中的内容。今天我终于找到了问题的真正原因,原来是.Text将ViewState关闭了。害得我走了很多弯路,我一直以为是MasterPages引起的,这两天一直在研

  • 终于3天到了, 哈哈,可以写字了

    越不容易得到的越珍惜 ? 是吗 ? 不是吧 !

  • 第十八章:一文掌握数组标记

    数组标记 一.桶标记 1.认识数组 数组是一种将数据有序存放的结构,通过一维数组的学习,相信同学们会感觉数组的使用是非常灵活的,原因无异于是因为数组里一个下标对应一个元素。例如 int a[5]={2,3,5,7,11},下标0对应的元素为a[0],下标1对应元素a[1]...,那么在将数组应用在生活或者学习场景中时,下标及其对应的元素就会有不同的含义。 2.桶标记引入背景: 这里有一个有趣的问题:从键盘输入5 个0-9 的数,然后输出0-9 中哪些没有出现过的数。例如,输入2 5 2 1 8 .

  • LeetCode371. 两整数之和

    1.问题 不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。 示例 1: 输入: a = 1, b = 2 输出: 3 原题链接; 2.解法 因为不能使用 +,-,只能考虑用位运算。 简单分析 1+3(1111 0001,1111 0011相加)。 两数相加,等于不考虑进位得到的数,加上进位。 a&b 再左移就得到进位。a^b 得到不考虑进...

  • 终于能用了

    郁闷了好多天,终天能用这个blog了,要不系统有问题,要不密码不行。为什么非得要在这里开个blog?“还是是因为这里风水好!”呵呵

  • J2SDK1.5->J2SDK5.0,哈哈

    http://www.theserverside.com/news/thread.tss?thread_id=26955

  • 问题终于解决

    啊!!       面对面前的东西我大叫了一声,也许是多日来太郁闷了,真看到问题解决的时候,自己心里没有太大的惊喜和激动!    总结如下,做东西的时候要有自己的主见不能完全相信厂家的阐述,这次之所以耽误了这么长的时间,主要是小程的一些误导,老认为产生接收中断是不正常的,所以就走了一个弯路,也说明自己的经验不足吧。另外自己的代码写的还是有点问题,要多注意细节问题,要不就不会产生这样的结果!唉,

Global site tag (gtag.js) - Google Analytics