写在前面
对于很多基础不扎实或者是转行到游戏前端的人来说,编码规范确实很存在问题,这里将我常用的贴在这里供大家参考!
具体内容
编程语言:TypeScript
开发框架:白鹭引擎(Egret Engine2D)
开发环境:Egret Wing
一、命名规范
① 命名空间:全字母小写,namepace model
② 类名:首字母大写驼峰式,class HelloWorld
③ 变量名:
a. 首字母小写驼峰式,let btnClose
b. 全字母小写下划线连接,let btn_close
④ 常量名:全字母大写下划线连接,readonly USER_NAME
⑤ 函数名:首字母小写驼峰式,getUserName()
⑥ 枚举命名:
a. 枚举名:首字母大写驼峰式,enum Color
b. 枚举类型:首字母小写驼峰式
⑦ eui皮肤命名:皮肤定义名称与文件名保持相同,以Skin结尾,皮肤关联的界面类名与皮肤名称保持对应关系,HomeSkin,HomePanel
⑧ 临时变量:i j k仅作为循环遍历时使用,一次定义只做一种用途
二、编写函数
① 命名:注重可读性,词要达意,良好的命名可以达到自我注解的效果
② 参数:数量不宜过多,尽量不超过7个;参数的顺序应该契合函数的功能,例如描述一个矩形的参数顺序应该为:(x:number,y:number,width:number,height:number)
③ 注释:
a. 注释的主要作用是别人看你的代码的时候能明白其意,也为了方便自己以后维护代码的时候节省时间
b. 公开的接口(供其他人员调用)必须提供清晰明确的注释,包含用法,参数描述,返回值说明以及必要的注意事项
c. 注释时应注重”为何做”而不是”怎么做”
d. 说明非常规做法,例如处理特殊情况的说明
e. 注释数值单位,比如表示时间的参数,单位是秒还是毫秒
f. 注释数值的取值范围和默认值
④ 布局与缩进
⑤ 单一目的:一般情况下,一个函数只处理一件事情,避免把过多的功能写在一个函数里面,单一目的可以让函数更简洁可靠
⑥ 简短:一个函数最好把行数控制在150行以内
三、基本原则
客户端编码基本遵循MVC模式(模型-视图-控制器),所以客户端的代码结构主要分为三部分model,view,controller
用户打开一个界面或者点击某个按钮,controller将发送请求给服务端,服务端返回数据到对应模块的controller里面,在这里也可以对数据做一些处理,然后将数据保存到model里面,model存储数据的同时一般会对外广播一条消息通知界面数据更新,在任何需要显示数据的view(界面)里面,可以接收这条消息,然后从model里面获取数据刷新界面
重要原则:界面始终以model里面的数据来显示,不要在界面里面保存和修改数据,这样可以将数据的处理和显示分离,降低代码之间的关联度,提高可维护性
四、最佳实践
① 神秘数字:避免在代码中直接使用数字,例如给某个属性赋值100,尤其是这个数字被多次使用时.最佳的方式是定义一个常量,当需要修改这个数字时只需修改这个常量定义的地方,有效避免了查找的麻烦,并且通过查找引用,可以方便的知道这个数字被使用的地方
② 防御性编程:
a. 对可能访问空对象的属性和方法的地方做容错处理
b. 程序应该不因传入错误数据而被破坏,哪怕这些数据是由别人输入的
c. 明确数值的取值范围,数值计算时避免除以0
d. 避免引用列表索引超出长度
③ 枚举:针对一些有限的可选类型,用枚举代替数字将有很多好处
a. 枚举可以对类型进行直观的表达,观其名知其意
b. 枚举适用编译器类型检查,可以有效避免拼写错误
c. 通过编辑器代码提示,枚举可以很快速的知道可选类型的数量和种类
d. 对于公开的接口,枚举类型可以约束接口的调用者确保传递的参数不会有意外的值
五、测试原则
① 干净测试:检验代码能否工作的测试(基本要求)
② 肮脏测试:检验所有可能让代码失效的测试
六、协同
① 导出接口:服务端更新了proto协议时,客户端最好只导出自己负责的模块的接口,如果多人同时导出了同一个模块下面的代码,极有可能产生冲突.导出接口后,在不影响他人开发的情况下尽快上传自动生成的接口代码,以降低文件冲突的机会
② 资源打包:
每次打包资源时都会修改资源配置文件(json),为了避免资源配置文件发生冲突,请在打包资源之前将资源配置文件更新到最新版本,打包完成后及时提交更改后的文件.
如果发生文件冲突,为了不覆盖其他人提交的内容,必须使用svn上的版本,然后将自己最近打包过的资源重新打包后再次提交
③ 解决冲突:以不破坏和覆盖他人的内容为原则
总结
其实很多看一遍有个映像就行,主要的还是一些命名规范,好的命名更易于自己和他人的阅读。还要写好注释,方便后期查看!