重庆专业做网站,建设银行插u盾网站上不去,建设工程合同的分类,做网站网页维护 手机App 开发PureMVC#xff08;AS3#xff09;剖析#xff1a;吐槽 写在前面 世上没有银弹——不存在适用于所有情况的框架#xff0c;只有适合的框架。再者任何一个好的东西#xff08;语言、框架等#xff09;最终还取决于用的人#xff0c;语言和框架本身并不能保证用户的代码清… 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这种强松耦合模式①强松耦合加重通信次数②带反馈数据的通信加重通信负担。 图UI使用Notification修改Proxy中的数据通信过程 PureMVC中UI修改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个单例Model、View、Controller、Façade。我们可以通过Model、View、Controller的getInstance()方法获取实例并对他们进行操作。然而Façade是用于管理Model、View、Controller并对外提供接口。如果Model、View、Controller对外不可见为什么要设定为单例而不是Façade的成员变量呢 4. 总结 上面说了一些PureMVC的缺点不过总体来说PureMVC还算一个优秀的框架解耦彻底、灵活性高。 本文转自吴秦博客园博客原文链接http://www.cnblogs.com/skynet/archive/2013/02/17/2914742.html如需转载请自行联系原作者