摘要
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