`
hereson
  • 浏览: 1458406 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

创建模块化应用程序

    博客分类:
  • flex
阅读更多
如果你没有看过Roger Gonzalez的Blog中关于模块(Module)的文章,那么你应该去那里了解一下Flex 2这个特性背后的细节和想法。这里我不想过多地探讨为什么要这样,而是想要给大家展示一个使用了模块(Module)的简单的Flex程序,你可以从中获得启示。

示例源码

你可以下载关于这个例子的压缩文件:点击这里下载。

模块(Modules)

模 块(Module)是创建大型Flex应用程序的一个解决方案,它允许你将你的用户接口分割成许多分散的有各自用途的小块。例如(下面出自Flex 2的文档),一个保险公司可能有数百个表单——针对于各个领域的,针对各种请求类型,以及针对各种应用等等。创建一个包含所有这些表单的Flex应用程序 将会产生一个巨大SWF文件,还会有不少问题:
   •应用程序越大开发过程越复杂;
   •应用程序越大测试过程越复杂;
   •应用程序越大部署过程越复杂;
   •SWF文件越大加载时间越长

我的示例程序基于Flex 2文档中的一个程序,但是我将它做了一些更改来说明几个常见的问题。这个例子展示了一个主程序和其它三个共享公有数据的模块(Module)。

其 中一个设计要素是一个接口的使用,这个接口实质上是接口实现者和使用者之间的一个契约。这个例子将会说明我所说的意思。模块(Module)的接口部分虽 然不是必须的但是却可以大大简化以后的开发和维护。比如,如果开发人员有一个小组负责报告部分,另一个小组负责图表部分,如果它们一开始用了接口,那么只 要有需要,接口的实现就可以做足够多的变形而不会影响到工程结果。接口在模块(Module)中还扮演另外一个角色,我在下文中将会揭示这点。

模块(Module)是以<mx:Module>代替<mx:Application>作为根标签的MXML文件(或ActionScript文件)。你可以将带有<mx:Module>标签的作为一个程序来看,但是它不能运行。

这个示例有一个主程序文件以及带有一个接口的两个模块。打开主程序文件你会看到:


程序代码<mx:Panel x="10" y="41" width="169" height="500" layout="absolute" title="Modules">
       <mx:Text x="10" y="24" text="Check a module to load it; uncheck to unload it" width="129"/>
       <mx:RadioButton x="10" y="97" label="None" selected="true"
                           click="removeModule()"/>
       <mx:RadioButton x="10" y="123" label="Chart"
                         click="removeModule();loadModule('ChartModule.swf')"/>
       <mx:RadioButton x="10" y="175" label="Table"
                         click="removeModule();loadModule('GridModule.swf')"/>
</mx:Panel>

<mx:Panel x="187" y="41" width="500" height="500" layout="absolute" title="Module: {moduleName}">
       <mx:ModuleLoader id="currentModule" ready="readyModule(event)"
                       width="100%" height="100%" />
</mx:Panel>

第 一个Panel包含了控制示例中模块(Module)加载和卸载的RadioButtons。第二个Panel是使用<mx: ModuleLoader>标签加载模块(Module)的地方。注意那个id为currentModule的ModuleLoader,它有一个 关于ready事件的事件处理器。当模块SWF文件加载了足够多可以开始使用的时候,ModuleLoader 就会分派ready事件(或者说ModuleEvent.READY)。

这里有一个readyModule函数,它在<mx:Script>块中:


程序代码private function readyModule( event:ModuleEvent ) : void
{
       var ml:ModuleLoader = event.target as ModuleLoader;

      var ichild:IExpenseReport = ml.child as IExpenseReport;
       if( ichild != null ) {
               ichild.expenseReport = expenses;
       }
}

注 意ModuleLoader的child属性是如何转换为IExpenseReport类的。IExpenseReport是一个所有模块 (Module)都实现了的接口。只要每个模块都实现了这个接口,它就可以很容易适应于应用程序。换句话说,想象一下当你需要创建另一个表单或者报告的时 候它的用途。并不需要更改主程序为新模块添加IF语句,你只要在新模块中实现IExpenseReport接口它就可以在程序中完美地运行。

IExpenseReport接口是:


程序代码public interface IExpenseReport
{
       function set expenseReport( ac:ArrayCollection ) : void;
}

每个模块(Module)都实现这个接口,定义各自的名为expenseReport的set函数。下面是ChartModule的根标签和接口IExpenseReport的实现:


程序代码<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" implements="IExpenseReport"
             layout="vertical"
             percentWidth="100" percentHeight="100" >
     <mx:Script><![CDATA[
           import mx.collections.ArrayCollection;
           [Bindable] public var expenses:ArrayCollection;

           public function set expenseReport( ac:ArrayCollection ) : void
           {
                 expenses = ac;
             }
     ]]></mx:Script>
...
</mx:Module>

让我们回到主程序,RadioButton的click事件会卸载任何当前已加载的模块然后加载一个新的模块。下面是ChartModule的RadioButton标签:


程序代码<mx:RadioButton x="10" y="123" label="Chart" click="readyModule('ChartModule.swf')"/>

这个click事件会调用上面列出的readyModule事件。

编译并运行程序

如果你使用了Flex Builder 2,请确定更改了项目的Properties将模块(Module)作为"Applications"包含进来。这样Flex Builder 2回将它们编译进SWF文件并且放进bin文件夹中。

Flex Builder注意:要创建一个使用模块(Module)的工程,请使用工程的Properties将模块文件作为"Applications"。这会使得他们被编译进SWF文件。

一旦SWF文件被创建你就可以运行主程序并点击RadioButtons在模块(Module)之间切换。

Flex Builder注意:Flex Builder并不会保存任何关于模块(Module)和主程序的从属信息。只要你对一个模块(Module)作了更改,你就可能需要重新编译主程序或其它从属的模块(Module)。

将SWF文件最优化

如果你查看一下主程序的SWF文件和模块(Module)的SWF文件的话,你会发现它们的大小差不多。这就说明,模块的SWF和主程序SWF中有很多同样的组件定义。

Flash Player并不会保存元件(symbol)的副本。例如,如果主程序有一个Button组件而一个模块(Module)也有一个Button组件,Flash Player就不会从模块中加载Button了,因为它已经在主程序中有定义了。

使用-link-report=report.xml编译主程序,这样会创建一个链接到主程序的包含所有元件信息的文件。然后在编译模块(Module)的时候会使用那个report.xml文件。


程序代码mxmlc -load-externs=report.xml ChartModule.mxml

当ChartModule 被编译的时候,所有在report.xml文件中列出的元件将会在它的SWF中省略。当我不使用report.xml文件编译 ChartModule.swf的时候,它的大小是202K。而当我使用report.xml文件的时候,SWF的大小只有68K。这大大减少了模块 (Module)的加载时间。

在文章的开始将到模块(Module)的时候,我提过接口有另一个作用。假设你没有使用接口而是在主程序中 引用模块的类。当你运行link-report的时候,你的模块类将会出现在report.xml中。当你使用使用link-report编译模块 (Module)的时候你的模块并不会包含在它自己的SWF中!起初这并不会成为一个问题,尽管主程序由于包含了模块的定义而变得很大。然而,当你更改你 的模块的时候发生了什么才是重要的。如果你没有重新编译主程序,你主程序的SWF文件将会包含模块(Module)旧的定义——而不是你已经更改过的。


程序代码mxmlc -link-report=report.xml Main.mxml
mxmlc -load-externs=report.xml ChartModule.mxml
// etc.

如果你决定使用这个技术来减小模块(Module)的大小,那么就使用接口来确保终端用户使用的总是模块(Module)的最新版本。

Flex Builder注意:Flex Builder在一个工程里没有办法做到这些。如果你确定你将要创建一个使用模块(Module)的工程,可以考虑一下将公共的类和接口(包括event 类)放到一个SWC(Flex Library Project)中然后将模块(Module)分离到它们各自的工程里。

或者,你可以将所有东西创建为一个单一的Flex工程,然后将最优化作为一个产品化前或测试前的部署步骤在Flex Builder之外进行。

总结

•将程序分割成多块并不是每个人都会使用模块(Module)。使用这种方法主程序会比平常小,而且多数用户只使用整个程序的一部分。
•使用接口来使主程序或模块(Module)来与加载的模块通信。这使维护变得容易。
•使用-link-report命令参数编译主程序来产生一个使用元件列表。
•在主程序中使用-load-externs和report.xml编译模块(Module),这样可以使它们变得更小。
分享到:
评论

相关推荐

    badass-jlink-plugin:创建模块化应用程序的自定义运行时映像

    使用此Gradle插件,即使它依赖于自动模块,您也可以毫不费力地创建模块化应用程序的自定义运行时映像。 该插件还允许您使用Java 14中引入的工具创建应用程序安装程序(有关用法示例,请参见 )。 :light_bulb: ...

    十三、模块化程序设计.pdf

    这需要读者了解并应用AVR单片机的编程接口,因为AVR单片机广泛用于嵌入式系统开发,并且是实现模块化设计的常用平台。 此外,考虑到内容的来源提示,文档内容可能来自于豆丁网,并通过某种下载器生成。由于OCR技术...

    Flex 模块化应用程序开发

    ### Flex 模块化应用程序开发 模块化设计在软件工程领域有着重要的意义,尤其是在像Flex这样的框架中。Flex是一款由Adobe公司开发的开源框架,用于构建高性能、具有丰富交互性的Web应用程序。通过采用模块化的开发...

    OSGI in Action

    OSGI in Action是一本深入讲解OSGI技术的权威指南,它不仅向读者介绍了OSGI的核心概念,还通过实际案例展示了如何在Java中创建模块化应用程序。本书不仅适合初学者入门,也适合有一定基础的开发者深入实践和应用OSGI...

    Python_Vizro是一个用于创建模块化数据可视化应用程序的工具包.zip

    Python_Vizro是一个创新的工具包,专门设计用于构建模块化的数据可视化应用程序。这个库的目标是简化数据可视化的流程,让开发者能够轻松地创建交互式图表和仪表盘,而无需深入学习复杂的图形库。Vizro的核心优势...

    单片机C语言程序模块化

    单片机C语言程序模块化是编程中一种高效且易于维护的方法。在单片机开发中,由于资源有限,合理地组织代码结构显得尤为重要。模块化编程能够将复杂的问题分解成若干个相对独立、功能单一的模块,每个模块对应一个...

    模块化程序库_091119

    模块化程序库是一种高效、可复用且易于维护的软件开发方法。在编程领域,模块化是将大型复杂系统分解成一系列独立的、可管理的小部分,每个...通过有效的模块化设计,开发者可以构建出更加灵活、可扩展的大型应用系统。

    易语言xp风格化应用程序源码,易语言xp风格化应用程序模块

    本文将深入探讨“易语言xp风格化应用程序模块源码”,以及如何利用这些源码创建具有XP风格的应用程序。 XP风格,全称为Windows XP Style,是微软在Windows XP操作系统中引入的一种用户界面设计风格。这种风格以其...

    模块化的设备驱动程序设计方法

    ### 模块化的设备驱动程序设计方法 #### 一、概述 随着计算机技术的发展,操作系统在不断进化,其中Windows NT/2K因其图形用户界面友好、操作简便等优点,在测控软件领域得到了广泛应用,逐渐取代了传统的DOS操作...

    Java应用架构设计模块化模式与OSGi

    首先,模块化模式是一种组织软件的方式,它将复杂的应用程序分解为一组独立的、可重用的组件,每个组件都有明确的职责和边界。这种模式有助于降低代码的耦合度,提高代码的可读性和可维护性。在Java中,Jigsaw项目...

    ModularizationExample,易于理解的模块化android应用程序的真实示例.zip

    "ModularizationExample" 是一个开源项目,专注于展示如何在Android应用程序中实现清晰且易于理解的模块化。通过分析这个项目,我们可以学习到以下关键知识点: 1. **模块化概念**:模块化是将应用程序分解为独立的...

    一款利用 JDK 模块化的特性帮你把 jar 打包成独立 exe 的工具,它支持 GUI 和控制台应用程序的创建

    这个工具充分利用了JDK的模块化特性,使得Java应用能够在无需JRE(Java Runtime Environment)的情况下运行,提高了应用程序的分发便利性和用户友好性。下面将详细介绍ExeBuilder的工作原理、主要功能以及如何使用。...

    OSGi与Equinox 创建高度模块化的Java系统 第5章 源码

    OSGi(Open Services Gateway Initiative)是一种开放标准,用于创建可模块化的Java应用程序。它通过将应用程序分解为独立的模块或服务,提供了动态发现、加载、卸载和更新这些模块的能力,极大地增强了软件的灵活性...

    Express应用程序生成器 以及路由模块化.zip

    本资料包“Express应用程序生成器 以及路由模块化.zip”主要关注两个核心概念:Express应用程序生成器和路由模块化。这两个概念是构建高效、可维护的Node.js服务器端应用的关键。 首先,我们来探讨Express应用程序...

    模块化编程编写时钟程序.rar

    在这个“模块化编程编写时钟程序”的示例中,我们将探讨如何通过模块化方法来设计一个时钟应用程序。这个程序可能包含多个独立的模块,每个模块负责特定的功能,如时间的获取、显示或处理。 首先,让我们理解什么是...

    章-Access模块和应用程序设计(与“模块”有关文档共34张).pptx

    Access模块和应用程序设计是数据库管理系统Access的重要组成部分,它涉及到使用VBA(Visual Basic for Applications)进行编程,以实现更高级的功能和定制化操作。在Access中,模块是存储和组织VBA代码的主要方式,...

    小程序模块化开发——模块.zip

    本文将深入探讨小程序的模块化开发技术,帮助开发者更高效、有序地构建小程序项目。 模块化开发是现代软件工程中一个核心的概念,它允许我们将大型项目分解为可复用、独立的小单元,即模块。每个模块都有自己的功能...

    badass-runtime-plugin:创建非模块化应用程序的自定义运行时映像

    Badass运行时插件使用此Gradle插件,您可以为非模块化应用程序创建自定义运行时映像。 该插件还允许您使用Java 14中引入的工具创建应用程序安装程序。 :light_bulb: 对于模块化应用程序,请使用。 该插件提供了一些...

    laravel-starter:使用Laravel 8.x构建的类似CMS的模块化启动程序应用程序项目

    它是模块化的,因此您可以将该项目用作基础并构建自己的模块。 您可以在任何基于Laravel Starter的项目中使用相同的模块。 定期添加新功能。 请让我知道您的反馈和意见。演示版检查以下演示项目。 这只是项目的直接...

Global site tag (gtag.js) - Google Analytics