hi,云风你好,一直有看你的博客,收益匪浅。今天和朋友讨论一个问题,没有结果,所以也希望能获得你的一点意见。
问题是这样的我们项目使用scaleform开发ui,sf提供了一个方式可以让as通过直接调用c++的函数。比如c++里写好函数func(),并通过sf的一个FuncObject包装,可以和as的一个object对应起来as中调用:object(parameters),这会调用到FuncObject::Call(params)
这里我们遇到一个分歧:
我的想法: 一个函数注册机制,比如把所有函数用字符串注册到一个map里面,初始化系统时,创建一个FuncObject对应到as的一个global.func_obj对象。 比如有函数func1, func2, 则as这样调用,global.func_obj("fun1", param1, param2, ...)global.func_obj("fun2", param1, param2, ...)在c++的FuncObject::Call里面,通过map找到函数来执行
我朋友的想法: 把所有函数用字符串注册到一个列表里面,初始化系统的时候,为每个函数创建一个FuncObject,设置到as的一个global.func_obj变量里面比如有c++函数,func1, func2这样,在as这边可以这样调用,global.func_obj.func1(), global.func_obj.fucn2()
到这步,我也都同意,觉得也挺好的但是后面他还提出每个函数在global这个类里面做一个as这边的封装,也就是每需要加一个函数就要在as的global类里面定义fun1, fun2,函数内部再去调用func_obj.fucn1(), func_obj.fucn2()
这样的理由有这么几点:1 通过封装,可以限制参数类型(as的函数参数可以指定类型),获得编译时错误2 通过编辑器(比如FlashDevelop)可以有代码提示,方便对函数的查找,函数多的时候,别人要使用这些函数,可以快速的找到
我不认同的有两点1 这么做导致导出一个函数到as要付出的成本很大,c++声明、定义、注册函数,as定义函数,编译as到global.swf,然后才能进行使用(我的方法,c++做完后,as这边就可以直接用了)
2 理念上,我认为动态语言让我们脱离了对类型的限制,函数也可以作为第一类值来灵活的应用,很大的提高了开发的敏捷性。在我用c++几年后我就老想办法怎样用字符串来创建对象,调用函数。虽然这样带来一些隐患,但可以从其他一些制度上去规范。比如规划文件、规范命名、规范文档、注释等等。
希望能获得你的建议,谢谢
如果最终使用形式上是一致的, 那么我认为怎样都可以.
但是, 封装代码最好是机器生成,而非人手写的. 人定义一份 DSL 描述, 再转换成封装代码即可.
这样,你转换出一份强类型检查的可以, 转换出一份不带类型检查也不需要编译的也可以. - 回复 | (2625) | 云风 | 2013-01-30 11:12:40