Actionscript中的元编程和开发流程解耦(谈熠)
Upcoming SlideShare
Loading in...5
×
 

Actionscript中的元编程和开发流程解耦(谈熠)

on

  • 2,809 views

 

Statistics

Views

Total Views
2,809
Views on SlideShare
2,344
Embed Views
465

Actions

Likes
2
Downloads
65
Comments
0

6 Embeds 465

http://tanyi.info 364
http://events.swfsh.com 83
http://www.slideshare.net 15
http://zhuaxia.com 1
http://static.slidesharecdn.com 1
http://xianguo.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Actionscript中的元编程和开发流程解耦(谈熠) Actionscript中的元编程和开发流程解耦(谈熠) Presentation Transcript

  • ACTIONSCRIPT中的元编程和开发流程解耦
    谈熠
    2010.5
  • 元编程(Meta-programming)
    一种根据在运行时的环境动态地获得、创建、修改程序所需要的类和对象的技巧。
  • 一个简单AS元编程应用
    Object.method1()
    Object.method2()
    Object.method3()
    Object[“method”+i]();
  • AS3中的元编程
    ACTIONSCRIPT是一门基于Prototype的语言
    flash.utils.* 提供了一套反射工具方法
    两个AS3的元编程技巧:
    反射 (Reflection)
    方法缺失 (Method Missing)
    两个编程概念
    DRY
    Convention Over Configuration
  • 反射 (Reflection)
    工具: flash.utils.describeType
    作用:返回一个对象的元数据的XML描述信息
  • 反射的应用
    classApplicationState
    {
    publicstaticconstLOGIN:uint=1;
    publicstaticconstLOADING:uint=2;
    publicstaticconstPLAYING:uint=3;
    }
  • 反射的应用
    classApplicationState
    {
    publicstaticconstLOGIN:uint=1;
    publicstaticconstLOADING:uint=2;
    publicstaticconstPLAYING:uint=3;
    }
  • 反射的应用
    classApplicationState
    {
    publicstaticconstLOGIN:uint=1;
    publicstaticconstLOADING:uint=2;
    publicstaticconstPLAYING:uint=3;
    privatestaticconststateNames:Object= {};
    }
  • 反射的应用
    classApplicationState
    {
    ...
    publicstaticfunction init():void
    {
    for each(varconstantName:XMLin
    describeType(ApplicationState).constant.@name)
    {
    stateNames[ApplicationState[constantName.toString()]]=
    constantName.toString();
    }
    }
    }
    ...
  • 反射的应用
    classApplicationState
    {
    ...
    publicstaticfunctiongetStateNameByValue(val:uint):String
    {
    returnstateNames[val.toString()];
    }
    }
  • 反射的应用
    varcurrentState:uint=ApplicationState.LOADING;
    trace(currentState); // 1
    trace(
    ApplicationState.getStateNameByValue(currentState)
    ); // "LOGIN"
  • 概念1:干
    干 —— 避免重复
    DRY – Don’t Repeat Yourself
    一种常见的重复操作:
    trace(“name:”+this.name+”, data:”+this.data);……
  • 反射在调试时的应用
    class Inspector
    /**
    * 列出一个对象中的所有公开变量名,并把这些变量名放在一个 Vector.<String>
    * 容器中
    * @paramobj object of any kind
    * @return 列出一个对象中的所有公开变量名,并把这些变量名放在一个
    * Vector.<String> 容器中
    */
    publicstaticfunctionlistInstanceVariables(obj:*):Vector.<String>
    {
    returnxmlListToStringList(describeType(obj).variable.@name);
    }
    publicstaticfunctiondumpInstanceVariables(obj:*):Vector.<String>
    {
    returndumpProperty(listInstanceVariables(obj),obj);
    }
  • 反射在调试时的应用
    trace(Inspector. dumpInstanceVariables(this));
  • 方法缺失 (Method Missing)
    工具:flash.utils.Proxy
    作用:重载AS对象默认的操作行为
    原理:
    Object extends flash.utils.Proxy
    Object.methodName(arg0,arg1)
    Object.callProperty(“methodName”,args)
  • 方法缺失
    public dynamic class ClassA extends Proxy
    {
    flash_proxy override function callProperty(name:*, ...rest):*
    {
    trace(“请求调用方法:”+name)
    }
    }
    varinstanceA:ClassA = new ClassA();
    instanceA.doSomeThing(); // 请求调用方法:doSomeThing
  • 概念2:习惯优于配置
    习惯优于配置
    Convention Over Configuration
    惯例优于配置的宗旨是减轻配置文件的负担。我们要保留应用程序和程序框架的基本可扩展性,同时去掉无休止的配置信息。
    AS的”方法缺失”技术非常适用于大配置量的情况。
  • 元编程的使用建议
    元编程的关键是你编写程序在它们运行的时候调整和修改它们自身。元编程被使用的越多,你的运行程序就越不象你所编写的源代码。这当然是这个模式的意义所在,不过同时也是危险所在
    。调试普通代码已经不是件容易的事情,而要调试元编程所产生的短暂存在的对象则要更困难许多。
    因此,一组完整的单元测试是使程序正常工作的关键。如果你的程序使用了大量的元编程技术,那么单元测试是绝对必不可少的。
  • 对开发流程的思考
  • 如何避免影响产品成功的因素
    程序:不要出错
    减少范错误的可能
    降低范错误的频率
    提高代码质量
    精简代码实现
  • 为了便于表达,我设置两个变量
    代表:客户端组
    client-side guys
    代表:服务器组
    server-side guys
  • 常见的开发工作流程

    一种紧密耦合的状态
    tightly coupled
    低效,易出错,难管理
  • 解耦客户端的开发
    吃过了吗?
    <hello>吃了吗</hello>
    还没,您呢?
    {hello:“吃了吗”}
    …/hello/吃了吗
    010011101001101
  • 采用代理模式(Proxy Pattern)
    Server
    send()
    ServerProxy@connectionObject
    send()
    RealConnectionsend()
    RealConnection可能是 xml, json, bin socket, restful http …
    function send(){
    connectionObject.send()
    }
  • 用 flash.utils.Proxy优化代理实现
    server.walkTo(x,y) // 发出socket数据包 “WALKTO X Y“
    server.attach(targetId) // 发出socket数据包 “ATTACK targetId“
  • 优化后开发团队工作流程
    系统整合
    优点:
    • 降低团队之间的依赖
    • 工作效率提高,调试难度降低
  • 更有效的技术交流
  • QQ群。。。唉。。QQ群
  • 谢谢!
    谈熠
    QQ: 2152525
    开发者网站: www.wedoswf.com