授人以渔,而不是授人以鱼。如果你能坚持看完前面三篇(1,2,3)还没有晕菜,或者甚至还有些疑问想要深究一下的,那么这篇文章就是为你而写的——关于这个工作流程和开发框架的来龙去脉。
这个开发框架的建立来源于Jesse Warden的这篇文章。通过它让我看到了Gaia与Robotlegs相结合的可能性。一般的Agency/Studio网站用Gaia框架已经足够了。但是引入MVC模式能够让开发架构更为清晰,方便进行更复杂的大型团队开发。随后再引入AS3 Signals基本是必然的,因为这个信号机制比Flash自带的Event好得多,就算不用这套框架你也应该尝试一下。
问题主要集中在于Gaia Page的职责划分问题:Page应该是MVC中的那个角色?或者Page甚至应该是一个完整的MVC模块?
如果说按模块化开发的结构来考虑,每一个Page可以看作一个独立的模块。也就是说每一个Page都应该有一个独立的Module Context。但是很多情况下我们所做的网站开发没有那么大的复杂度。如果遵照这种划分思想,只会造成无谓的类增加,凭空增加了维护的难度。所以权衡之下,我不推荐这种做法。有兴趣的朋友可以看一下Robotlegs模块化开发的扩展。
于是我们回到只有一个Main Context的情况下来考虑。在这里,Page可以是一个View(视图),也可以是一个Mediator(中介)。
View full article »
本文是Flash网站工作流讨论的模式篇,没看过前两篇的朋友先要去补一下课:)
Design Patterns(设计模式),对从事Flash开发的人员相对而言是比较难的知识点。从早期的ActionScript脚本一路走过来的Flash工作者很少有系统地学过成熟的OOP开发思想。包括我自己在内也一直都是半知半解,所以太专业的理论我也说不上,就尽可能的挑些容易理解的来说明一下,希望能够对进阶的开发者有所帮助。
通过RobotGaiaAnt快速构建出的网站结构已经包含了基本的网站开发模板(src目录下),在进行开发之前你需要了解以下几点:
- 这个结构是基于Gaia+Robotlegs+AS3 Signals(lib目录下)建立的,你需要熟悉这些API。
- 代码按照MVCS模式来进行组织。如果你还不是很理解这种设计模式,可以翻看我之前写的这篇和这篇。对Robotlegs的机制还不是很了解的,推荐看看eidiot的这个文档,还有他翻译的中文最佳实践。
- 然后你需要了解的是每个部分的职责分别是什么,不同的代码应该写在什么模块中。具体的指导做法就下载我这份文档学习一下吧。

在MVC模式的具体实现中,另一个令人困扰的问题就是:如何处理各个对象之间的依赖关系。

Ricard Lord在Flex London User Group上的演讲清楚的描述了这个问题。
在DI(Dependency Injection 依赖注入)还没有被引入ActionScript框架开发中的年代,处理依赖关系的方法主要就是利用Singleton(单例)模式。这是一种被滥用得最多的模式。包括Adobe官方的MVC框架Cairngorm也是使用这种模式。
后来的PureMVC采用了Registry Pattern / Model Locator Pattern来代替单例,但是也没能从根本上解决问题。类中包含了冗余的代码去获取依赖,也使得单元测试变得困难。
ActionScript 3新增的反射机制让DI模式的实现成为可能,也让ActionScript开发框架的发展更接近于Java等成熟语言。Mate、Swiz、Parsley和后面要介绍的Robotlegs都使用了DI模式。
其实不论是Singleton,Registry还是DI,都是要解决OOP中的依赖问题。但只有DI模式通过语言的反射机制实现了运行时注入的功能,从而将编译时依赖转移到了运行时。
当前最流行的开发框架是Robotlegs,它在PureMVC的基础上修改而来,被业内誉为“正确的PureMVC”。Robotlegs通过SwiftSuspenders类库实现了基于自定义元数据(meta)的依赖注入功能,建立了MVCS(Model-View-Controller-Service)模式的基本构架。作者Shaun Smith在这篇文章中详述了框架设计背后的思想。
上篇文章介绍MVC基本概念的时候提到用Observer模式来实现松耦合。在上述几个ActionScript框架中,都用不同的方式实现了系统事件发送类的单例(Single Event Dispatcher):通过一个统一的事件发送者在MVC架构中的对象之间传递信息。
但是,由于ActionScript的事件机制并不完美,所以最近业内又开始流行使用Robert Penner开发的代替方案AS3 Signals。我曾经做过一番尝试:可以告别编写事件名常量和自定义事件的繁琐,可以将事件写入接口等特性给人的感觉果然比较直观。所以如果将来Robotlegs能够在事件机制上整合Signals那就更好了,比如这个。
至此MVC模式的介绍就告一段落,总结来说:MVC把GUI程序划分为Model Layer和Presetation Layer,设计了Model-View-Controller三大模块的职责和关联方式。在表现层根据不同的耦合关系又细分多种模式。MVC现在的发展趋势是用DI、Observer模式等方法来实现模块之间的松耦合。
最后一点题外话,Ricard Lord的演讲还提到了Framework和Toolkit的区别,主要就是是否需要继承框架里的基类。Toolkit比较灵活,无需更改对象的继承关系。Robotlegs就属于这种,所以已经有出现把Robotlegs和Gaia Framework结合在一起的尝试。