Online Book Reader

Home Category

Beautiful RIA [11]

By Root 406 0
提供了大量的组件和技术库来让 Web开发更加轻松——它提供的强大工具要远远超 过传统 Web 2.0中的异步 JavaScript和 XML(Ajax)应用。此外,Adobe公司最近发布的 Adobe Flash Builder 4 beta(以前叫 Adobe Flex Builder)中提供了许多新的和改进的工具,他们可以 用来开发大规模的 Flex应用程序。Flash Builder 4着重于提高开发人员的生产力以及设计人 员和开发人员的工作流。

Flex 开发中的关键要素之一是使用模块和运行时共享库(Runtime Shared Libraries,RSLs), 这些模块和库可以方便系统不同部分的并行开发以及客户端上高效的内存管理等等。另外一 个关键要素是使用 Sprint BlazeDS集成,它大大简化了后台不同技术服务器端的开发和集成, 如使用 Java消息服务(JMS)和 Spring安全进行的通信。

以下是 Flex开发中的一些关键要素:

 利用 Flex的不同之处。了解为什么 Flex开发与传统 Web开发有所不同,并利用那些不 同之处让应用程序从中获益。

 Flex模块。了解 Flex模块以及怎样模块化 Flex开发和部署。使用 Flex模块来解耦项目中 的不同层次。

 了解反模式和模式。 预先了解正确的应用程序反模式,这样你可以按照正确的架构模 式实现优秀的设计。

 使用 Spring BlazeDS集成项目简化开发。使用 Spring BlazeDS 集成项目简化 Java服务器 集成。

 有效地设计。与设计团队紧密合作,充分利用 Flex和 Adobe Flash的优势。

 测试. 预先计划测试。

高效率的超大规模 Flex开发

是什么让 Web开发与 Flex有所不同?

与传统 Web应用程序不同,Flex应用程序开发更像传统的桌面应用开发。例如,整个应用 程序会被下载到客户端——这是一个庞大的下载,而且取决于应用程序如何组织。当然,有 许多方法可以优化这个过程,例如使用组件库或将工程分解成各个模块。

这套方法与传统的超文本标记语言( Hypertext Markup Language,HTML)编写的应用程序不 一样——即使它是用 Ajax开发的。一个 HTML的 Web站点通常可以划分成不同的页面,以 使得下载量非常小。并且即使使用 Ajax,下载量还是相对较小,因为大部分 Ajax库本身就 相对较小。使用这种方法可以让单个页面的下载量比整个应用程序更小。

Flex 与传统 Web应用程序开发的另外一个不同之处在于,状态主要在客户端上维护。这超 出了在 Web应用程序上使用 Ajax控件,因为后者一般只在 Web浏览器上维护少量的客户端 状态。而现在,应用程序中的所有状态都在局部变量中进行维护。

如果你还不太熟悉 Flex的话,另外一个不同之处可能对于你来说是一个挑战。Flex使用了一 个高度的事件驱动编程风格,主要原因是 Adobe Flash Player是单线程的,因此任何需要长 时间运行的调用都需要注册一个回调函数。单线程对于图形化用户界面(GUI)开发来说是 有利的,因为它不存在死锁或者一个线程窃取所有 CPU周期,从而保持了 GUI的响应。单 线程还使得开发更加简单,因为你不需要处理多线程编程。(还记得在 Swing中处理线程的 噩梦吗?)

Flex 中用以处理事件的主要机制是函数指针,或者作为函数参数进行传递的闭包。这些指针 可以是用户为了某个异步事件结束时发生的事件或者提醒而注册的。(函数指针对于 Java程 序员来说很有挑战,因为核心 Java语言还不支持闭包。)

Flex模块至关重要

Flex提供了一些选项可以将应用程序划分成模块,包括创建库以及主应用程序的子模块。通 过将项目设计成层次化的形式,开发和编译都可以在单个的分支中进行。

模块化 Flex项目的主要好处在于,这么做可以优化客户端上下载和启动的时间。应用程序 的一小部分可以预先下载到客户端,而剩下的部分可以在后端按需很进行加载。此外,模块 还可以被加载和卸载,以减少客户端上的内存占用量。

模块化 Flex项目的另一个主要好处是,它可以让开发过程更容易模块化。它允许开发人员

高效率的超大规模 Flex开发

在不同的模块和库上进行工作以避免开发团队的死锁发生。

然而构建大型 Flex应用程序的一个挑战之处在于,编译过程所花的时间要比大部分程序员 熟悉的 Java编译时间要慢很多。重新编译一个大型 Flex应用程序可以花上好几分钟。想要 优化这个过程,你可以创建分离的库并且只编译你当前工作的应用程序部分。

