Tag Archive: ActionScript


给AS程序员的一点建议

最近做了一个AS网站的重构,发现了很多问题。我想这也是互动广告AS开发从业人员普遍存在的问题,有些想法不吐不快。

就互动广告这个行业来说,太多所谓“经验丰富”的AS Web开发者都是从AS2时代成长起来的,所以直到今天还保留着脚本语言的习惯。把以前的思路带到AS3来做开发是极其危险的。我们来看几个典型:

1.滥用全局。

AS2的_global是多好的东西啊,怎么AS3就没了呢?初级程序员还在抱怨,中级程序员二话不说噼里啪啦写出一个Global类,老子照用。高级程序员无语。

关于代码之间的依赖关系是个很长的话题,我在这里不展开说,只想提醒大家现在的AS3业界已经发展到了DI(反转注入)。如果你还是守着静态类或者单例,就难免有点跟不上潮流。这并不是说DI就是最好的,在小网站项目里也许根本用不上。但是一定要对自己代码中用到全局的地方好好做一下反思。也许级别的进阶就是从思考代码依赖的解决方法并且重构而开始的。

2.没有释放资源。

在AS2时代,一个空白帧就可以把时间线上的资源释放掉;一个unload操作之后你所加载的swf资源也全部清空。这些是脚本语言的便捷,也是跨入AS3编程的陷阱。我看到的一些程序员是完全没有释放资源的概念的,在他们的程序里根本找不到destroy()或dispose()等类似方法。没有正确的释放资源在网站开发这种天生就是模块化的程序里是致命的错误。大部分网站仍然能够正常运行是因为网站本身规模太小,以及没有无聊的人来回切换页面几十上百次。但这并不表示这个问题就能忽视,客户是不会开着资源管理器核对内存占用的,但是身为开发者必须这么做,而且必须更专业的去做(Profiler)。通常在析构方法里面的代码可能比构造函数还要长。可笑的是我依然看到很多“制作精良”的网站背后内存占用的飙升曲线。当你想借助AIR进军移动开发的时候,问题将会更加明显。这一刻我仿佛明白了乔布斯数落Flash的原因,可是技术本身并没有错,需要提升的,也许是开发者的质量。 View full article »

Workflow Refactoring

21号受邀到Razorfish上海公司做了一场主题为Workflow Refactoring分享会。主要内容是我之前总结的Workflow系列,并通过一个具体实例来演示整个过程。之所以用了重构这个字眼来引起程序员的注意,是因为很多情况下人们并不觉得要对自己既有的工作流程或者习惯做出改变。而重构的目的就是在保持结果一致的前提下,内部用更优雅更合理的方式来实现。

基本内容与旧版没有太大的改变。这大半年来用这套流程做了不少实践,做了一些规范上的调整。期间Flash和FDT都经历大的版本升级,相关的一些细节也要有所调整。所以重新更新了一下资料。此外在团队的实际推行中,针对设计师和程序员合作之间遇到得最多的问题也提出了更有针对性的解决方案。也明白了再优秀的流程也比不上前期规划+持续沟通的道理。

经验表示:

  • 多数Agency或Studio的团队已经开始用更专业的编辑器来开发代码,但是还没有遇到太多协作上的问题,或者说是没有对这些问题做出系统性的思考。这正是大家现有的工作流需要重构的地方。
  • 对于Flash网站,大多数情况下,用Gaia框架提供的功能就已经足够。Robotlegs带来的好处并不明显。
  • 使用JSFL和Ant进行自动化处理能够极大的提高工作效率,是这套方法的亮点,也是最受使用者欢迎的功能。

在Flash自带的ComboBox组件中,下拉列表部分是被加到主场景(Stage)上的。这就带来一些问题:比如ComboBox放在一个运动着的可视对象上,点开下拉列表后,这部分并不会跟随着父物体运动。如果父物体是三维层,下拉列表也不会继承上层的属性,这就会造成视觉上的问题。

下面的代码演示了一个不修改ComboBox源代码的前提下解决这个问题的小技巧。思路很简单:监听下拉列表的打开和关闭事件,动态改变dropdown对象的parent。

// cb is a ComboBox instance
 
cb.addEventListener(Event.OPEN, openHandler, false, 0, true);
cb.addEventListener(Event.CLOSE, closeHandler, false, 0, true);
 
private function openHandler(event : Event) : void
{
	// wait one frame
	addEventListener(Event.ENTER_FRAME, tick, false, 0, true);
}
 
private function closeHandler(event : Event) : void
{
	// hide dropdown
	cb.dropdown.visible = false;
 
	// add dropdown back to stage
	stage.addChild(cb.dropdown);
}
 
private function tick(event : Event) : void
{
	removeEventListener(Event.ENTER_FRAME, tick);
 
	// add dropdown to another parent
	someContainer.addChild(cb.dropdown);
	// reposition dropdown if needed
	cb.dropdown.move(cb.x, cb.y + cb.height);
	// show dropdown
	cb.dropdown.visible = true;
}

https://gist.github.com/721420

Powered by KevinCao.com ©2010 | Platform: WordPress | Theme: Motion
kevincao.com