<Flash入门>对AS语言的一些理解

以下是我学习Flash一周以来对AS代码的一些理解,编码击规范的一些看法和对MVC框架的理解,学习过程中的一些笔记,很多地方都只是个人之见

第一部分:对AS的理解:

关于语法:

由于AS3是基于ECMAScript,语法上看起来跟Javascript很像,而OOP部分基本上是跟JAVA一致的。所以语法上学习起来比较简单。大概的说:

1.变量声明,函数声明像javascript

2.事件处理提供了DOM3的事件模型,跟其它的WPFHTML5canvas也是基本一致的。

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.(ObjectKey类型只能是字符串,而DictionaryKey类型可是是对象 ),当要删除某条纪录时,把相应的键设为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,这时就需要借助调试工具来查看了。

关于OOPOOP是一个需要长期学习的过程,我觉得最好的方法是看设计模式,从设计模式的例子上来学习OOP

1.as3语言中,函数也可以以一种变量的方式存在,所以在类中声明实例方法也可以使用var 方法名:Fuction=function(参数){} 的方式。这样灵活的方式有利于在运行时动态的替换方法的函数体。

2.as3中没有枚举类型,我们可以利用静态属性来模拟枚举类型,静态属性和静态方法在高级的OOP设计中经常用到,比如像工厂模式,单例模式,可以利用这个特征来编码项目中的工具类,管理一些静态常量等。

3.包外类,有点类似于JAVA的内部类,只不过放置的位置不同,但要实现的东西是一样的,都是给主类调用。注意包外类是对外不可见的,因为每个as

文件编译成一个单元,而每一个单元对外只有一个类。

4.gettersetter方法。这很符合C#的语言风格,可以封装于无形,更符合客观思维。实际上,getter,setter方法可以关联多个属性,也可以一个属性都不关联,是一种非常灵活的对外访问接口。

另外像接口,抽象类,继承,重写这些概念基本上与JAVA一致。

关于核心类:

AS3开发中,有几个方面是经常用到的,如日期和时间处理,正则表达式,XML处理,显示编程,文本位图视频音频,网络通信,这些都是一门开发语言必备的功能。

日期和时间处理:Date类提供日期处理,Timer类提供计时器功能

正则表达式:与之相关的有String类的四个函数 match replace split searchRegExp类的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框架

关于MVCMVC框架的始祖是Struts,现在在Web项目开发中应用非常广,它的优点就不多说了。

问题一:AS3是否需要MVCAS开发模式有下面几个特点

1.AS3是单一语言环境,多层代码混在一起问题没那么严重。

2.AS3正常情况都是一次性编译全部代码,即使用了MVC框架还是需要一起编译。单独编译一个模块减少编译时间有别的办法,不需要依赖MVC

3.AS3本身的事件和动态特性和一些框架的功能重复。

4.AS3目前的框架还很不成熟。

由于一个项目通常不是一个完成的,在多人合作的情况下,只是单一个使用MVC框架,会使得其它项目成员的学习成本增加,协作不方便,造成不必要的麻烦,毕竟现在的AS3 MVC框架还没得到广泛认同和使用,所以我觉得应该使用纯粹的AS语句来编写项目。

实际上,MVC也只是一个软件架构的方法而已,并不一定需要一个第三方的框架来支持。框架的灵魂在于三层架构的模型图。像JAVAstruts.xwork,到后来的Stuts2Web框架,都只是架好了这个模型,并在各层之间提供一个明确统一的通道来进行通信,仿佛就是一个对象在三层之间的流动。MVC框架的的控制部分大都使用xml配置文件来实现,如struts2struts.xmlasp.net mvcweb.config。可很有利于团队开发,例如一个struts2Web项目,架构师可以在项目设计阶段写好控制部分,通过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框架中,pureMVCCairngorm是两个较早出现的框架,已经有点过时。看网上比较推荐的是Robotlegs框架,拥有了控制反转和依赖注入,包装了大部分功能,配置代码大大减少。还有一款简洁,轻量级的MVC框架,WeeMVC我测试官网的两个例子,感觉三层分得很清楚,用起来很方便。不过都只是简单了解,以后要用到再学。

AS3的学习现在还比较浅,很多重要的概念还没完全搞清楚,像异常处理,命名空间,Flash Player的安全机制等,没写进来,AS代码量也比较少,下周再继续努力。

参考文献:

Adobe官网教程:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3_Flex/WS5b3ccc516d4fbf351e63e3d118a9b90204-7eee.html 

ActionSciprt3 API文档http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/package-summary.html 

Flash.ActionScript3.殿堂之路》




  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值