天天看点

Adobe Cairngorm,Flex框架技术实践总结

摘要

Cairngorm 作为Adobe 官方的Flex框架,一直被大家所认识和使用,我以自己用Cairngorm做企业级项目时积累的经验,对Cairngorm 做一个比较深入的探讨.

正文

Cairngorm作为一个轻量级别的Framework,的确在小型项目中对开发有一定程度帮助,但是随着重量级别的Flex开发的,尤其是Message Push,Module,RSL,DataService,等比较重量级别的特性的使用,Cairngorm并没有很好得处理和封装这些特性,Cairngorm只不过为我们提高了一个样板,一个线索,实际上的工作还需要我们来完成.

其次,Cairngorm的整体设计上存在一定的陷阱,如果没有办法很好得理解Cairngorm的设计思想,很有可能会造成性能问题和额外维护成本.

下面分几点来讨论:

(1)IServiceLocator模式

IServiceLocator的主要功能是使远程服务器对象保持单例,但没有提供添加删除功能.没有考虑到Module加载这一特性,所以的远程服务都必须注册在Application上,丧失了动态服务加载的特性.

(2)CreditCardDelegate

这是一个莫名其妙的类,我无法理解他的存在能带来什么,从表面看上去可能和后端的RemoteObject的类型保持一直, 把service从弱类型转换为强类型,但是CreditCardDelegate本身通过构造函数Command的子类来实例化,从敏捷角度来说这些操作太多余.

(3)Command模式的滥用

Command模式 最推荐在远程服务的业务逻辑的情况下才使用,一般的UI事件使用UI原来的事件机制可能会更加良好的兼容性.

Cairngorm对事件链和事件流的支持不是很好,只有一个SequenceCommand

使用的时候还需要自己去调用

Called explicitly by the developer within a concrete SequenceCommand implementation

public function executeNextCommand() : void;

(4)虚伪的FrontController

FrontController根本没有做任何事实上可控制有关系的事情,充其量可以作为一个任务分派器或者任务配置表.将CairngormEvent和Command做映射.

有兴趣可以对比看一下flex sdk中Controller类的职责很角色.

(5)CairngormEvent

有些开发者喜欢只使用CairngormEvent,来传递数据,由于CairngormEvent只有一个data:* 造成不同数据结构的事件都叫CairngormEvent, 这样的做法会降低项目的可维护性, 参考CairngormStoreWeb2_1,就为每一种类型的事件建立了新的子类,和数据结构和构造器. 我十分推荐这种做法

(6)IModelLocator

IModelLocator这个特性是一个很危险的特性,由于IModelLocator是单例全局访问权限, 如果将View和临时数据放在里面,很容易造成内存泄漏等问题.IModelLocator存放大量无关数据也会造成无法被垃圾回收.

IModelLocator还不利于自定义FLex组件的独立性,如果在自定义组件里使用IModelLocator的数据,就会造成自定义组件依赖Cairngorm.

我建议尽量避免使用IModelLocator,IModelLocator中只放业务相关的数据,不放任何图形对象的实例.

(7)ViewHelper 和 ViewLocator

刚才提到了IModelLocator中定义View会造成问题.CairngormEvent又提供了ViewHelper 这样一个机制来提供全局范围访问view.

虽然提供了2个监听来防止内存泄漏

view.addEventListener( Event.ADDED, registerView );

view.addEventListener( Event.REMOVED, unregisterView );

但是我还是不推荐使用.因为这会增加代码复杂度和耦合.

(8)其他

还有一些比如多国语言和样式等,基本没有什么太大的问题,这里就不提了.

总结

IServiceLocator 和FrontController的功能有限.

Command和CairngormEvent 往往是开发者理解不足造成的问题

IModelLocator 和ViewHelper 会让程序像汇编里的GOTO那样东跳西跳.

总得来说,Cairngorm的技术和设计思路并没有太大的问题,但是由于种种问题,导致Cairngorm还无法胜任大型项目的开发,因此我借鉴了Cairngorm,ModuleGlue和其他一些框架,自己开发了新的Framework,-------- Loof-framework.

参考资料

Adobe Cairngorm:http://labs.adobe.com/wiki/index.php/Cairngorm

继续阅读