PureMVC(AS3)剖析:吐槽

PureMVCAS3)剖析:吐槽

写在前面

世上没有银弹——不存在适用于所有情况的框架,只有适合的框架。再者任何一个好的东西(语言、框架等)最终还取决于用的人,语言和框架本身并不能保证用户的代码清晰、解耦等,当然它只是尽可能地做到这点。所以记住我写这篇不是为了否定PureMVC,相反是为了更好的了解它、使用它

1. 吐槽一:过于强调解耦

PureMVC引入了多种设计模式、消息机制(使用观察者模式,发布/订阅模式)来解耦各个模块,它确实做到了这点,但是彻底解耦是需要代价的!

1.1. Notification消息命名及管理复杂

PureMVC为了做到跨平台,使用Notification来实现模块间通信,而非Flash原生的EventDispatcher/Event机制。然而Notification使用字符串来定义消息,存在以下“问题”。

注:Notification并不是Event的替代物。一般情况下,Mediator给其视图组件添加Event侦听器,按常用方式处理,然后给目标Command/Mediator广播Notification

n 消息ID为字符串,虽然字符串可以做到编译时解耦,但无法做到消息强类型,这样错误将推迟到运行时才能发现。

n 消息命名,在一个大型项目中,需要一套详细的规则。相信我,否则你会吃苦头的。特别是多人参与项目中,如果没有按照一定规则命名,命名冲突可是会让你调试一阵。但不管你如何定义命名规则,【记住】为了模块间解耦,Notification发布者应该不关心谁对这个消息感兴趣(谁来处理),感兴趣者自行注册(Mediator通过listNotificationInterests注册、Command通过facade.registerCommand()注册)。例如当Proxy中用户信息改变时,不应该sendNotification通过“UpdateUserInfoVIew”“UpdateFriendListView”2个通过来分别更新用户信息、好友列表中对应用户的信息,而只是发送一个通知,如“UpdateUserInfo”,用户信息栏、好友列表都注册这个消息,然后分别处理。

n 无法知道Notification的源头。然而这点可以通过在消息体body中,增加字段标识,如:

sendNotification(ApplicationConstants.UPDATE_LEVEL_DATA, { "noticeSource": this, "levelData": m_levelData } );

noticeSource标识消息来源,如果您还想要知道消息传递层次,可以用数组表示,顺序插入传递者。

1.2. 强松耦合加重通信次数

PureMVC中模块间通信推荐使用Notification机制,但是全部使用Notification这种强松耦合模式:①强松耦合加重通信次数;②带反馈数据的通信加重通信负担。

clip_image002[4]

图:UI使用Notification修改Proxy中的数据通信过程

PureMVCUI修改Proxy的数据并返回后刷新过程:Mediator收到UI提交事件后,发送Notification消息给CommandCommand进行业务逻辑处理,调用Proxy接口修改数据(这里还可能涉及到与服务器通信),然后发消息给Mediator刷新,Mediator收到消息调用UI接口刷新。

因为都是消息机制,整个流程很长,而且Proxy中对数据进行操作后,发送Notification时,可能需要携带修改后的数据(可能是来自服务器的数据)。这个过程不仅通过次数多,而且带反馈数据的消息增加通信负担。另一方面要调试这个过程,我们只能在编译的时候找出一步一步的通信流程,才能跟踪调试。

2. 吐槽二:解耦增加了代码量,不方便调试

解耦的同时将使项目修改的复杂程度提高,某些解耦的办法还会增加代码量、降低执行效率。PureMVC是一个强解耦的框架,其效率本身不是很高,函数调用层次较深,而有时根本不清楚消息发到了哪里。

PureMVC为了实现解耦增加了代码量,不方便调试,但哪个MVC框架不是呢!这不是PureMVC的问题,已经有前辈编写了PureMVC模版,如FlashDevelop的模板(下载),使用模板可以减少手动编写代码量,但不能减少类的数量。

