【郭林专刊】MVC已过时,MOVE时代来临?
MVC是一个很常用的程序开发设计模式,M-Model(模型):封装应用程序的状态;V-View(视图):表示用户界面;C-Controller(控制器):对用户的输入作出反应,创建并设置模型。
关于这个话题由来已久,MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。在实际使用中,开发人员在不知道把代码放在哪里的时候,都喜欢把代码放在Controller里面。
为了解决上述问题,LinkedIn的软件工程师Conrad Irwin开始使用另一种模式:MOVE采用了一个新的模型:MOVE:Model,Operation,View and Event。日前Conrad Irwin在个人博客上分享了关于这种模式的一些观点。
上面这张图显示了MOVE这个模式的基本架构。下面详细介绍一下该模式:
- Model:封装所有应用程序对象。
- Operation:封装所有应用程序执行的动作。
- View:应用程序和用户之间的中介。
- Event:链接所有组件事件。
为了避免面条式代码,应该允许每种对象类型。在上图中,已经用箭头标明出来,例如,View允许通过Mdoel去监听Event、可以允许改变模型,但Model不应该只参照View或Operation。
Model
以一个“用户”对象为例,这个Model至少有一个email、姓名和电话号码这几个属性。
在MOVE应用程序模型中Model只封装了简单的方法。这也就意味着除了getters和setters,还会包含一些验证函数,比如:“密码正确吗?”。但不包含把数据保存到数据库或者加载数据到外部API中的方法,这些都应该是Operation来完成的事情。
Operation
应用中,比较常见的Operation应用是一个用户登录程序。它实际上是由两个子操作完成的:首先,从user中获取邮箱地址和密码,其次从数据库中读取user对象信息,并且检查两者数据是否匹配。
在MOVE模型中,Operation永远都是一个执行者。负责对Model进行修改、适时显示正确的视图给用户、对用户触发的事件做出响应。在一个分解良好的应用程序中,相对Operation每个sub-operation都可以在其中单独运行。这就是为什么Event箭头向上而Changes向下。
这样做的好处在于:在程序运行时,开发者可以把整个应用当作一个Operation。如果需要,它还可以尽可能地分解为更多的sub-operation,而每一个sub-operation都可以并行运行,然后在它们都结束时程序结束运行。
View
登录界面就是一个视图,显示几个文本框。当用户点击“登录”按钮时,视图将产生一个“loginAttempt”事件,并且把用户输入的用户名和密码传送过去。
视图就是用户看到的整个界面并且用户还可以通过界面与程序进行交互。它们不仅会以一个易于理解的方式来显示应用程序,而且还可以把用户传入的信息简化成有意义的事件来与用户进行交流。
重要的是,视图并不会直接改变模型,它们只会发出事件给Operation,并且等待Model发出事件响应。
Event
用户点击登录按钮时,视图会产生一个“loginAttempt”事件。此外,当登录这个操作完成后,“currentUser”模型会发出一个事件去通知你的应用程序。
事件监听和MVC/MOVE里的控制刚好相反,开发者需要允许Model去更新View,即使在Model不清楚哪个View正在更新。
总结
本文并不是强调MVC有多糟糕,在过去的几十年里,它以难以置信的方式成功构建了许多大型应用程序。但它毕竟是几十年前为老技术而设计的,而MOVE作为一个新技术,在原有的基础上进行升级,以更好的适应软件开发的需求。(编译:张红月)
原文:MVC is dead, it's time to MOVE on
转载于:https://www.cnblogs.com/javaTest/archive/2012/07/12/2589568.html
【郭林专刊】MVC已过时,MOVE时代来临?相关推荐
- 【郭林专刊】过来人的总结
2011年前,开发主要集中在模块级别.11年后很多独立开发工作,学习到很多知识,同时也看到非常多的不足.仅谈昨天的成就不能指导今天的前进,而深挖不足却可以让我们更加清醒. 不足一:目标不明确 我们开发 ...
- 【郭林专刊】JSP中JSTL提供的函数标签EL表达式操作字符串的方法
首先在jsp页面导入标签 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions&qu ...
- 【郭林专刊】自信还是危机感
"刚来公司不到一年的人,千万别给我写战略报告,千万别瞎提阿里巴巴发展大计,谁提,谁离开!"在一周前写给入职新人的一封邮件中,马云这样写道. 过去几年间,笃信进化论的马云,常常为80 ...
- 【郭林专刊】10个步骤让你成为高效的Web开发者
要成为高产.高效的Web开发者,这需要我们做很多工作,来提高我们的工作方式,以及改善我们的劳动成果. 下面是10个提高效率的步骤,虽然不能保证解决你在开发中的所有问题,但至少是非常实用的,可以简化你的 ...
- swing程序 过时拉嘛_密码已过时-如何保护您的应用程序和保护用户
swing程序 过时拉嘛 重点 (Top highlight) I've said this part before, so if you read the previous article, ski ...
- JSP基础开发,可以用一些小型的项目中(简单学习,已过时,但是在一些项目中可以用到)
JSP开发1(了解,已过时) 学习目标 学习内容 学习产出 1. JSP概述 2. JSP快速入门 2.1. 搭建环境 2.2. 编写代码 2.3. 测试 3. JSP原理 4. JSP脚本 4.1. ...
- IDEA中提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
问题描述: 运行Java Web项目时,IDEA中提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除 解决方法: 1. 打开[File]-[Project Structur ...
- 尤金 卡巴斯基:网络安全已陷“黑暗时代”,我们该如何应对?
编者按:尤金·卡巴斯基,卡巴斯基实验室董事长兼首席执行官,这家IT安全公司用户超过4亿是当今全球增长速度最快的IT安全公司之一,其运营覆盖全球 200 多个国家及地区.尤金·卡巴斯基在技术.科学以及商 ...
- C# “Thread类Suspend()与Resume()已过时” 解决方法(利用ManualResetEvent类)
C# "Thread类Suspend()与Resume()已过时" 解决方法(利用ManualResetEvent类) 参考文章: (1)C# "Thread类Suspe ...
最新文章
- Jupyter Magic - Timing(%%time %time %timeit)
- 有“肌肉”有“血管”!波兰团队耗时5年研发超逼真仿生机械臂,网友:很怪异也很牛掰...
- python图片识别-python图像识别
- 学python需要学数据库吗-python可以使用什么数据库
- 什么时候会引起索引失效
- linux检测文件名编码,Linux下查看文件编码,文件或文件名编码格式转换 | 缥缈的云...
- 10.27 sort
- 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你
- PTA19、通过两个列表构建字典 (10 分)
- oracle open_link,open_links_per_instance 和 open_links 参数说明
- 功放(耳机/音箱)声压级计算(五)
- 是的,我开始做这么一件事了
- 190321每日一句
- 离散数学第一章(知识点总结)
- BIOS 虚拟化技术
- emqx启用JWT令牌认证(包含hmac-based和public-key)
- 推荐两个在线代理服务器
- OPPO手机怎样把图片拼在一起(拼图教程分享)
- 多重积分积分区域奇偶对称性化简积分
- .NET Serviece安装及 启动报错(The Parameter is Incorrect)参数错误问题处理
热门文章
- ArcGIS.Server.9.3和ArcGIS API for Flex的GeometryService和buffer分析(十)
- Java使用Optional与Stream来取代if判空逻辑(JDK8以上)
- 本地 php nginx压测试
- 【NOIP2016】蚯蚓 --队列模拟
- HDU 5696 区间的价值 暴力
- iOS开发日记1-tableview编辑
- Linux网络基础设施配置
- oracle使用dbms_metadata包取得所有对象DDL语句
- Xcode5搭建Python开发环境
- VS2010中:error C2471: 无法更新程序数据库