[译] MVP模式的14条规则
笔者在前文《MVP和MVC》中提到了两者的区别,以及MVP日趋流行的原因:即随着各种给力UI框架的发布,View的功能越来越强,已经足以完成一些简单的不需要与后台或其他view交互的event handling工作。
一位.NET工程师在他的博客写了MVP的14条规则,个人感觉十分靠谱,所以转载过来,并稍注翻译。
14条具体规则之前,他提到了一些MVP设计的基本共识,比如View必须实现Display接口,Display接口定义了View里面与Presenter交互的所有方法,通过Display的存在,View和Presenter得到完美的解耦,使得架构变得清晰,也为Presenter代码的测试带来极大的便利。View永远不直接调用任何其他模块或者服务,只专注于本身UI细节的实现,以及简单的不涉及与其他模块或服务交互的event处理。如果View需要Presenter提供数据或服务,则必须使用event。
1. All views should have a XxxView suffix: TaskView/ITaskView
2. All presenters should have a XxxPresenter suffix: TaskViewPresenter
3. Let the presenter do all use-case processing, but keep GUI control details in the view
让presenter处理所有的逻辑,把所有GUI以及GUI上控件反应的细节定义在view里面
4. All presenter methods called by the view must start with OnXxx() as they are events by design (MVP)
5. Calls from the view to the presenter should be kept at an absolute minimum, and used for "event" type calls only: _presenter.OnViewReady();
View对于Presenter的调用应该尽量少(应该尽量避免)
6. It is FORBIDDEN to use the presenter reference to access the model or services directly, no return values from presenter methods
禁止使用Presenter引用直接调用model或者服务,Presenter中定义的方法应该都没有返回值
7. Calls from the presenter to the view MUST go via the interface only
Presenter中调用View必须通过View的接口进行(View必须继承自接口,且View中可能被Presenter调用到的方法都要定义在这个接口中,Presenter中禁止出现View)
8. No methods in the view shall be public unless they are defined in the interface
View除了已经定义在Display(View的接口)以外的所有方法都应该是私有的(如果不能定义为私有,即Presenter可能要调用,那就应该定义到Display中,这一点和第7条相互印证)
9. It is FORBIDDEN to access the view from anywhere but the presenter, except for loading and showing the view from the CAB ModuleController
禁止从Presenter以外的任何地方调用View(即只有Presenter可以调用View/Display)
10. The interface methods shall have long meaningful names (not "SetDataSource") based on the domain language of the use-case
Display(View的接口)中定义的方法应该使用有具体意义的命名
11. The interface should contain methods only, no properties - afterall the presenter drives the use-case by calling methods, not by setting data
Display中应该只包含方法,不包含属性变量
12. All data in the MVP component should be kept in the model, no data should exist only as properties of UI controls
MVP模式中所有的数据都应该以model的形式出现,除此以外不应该有数据仅以UI属性变量的形式出现
13. The methods of the view interface should not contain UI control name references (e.g. AddExplorerBarGroup) as this makes the presenter know too much about the implementation technology of the view
Display中的方法不应该包含UI空间的名称,比如AddExplorerBarGroup,因为这样的方法名称会使得Presenter知道View里面的具体实现(这条感觉有点太牵强,不过注重细节才专业,才写得出完美的代码)
14. Stick with domain naming in the view methods (e.g. AddTaskGroupHeader), this makes the code easier to understand and the tests self-describing
View里面定义的方法同样应该有具体的意义,应该和这个方法中涉及到的UI空间或者相应的model名称结合起来
笔者补充几点,View和Presenter是单向的操作,View对Presenter一无所知,Presenter对其他的Presenter几乎一无所知,Presenter之间通过各种各样的event和event handler进行数据交互和服务调用。好的UI系统,所有涉及到2个或2个以上Presenter参与的数据或服务交互都必须由A方发出event,B方注册event handler来接收并处理,如果需要返回数据,则B方发出另一个event,A方注册该event的handler,诸如此类。
[译] MVP模式的14条规则的更多相关文章
- web前端性能14条规则
14条规则 1.减少Http请求 使用图片地图 使用CSS Sprites 合并JS和CSS文件 这个是由于浏览器对同一个host有并行下载的限制,http请求越多,总体下载速度越慢 2.使用CDN( ...
- 更好的 SQL 模式的 10 条规则
更好的 SQL 模式的 10 条规则 2015-06-17 11:57:392353浏览1评论 在创建新表和数据仓库时,要做很多决定.一些在当时似乎无关紧要的地方,却让你和用户在数据库的生命期内感到痛 ...
- [好文翻译]WEB前端性能优化的14条规则
作为一个半前端工程师,而且只会写点HTML5和CSS3的“假”前端工程师,为了能更好地理解一下前端的花花世界,最近拜读了<高性能网站建设指南>一书,对作者提出的前端性能优化的14个规则获益 ...
- Web前端性能优化的14条规则
1.减少Http请求 使用图片地图 使用CSS Sprites 合并JS和CSS文件 这个是由于浏览器对同一个host有并行下载的限制,http请求越多,总体下载速度越慢 2.使用CDN(内容发布网络 ...
- [译]Google官方关于Android架构中MVP模式的示例
概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...
- [设计原则与模式] 如何理解TDD的三条规则
cp from : https://blog.csdn.net/ibelieve1974/article/details/54948031 如何理解Bob大叔的TDD三条规则?第一条和第三条讲的是 ...
- MVP模式
一.软件设计鼻祖MVC 1.1.MVC 第一次听到MVC这个名词是在C#中,相信对于MVC大家都已经很熟悉了,作为一种软件设计模式,MVC这个概念已经诞生好多年了. 如果你已经开发一段时间的iOS应用 ...
- [转]MVP模式开发
转自:http://www.jianshu.com/p/f7ff18ac1c31 基于面向协议MVP模式下的软件设计-(iOS篇) 字数9196 阅读505 评论3 喜欢11 基于面向协议MVP模式下 ...
- web前端-雅虎34条规则优化
1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数.这是 ...
随机推荐
- Java Calendar Date使用总结
Java Calendar Date使用总结 package cn.outofmemory.codes.Date; import java.util.Calendar; import java.uti ...
- J2EE企业级应用架构
一.企业级应用架构解析 应用特点 多环境多系统的交互 海量数据.高并发[用户访问量].高TPS[每秒吞吐量] 安全等级高 自动化集群管理 架构原则 CAP原则(一致性[数据变动要同步].可用性[随着数 ...
- HDU 4489(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4489 解题思路这里已经说的很清楚了: http://blog.csdn.net/bossup/article/d ...
- K:双栈法求算术表达式的值
相关介绍: 该算法用于求得一个字符串形式的表达式的结果.例如,计算1+1+(3-1)*3-(21-20)/2所得的表达式的值,该算法利用了两个栈来计算表达式的值,为此,称为双栈法,其实现简单且易于理 ...
- 工厂方法模式(GOF23)
耦合关系直接决定着软件面对变化时的行为 主要对模块之间的关系进行整理,依赖关系倒置(依赖反转),变化快的东西不能影响到变化慢的东西 用封装机制来隔离易变的对象,抽象部分(不易变)和细节部分(可能容易变 ...
- 线程与全局解释器锁(GIL)
一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资源集中到一起(进程只是一个资源 ...
- KDTree(Bzoj2648: SJY摆棋子)
题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...
- Linux(Ubuntu)下MySQL的安装
1)首先检查系统中是否已经安装了MySQL 在终端里面输入 sudo netstat -tap | grep mysql 若没有反映,没有显示已安装结果,则没有安装.若如下显示,则表示已经安装 2)如 ...
- 爬虫必备—BeautifulSoup
BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. ...
- java中的==、equals()、hashCode()源码分析(转载)
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...