有篇文章详细介绍了PureMVC的耦合与解耦:耦合与脱耦——深入分析为什么使用pureMVC、接口或抽象基类(入口http://bbs.9ria.com/thread-161667-1-1.html

3. 吐槽三:过度使用单例模式

单例模式过于万能,属于高耦合写法。PureMVC中有4个单例ModelViewControllerFaçade我们可以通过ModelViewControllergetInstance()方法获取实例,并对他们进行操作。然而Façade是用于管理ModelViewController并对外提供接口。如果ModelViewController对外不可见,为什么要设定为单例,而不是Façade的成员变量呢?

4. 总结

上面说了一些PureMVC的缺点,不过总体来说PureMVC还算一个优秀的框架,解耦彻底、灵活性高。




本文转自吴秦博客园博客,原文链接:http://www.cnblogs.com/skynet/archive/2013/02/17/2914742.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch基础(八)——正则化

一、概念 正则化在深度学习领域是为了防止训练结果过拟合而采取的一种方法。 1.1 过拟合 过拟合表示模型的泛化能力较差,体现在实际训练模型上就是在训练集表现很好,但是在测试集的效果一般。 过拟合的原因:1,模型过于复杂。2&…

uva 11997 K Smallest Sums 优先队列处理多路归并问题

题意&#xff1a;K个数组每组K个值&#xff0c;每次从一组中选一个&#xff0c;共K^k种&#xff0c;问前K个小的。 思路&#xff1a;优先队列处理多路归并&#xff0c;每个状态含有K个元素。详见刘汝佳算法指南。 1 #include<iostream>2 #include<cstdio>3 #includ…

.net生成随机字符串

生成随机字符串的工具类&#xff1a; /// <summary>/// 随机字符串工具类/// </summary>public class RandomTools{/// <summary>/// 随机系数/// </summary>public static int _RandIndex 0;#region 获取某个区间的一个随机数/// <summary>///…

【图像处理】——Python鼠标框选ROI(感兴趣)区域并且保存(含鼠标事件)

鼠标交互切割矩形 接下来,就是本文重点了。先吐个槽,网上有资源,但搜到的都是C++的。本来有点气馁的,还好,有官网在,文档写得很清楚,而且接口函数名字变化不大,稍微做下修改就行了。 import cv2global img global point1, point2 def on_mouse(event, x, y, flags, pa…

c++ 11 override final

C 11添加了两个继承控制关键字&#xff1a;override和final。 override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名。final阻止类的进一步派生和虚函数的进一步重载 出处&#xff1a;http://www.cnblogs.com/zhangdongsheng/ 作者&#xff1a;张东升

泛型方法与桥方法

Java泛型中有存在一种方式叫做类型擦除&#xff0c;也就是说泛型在编译期间进行类型检验上做到有效安全&#xff0c;但是在运行当中&#xff0c;会将该泛型类型用顶层父类&#xff08;若无继承关系则用Object&#xff09;代替&#xff0c;然后再进行强转换成目标类型&#xff0…

Pytorch基础(九)——损失函数

一、概念 损失函数在深度学习领域是用来计算搭建模型预测的输出值和真实值之间的误差。 具体实现过程&#xff1a;在一个批次&#xff08;batch&#xff09;前向传播完成后&#xff0c;得到预测值&#xff0c;然后损失函数计算出预测值和真实值之间的差值&#xff0c;反向传播…

用程序猿思维、程序设计师思维两种方式写求斐波那契数列的方法。

//用Java实现斐波那契数列(Fibonacci) public class Test {public int f(int n)//n代表第几个数字。程序返回它相应的值{return n>2?f(n-1)f(n-2):1;//看似如此优雅的一句程序}//程序设计师的思维&#xff1a;会重构上面的代码。让他们更易读。推荐&#xff01;&#xff01…

【图像处理】——图像的差集、并集、补集、交集以及两个图像相减出现负数的处理方法

目录 目录 1、交集 2、差集 3、并集 4、补集 5、差为负值,和超过255的解决办法

Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念 Pytorch中优化器的目的&#xff1a;将损失函数计算出的差值Loss减小。 优化过程&#xff1a;优化器计算网络参数的梯度&#xff0c;然后使用一定的算法策略来对参数进行计算&#xff0c;用新的参数来重新进行训练&#xff0c;最终降低Loss。 其中官网提供了13种优化算…

【图像处理】——改变图像的大小(降采样重采样)下采样和上采样

转载自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采样、下采样和金字塔加速参考:https://blog.csdn.net/Eastmount/article/details/89341077 目录 1、拉伸图片——重采样 2、缩小图片 1)三次插值法cv2.INTER_CUBIC

一段代码到可执行程序所有经历

如果你写的代码是hello.c&#xff0c;你的程序将经历下面的步骤到达硬盘或者内存成为可执行文件。 第一步&#xff1a;hello.c&#xff08;文本&#xff09;经过预编译生成hello.i&#xff08;文本&#xff09; 第二步&#xff1a;hello.i&#xff08;文本&#xff09;经过编译…

js获取url参数值

今天碰到要在一个页面获取另外一个页面url传过来的参数&#xff0c;一开始很本能的想到了用 split("?")这样一步步的分解出需要的参数。 后来想了一下&#xff0c;肯定会有更加简单的方法的&#xff01;所以在网上找到了两个很又简单实用的方法&#xff0c;mark下 方…

[PyCharm]unindent does not match any outer indentation level解决方法

转载&#xff1a;https://www.jianshu.com/p/b34f30717eb2 问题出现原因 1、代码前后缩进量不一致 2、tab和space混用&#xff08;如果一段代码既使用space又使用tab进行缩进&#xff0c;会发生错误&#xff0c;这个时候PyCharm会自动进行判断&#xff0c;根据设置的预先缩进…

为什么要选择Apache Pulsar(二)

这是介绍Apache Pulsar关键特性系列文章的第二篇。Pulsar是由Yahoo开发并开源的下一代发布订阅消息系统。在第一篇文章里&#xff0c;我们介绍了Pulsar对消息模型的灵活支持、多租户、多地域复制和持久性。在这一篇文章里&#xff0c;我们将继续介绍Pulsar的IO隔离机制、伸缩性…

Yolov5目标检测模型运行遇到的相关问题汇总

一、yolov5-5.0常见错误 1. pycocotools工具包无法安装 具体报错如下&#xff1a; requirements: pycocotools>2.0 not found and is required by YOLOv5 pkg_resources.DistributionNotFound: The pycocotools>2.0 distribution was not found and is required by th…

PHP反射之类的反射

最近在琢磨如何用PHP实现站点的插件功能&#xff0c;需要用到反射&#xff0c;于是现学了一下&#xff0c;笔记如下&#xff1a; class Person {public $name Lily;public $gender male;public $age 20;public function eat(){echo Lily is eating!;}public function run(){…

数据结构(复习)--------关于平衡二叉树(转载)

在上一个专题中&#xff0c;我们在谈论二叉查找树的效率的时候。不同结构的二叉查找树&#xff0c;查找效率有很大的不同&#xff08;单支树结构的查找效率退化成了顺序查找&#xff09;。如何解决这个问题呢&#xff1f;关键在于如何最大限度的减小树的深度。正是基于这个想法…

mysql外键

效果 a,b,c 如果c设置到a的外键&#xff0c;那么只能在删除c的记录后&#xff0c;才能删除a的记录。 https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails CREATE TABLE IF NOT EXISTS advertisers ( adverti…