以下是我学习Flash一周以来对AS代码的一些理解,编码击规范的一些看法和对MVC框架的理解,学习过程中的一些笔记,很多地方都只是个人之见
第一部分:对AS的理解:
关于语法:
由于AS3是基于ECMAScript,语法上看起来跟Javascript很像,而OOP部分基本上是跟JAVA一致的。所以语法上学习起来比较简单。大概的说:
1.变量声明,函数声明像javascript
2.”事件处理提供了DOM3的事件模型,跟其它的WPF,HTML5的canvas也是基本一致的。
3.另外觉得比较有意思的是和javascript ,java,c#的一样也提供了遍历集合的语句foreach in... for in....但语法各不相同。
(事件流模型)
AS3在变量类型最大的特点是类型定义很简单,基本类型只有Boolean,int,uint,Number,String,另外Object类型是所有对象的基类,在AS3中,“一切皆是对象”。对于JAVA,一些值类型是直接存储值,而AS3中,值类型也是存储引用,这点跟C#更像,所以AS3是一种更纯粹的面向对象语言。但是要注意的是值类型是一种不变对象,每次修改都会导致新变量的产生和旧变量的销毁,这样的优点在于减小引用消耗和支持重复引用,但修改的消耗变大。值类型包括Boolean,int,uint,Number,String。
另一个很明显的特点是AS3支持的字符串,集合操作非常丰富。主要涉及到String类,Array类。像插入的三种方法:push unshift splice 删除的三种方法:pop shift splice(1,2) ;排序的三种方式:默认,排序方(array常量),排序函数;查询的几种方法:concat,join,slice,tostring等
数组的使用,觉得有几点需要注意
1.各方法的返回值,有些返回被作用元素的索引,有些返回一个被作用元素的数组,有些返回被作用元素的个数;
2.注意delete方法是把元素的位置设为undefined,所以数组的长度不会变。
3.在用于哈希数组时多用Dictionary类,少用Object.(Object的Key类型只能是字符串,而Dictionary的Key类型可是是对象 ),当要删除某条纪录时,把相应的键设为NULL,就能被能垃圾回收。
4.掌握用ByteArray对象来进行集合深复制的方法。可以写一个叫clone的函数:
function clone(source:Object):*
{
var myBA:ByteArray=new ByteArray();
myBA.writeObject(source);
myBA.position=0;
return(myBA.readObject());
}
关于类型转换:我们知道,类型转换可以是隐式的,也可以是显式的。在显式转换中,AS3没有像C#一样定义很多转换工具类(Parse类,Convert类)和JAVA把转换函数定义到类型对象的方法中,如(Integer.parseint),直接使用强制的转换方法,当强制转换不成功时设置默认值,而不是抛出异常。另外还可以用Number() 来转换看上去像浮点数的字符串。
参数传递也跟JAVA类似,可以设置默认值,传递数组参数用“...”关键字。
总的来说,AS3的在类型和类型转换的处理上都比JAVA,C#更加简洁。
关于运行机制:
AS3代码要先编译成ABC文件(字节码),放到二进制容器SWF文件中被Flash Player运行。
AS的垃圾回收机制:AS3的垃圾回收有两种方式,一是通过引用计数器,对所有引用数为0的对象进行回收。二是标记+清理模式,从对象树的根节点开始遍历并作标记,没有被标记的对象会被回收。后者的开销更大,但可以用来解决循环引用的问题。而弱引用就是当你为某个对象创建一个引用时,该引用不会影响引用计数器的值,因此即使你不对该引用置空,对象仍然可以被回收(只要该对象身上没有任何强引用)。在AS3中有两个地方可以使用弱引用机制,一是添加监听器时,二是使用Dictionary对象。如下面的代码:
btn.addEventListener(MouseEvent.CLICK, btnClick, false, 0, true);
最后一个参数表示是否采用弱引用,默认为false.采用强引用能防止被垃圾回收机制回收。实际上,提高性能最好的方法是当资源不需要时,用removeEventListener删除所以加上display object上的监听器,再手动的删除掉之前加上去的所有display object。
删除变量:不再需要变量时,请删除变量或将变量设置为 null。这样做可以标记数据,以便进行垃圾回收。删除变量有助于在运行期间优化内存使用情况,因为从 SWF 文件中删除了不需要的资源。删除变量比将变量设置为 null 更好。
理解flash play绘图的底层:
渲染机制 :理解Flash Player的渲染和代码执行机制也是十分重要的。当你执行了改变界面的指令时,Flash Player并不是立刻把你要的内容显示在屏幕上,它根据一定的周期来刷新屏幕,而代码的执行则是另一回事。这和Java正相反,Java总是等待程序主动告诉它什么时候重绘屏幕。
使用工具:另外,可以使用flash player debug版来观察页面重绘的情况,一般重绘越频繁,面积越大,性能就越差。打开“显示重绘区域”的功能,很容易看出当前重绘的情况。有的时候有些性能问题是觉察不出的,如被设成visible却不断重绘的DisplayObject,这时就需要借助调试工具来查看了。
关于OOP:OOP是一个需要长期学习的过程,我觉得最好的方法是看设计模式,从设计模式的例子上来学习OOP。
1.as3语言中,函数也可以以一种变量的方式存在,所以在类中声明实例方法也可以使用var 方法名:Fuction=function(参数){} 的方式。这样灵活的方式有利于在运行时动态的替换方法的函数体。
2.as3中没有枚举类型,我们可以利用静态属性来模拟枚举类型,静态属性和静态方法在高级的OOP设计中经常用到,比如像工厂模式,单例模式,可以利用这个特征来编码项目中的工具类,管理一些静态常量等。
3.包外类,有点类似于JAVA的内部类,只不过放置的位置不同,但要实现的东西是一样的,都是给主类调用。注意包外类是对外不可见的,因为每个as
文件编译成一个单元,而每一个单元对外只有一个类。
4.getter和setter方法。这很符合C#的语言风格,可以封装于无形,更符合客观思维。实际上,getter,setter方法可以关联多个属性,也可以一个属性都不关联,是一种非常灵活的对外访问接口。
另外像接口,抽象类,继承,重写这些概念基本上与JAVA一致。
关于核心类:
在AS3开发中,有几个方面是经常用到的,如日期和时间处理,正则表达式,XML处理,显示编程,文本位图视频音频,网络通信,这些都是一门开发语言必备的功能。
日期和时间处理:Date类提供日期处理,Timer类提供计时器功能
正则表达式:与之相关的有String类的四个函数 match replace split search,RegExp类的test,exec方法。AS语言的正则表达也一些自身的特色,可以在匹配字符串的后面添加一些标识字符,像指示“是否忽略大小写”等。
核心显示类:区分sprite类与MoveClip
Sprite — Sprite 对象可以包含它自己的图形,还可以包含子显示对象。(Sprite 类用于扩展 DisplayObjectContainer 类) MovieClip — MovieClip 对象是在 Flash 创作工具中创建的 ActionScript 形式的影片剪辑元件。实际上,MovieClip 与 Sprite 对象类似,不同的是它还有一个时间轴。
第二部分:编码规范
AS3的编码规范和JAVA基本是一致的。参照了于AS3的编码规范官方的文档:
http://blog.dclick.com.br/wp-content/uploads/adobe-flex-coding-guidelines-v12-english.pdf
提几点小意见:
1.除非声音的变量在循环中,不然局部变量应该在所属块中声明。
2.注释:对于公有调用部分,采用原文档里的方法,如果是非公用的,可以只是普通注释“//”,提高效率。
3.排版:在注释前一行应为空行
4.命名:Boolean变量最好以can ,is,has等作为前缀来命名。
6.保留字:
第三部分:关于MVC框架
关于MVC:MVC框架的始祖是Struts,现在在Web项目开发中应用非常广,它的优点就不多说了。
问题一:AS3是否需要MVC,AS开发模式有下面几个特点
1.AS3是单一语言环境,多层代码混在一起问题没那么严重。
2.AS3正常情况都是一次性编译全部代码,即使用了MVC框架还是需要一起编译。单独编译一个模块减少编译时间有别的办法,不需要依赖MVC。
3.AS3本身的事件和动态特性和一些框架的功能重复。
4.AS3目前的框架还很不成熟。
由于一个项目通常不是一个完成的,在多人合作的情况下,只是单一个使用MVC框架,会使得其它项目成员的学习成本增加,协作不方便,造成不必要的麻烦,毕竟现在的AS3 MVC框架还没得到广泛认同和使用,所以我觉得应该使用纯粹的AS语句来编写项目。
实际上,MVC也只是一个软件架构的方法而已,并不一定需要一个第三方的框架来支持。框架的灵魂在于三层架构的模型图。像JAVA的struts.xwork,到后来的Stuts2等Web框架,都只是架好了这个模型,并在各层之间提供一个明确统一的通道来进行通信,仿佛就是一个对象在三层之间的流动。MVC框架的的控制部分大都使用xml配置文件来实现,如struts2的struts.xml,asp.net mvc的web.config。可很有利于团队开发,例如一个struts2的Web项目,架构师可以在项目设计阶段写好控制部分,通过struts.xml文件配置来对于各个ACTION请求的模型,以及对于各个请求的返回结果的跳转的视图,这样整个开发过程会极其的规范,以后也好维护。
实际上MVC应该是一种思想,而不是一定要和框架挂钩,将模型和视图的代码分开,并提出控制器的代码,然后互相调用各自方法就是一个简单的MVC架构。
如下简单例子:
var myData:String="lincoln";
var textFiled: TextField=new TextField();
public function MVCSample()
{
textFiled.addEventListener(MouseEvent.CLICK,clickHandler,false,0,false);
addChild(textFiled);
}
public function clickHandler(event:MouseEvent):void
{
show();
}
public function show():void
{
this.textFiled.text=myData;
}
如果要改写成MVC模式,则类的设计大概如下:
public class M
{
public static var myData:String="lincoln";
}
public class V extends Sprite
{
var textFiled: TextField=new TextField();
public function V():void
{
this.textFiled.addEventListener(MouseEvent.CLICK,C.clickHandler);
}
public static function show():void
{
this.textFiled.text=M.myData;
}
}
public class C
{
public static function clickHandler(event:MouseEvent):void
{
V.show();
}
}
Model的全部引用放在固定的位置,View的引用使用静态属性储存或者用管理类管理,Controler可以作为函数或者类直接初始化并执行,亦可以通过反射。这并不需要专门的工具类来辅助,附加成本也比较小,自然就可以适用于任何规模的项目。
在众多的AS3 MVC框架中,pureMVC和Cairngorm是两个较早出现的框架,已经有点过时。看网上比较推荐的是Robotlegs框架,拥有了控制反转和依赖注入,包装了大部分功能,配置代码大大减少。还有一款简洁,轻量级的MVC框架,WeeMVC我测试官网的两个例子,感觉三层分得很清楚,用起来很方便。不过都只是简单了解,以后要用到再学。
对AS3的学习现在还比较浅,很多重要的概念还没完全搞清楚,像异常处理,命名空间,Flash Player的安全机制等,没写进来,AS代码量也比较少,下周再继续努力。
参考文献:
ActionSciprt3 API文档http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package-summary.html
《Flash.ActionScript3.殿堂之路》