SWC文件形式的库。SWC是 Flex中使用的主要存档格式,它有点类似于 Java一种方法是采用

中的 Java存档(JAR)文件。你可以使用 SWC档案来完成一些工作:

 组件库。 组件库是一个 SWC文件,它包含 Flex应用程序中使用的类和其他资源。

 主题。主题定义了应用程序的观感。它包含主题所需的资源(例如图片文件和字体), 以及定义这些资源如何被使用在应用程序中的层叠样式表(Cascading Style Sheet,CSS)。

 资源包。这些都是本地化的属性文件和 Adobe ActionScript类集。

有两种方法可以在项目中添加 SWC文件:要么静态地连接它们,这种情况下它们会编译进 你的项目;要么把它们当做运行时共享库(RSL,Runtime Shared Library)来使用。使用多 个 RSL的好处在于它们可以被分开下载和缓存到客户端上。此外,如果客户端有多个模块的 话,它们还可以共享同样的 RSL。

你还可以将主应用程序进行模块化。一种方式是采用 Flex模块;另一种是使用子应用程序。 子应用程序的好处在于它们独立于主应用程序进行开发和测试。

注意当编译模块和库时, Flex并不像 Java一样层次地遍历整个树。相反它只编译链接到主应 用程序中的部分。这种方式会使得模块和库的开发非常微妙,因为你可能注意不到某个文件 被链入了。当进行库开发的时候,有必要定义哪些文件会被包含。

库具有相对直接的可被利用的优势。本质上你是向 Flex模块管理器传递了想要加载模块的 URL。

protected function getModuleFromServer(url:String, onSuccess:Function) :void {

var module:IModuleInfo = ModuleManager.getModule(url);

module.addEventListener(ModuleEvent.READY, loadModuleSuccessHandler); module.load();

}

public function loadModuleSuccessHandler(moduleEvent:ModuleEvent) :void { var module:IModuleInfo = moduleEvent.module;

.... handle initializing the module

}

高效率的超大规模 Flex开发

像这样进行模块加载的有趣之处在于你可以指定另一个 URL来加载这个模块——例如,在某 个故障情况下,客户端丢失了与主服务器的连接。这时客户端可以继续从另外一个 URL中 加载模块,以维护重要的业务功能。

让应用程序轻松地开发和测试

通过适当地激活 View栈(Stack),你可以用单个 URL轻松地访问应用程序的任何点——这 一功能拥有超越单纯可用性上的优势。除此之外它还使得应用程序上的工作变得很轻松。一 个常见的错误发生在你改动部分应用程序,而这个应用程序需要在好几个屏幕和样式中进行 导航。如果你不得不为每一处改动而手工进行导航时,这个过程将非常耗时。取而代之,我 们可以使用一个固定的 URL来访问应用程序的不同部分,这将大大减轻开发中的痛苦并且 加速整个过程。相同的模式同样可以让应用程序变得很容易测试,因为应用程序单个部分可 以通过 URL来访问和测试。

在 Flex中,有两种方法可以将视图栈构建到应用程序中。一种方法是使用状态(states), 而 另一种方法则是使用一个 ViewStack组 件(ViewStack.mxml)。视图栈只是用来显示对象的栈: 这些对象可以是一个包装简单的表格或是一个复杂组件的画布(canvas)。使用视图栈的好 处在于你可以通过在代码中设置当前的子组件来轻松的操作它们。例如

myViewStack.selectedChild=accountInfo将会设置视图栈去显示 accoutInfo视图。这个功能可 以让你在测试和开发中轻松地操作视图栈。

客户端架构:反模式

在软件编程中,会有一个通用的范式来定义软件开发中的反模式和模式。模式是解决常见问 题的重复解决方案;反模式则是不熟悉语言的程序员最会发生的常见错误。定义好 Flex中 的模式和反模式后,我将会展示一些新手 Flex程序员常犯的错误,然后再展示一些 Flex编 程开发的最佳实践。

这些实践可以帮助项目在增长为大规模的过程中,避免常见的错误。第一个通用的反模式是 将所有的 MXML视图放在根包中。这么做的好处不是很明显,因为你可以将 MXML文件放 入到包中,并且通过它们的名字空间(由于实际的包的名字可能没有在文件中指定)进行引 用。其实 MXML文件是根据其所在的目录结构来放入包当中的。因此将 MXML文件放入到 根包中等价于不将它们放入任何包中,这样做会使一个大型项目变得一团糟。

举一个例子,Flex商店示例不仅将主应用程序文件放入到根包中,还将主页,

Return Main Page Previous Page Next Page

®Online Book Reader