ACTIONSCRIPT中的元编程和开发流程解耦谈熠2010.5
元编程(Meta-programming)一种根据在运行时的环境动态地获得、创建、修改程序所需要的类和对象的技巧。
一个简单AS元编程应用Object.method1()Object.method2()Object.method3()Object[“method”+i]();
AS3中的元编程ACTIONSCRIPT是一门基于Prototype的语言flash.utils.* 提供了一套反射工具方法两个AS3的元编程技巧:反射 (Reflection)方法缺失 (Method Missing) 两个编程概念DRYConvention 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:XMLindescribeType(ApplicationState).constant.@name)     {stateNames[ApplicationState[constantName.toString()]]=constantName.toString();     }  }}...
反射的应用classApplicationState{  ...  publicstaticfunctiongetStateNameByValue(val:uint):String  {    returnstateNames[val.toString()];  } }
反射的应用varcurrentState:uint=ApplicationState.LOADING;trace(currentState); // 1trace(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.ProxyObject.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)Serversend()ServerProxy@connectionObjectsend()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

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