Posted on 2007-02-06 00:05
云自无心水自闲 阅读(1067)
评论(2) 编辑 收藏 所属分类:
Flex 、
Flex2
有许多方法可以把一个应用拆分成基于个独立下载的部分。甚至于将每个类都分成单独的文件,由ClassLoader在需要的时候加载。但是如果这样效率是比较低下的,因为类的引用有着明显的“引用地域”;如果你引用了一个类,往往会马上牵涉到需要引用一大堆其他的类,如果把这些类全都打包在一起,效率会高得多。
由编译器自动选择一个非常好的打包方法是比较困难的。很可能需要在应用开发时进行一些设定,并不时地监控类的引用。能够统计出最优的分拆方法:应用应该分成几个SWF,哪些类应该放在哪个SWF中。但是这种方法听起来更象是一种研究范畴,实际操作起来非常困难。
让我们来看一些更具有操作性的方法。
很多应用分解后,包含两种类型的功能:“启动后立即填充”和“启动后稍后填充”。
有许许多多的应用是这种模式的。比如:游戏;你有一个游戏引擎和一些游戏场景。或者Portals和Porlets; 一些基础的共享功能和数据驱动的小应用。或者是一个大型的有着1500个页面的保险应用,运行特定功能是只会访问一小部分的页面。或者是充斥大量内容的应用,它可以独立的更新部分内容而不是强制用户每次浏览时都必须下载全部内容。
我称这些相对独立的可以延迟加载的功能为“模块”(Modules),称加载模块的应用为“Shell”。
在这里,我们先不看如何做,先来看一些
shell需要能够与模块交互,同样模块也需要和Shell交互。如果shell引用了modules的一个类,那么它会把它链接进来。同样,如果模块类引用了shell类,它也会把它链接进来。应用能正常运行只有两个方法:或者引用是相同而且共享的(这样就不需要下载两次),或者两者是不同的,而且没有任何关系(尽管两个类名字相同,但是它们被认为是无关的,而且不能交互)。
最好的解决办法是让模块和shell通过接口交互。这样,shell不需要引用模块,而是引用模块会实现的一些接口。同样,模块不实现shell的类,而是允许调用的API接口。
这样在shell变化的时候减少了重新编译模块的次数。具体实现的变化频率往往会比接口本身的变化高得多,而只要接口稳定,就不需要重新编译所有的东西。
注意:需要使用extern(或者extern-library-path)选项来创建模块,这样可以自动剔除shell的类,因为模块是被加载到shell的子应用域中的,将shell的类剔除是安全的。这样模块可以真正直接引用shell中的类。