首先要提高的是思考问题的严谨程度,只有在编程时尽可能考虑到所有情况,才能避免无休止地改来改去bug,从根本上提高效率,养成良好地思维习惯,才能随着时间地推移让自己变得更强。业务逻辑的实现谁都可以,好的程序员应该吧大量时间花在初期设计,画流程图,理清思路而不是匆匆敲代码。
先谈稳定性,我在编程时候必须多花时间考虑清楚这个需求可能出问题的更多方面和我具体实现时候的注意事项,这也就是有人说经验越多编程反而越慢,比起匆匆动手完成一个功能然后无休止地修改bug,在最初编程时候多考虑一下会更有效率。培养良好的思维习惯,这是从现在我就要有意识做的事情,根据崔江的观点,做一个东西之前应该尽可能考虑全可能遇到的问题,90%以上就是不错的结果,所以我要做的事情是:
回顾bug列表,把其中的逻辑问题都梳理一下,强化一下可能出问题的通用情况,我会专门整理个地方过一遍我遇到的逻辑疏漏,来让自己的思维更加缜密。
1、在进入正常逻辑之前确保该初始化的东西都被初始化了
2、论证一个逻辑是否有问题,考虑整个逻辑过程,按顺序过一遍,注意可能其中有一段空白没被考虑,参考角标更新时间
3、对于一些非必现问题,不要把责任推给网络或者机器特性,要根据问题的反馈,分析出其中可能发生错误的点,参见取不到canSellCardList缓存问题,是因为新手引导之后的一步手动清掉了
4、编程中许多环节我会假设数据已经正常,我该拿到的东西都拿到了,而且是我想要的形式,比如一个list我会对它做一些数组独有的操作,但是如果这个东西不是数组,是null就会报错,或者json的层级问题导致我取一个对象下的属性取不到,实际上这个属性在上一层结构或者下一层结构,还有可能拿到一个非法值,我就去比对,又判断在不相等时候做操作,这样非法值肯定不相等,但逻辑已经错了。首先在编程时候就要充分考虑到每一个数据结构都可能不是我想要的形式,为此我会广泛使用一些诸如typedef,instanceof之类的语句,当发现异常后输出对应的日志,先不必着急做容错,必须仔细论证整个流程,确定是一些不可预见因素如网络异常导致,再考虑做容错。
5、在准备发更新包或者大版本打包时,确认自己已经做的修改都已经提交SVN,只是在这种时候多做一点防止疏漏。
6、在一些有有效期的功能中要考虑到过期之后程序会怎样处理,如BOSS逃跑后,前端可以加上跳转
7、游戏的逻辑中尽量不要写死固定数值,范围的判断要动态获取图片的范围
8、修改一个bug时把可能导致这个bug的所有原因都改掉,不要只改报出来的那个
9、在条件判断语句中首先要考虑条件两边的值是否都是合法值,确定两边都是和法值之后,考虑边界值,即 = 号的情况,
说到这儿,在对后台传来的数据做处理的时候要考虑到后台传入数据非法的情况,如果这个数组为空是传一个空数组还是
传一个null,说白了还是在使用特定数据结构时候做好检测
10、需要客户端做限制的情况要考虑条件是否和后台一致,确定好后台数据的值和格式招揽倒计时是因为客户端取上次抽
时间加一天,如果上次抽时间是几天之前,加了一天还是可以免费,应该取当前时间。
11、遇到更新用户信息的操作,考虑用户信息面板的同步更新
12、注意对极限边界状况的测试,如社团人满了,测试如果需要结果在 20 – 30 之间,测试的时候,要重点关注20,30,<20, >30的情况
13、解决一个隐藏较深的bug先解决肯定可以确定的表面bug,有一种情况就是藏得深的不好解决但是重要而浅的好解决不重要,这时候不要着急解决那些藏得深的,着急可能会误入歧途,先把表面的bug解决之后再看可能隐藏很深的bug也没有了,二八定律
14、利用localStorage时候要注意区别不同账号和同一个账号不同区,在设置item的时候key要加上IMEI和ip地址
15、cocos2d 2.x的一个很大的坑是隐藏层的接受触摸事件问题,最好别弄隐藏层,就删除掉不存在的层,隐藏的层一定要关掉触摸事件,不然会因为可见层没有吞掉事件触发隐藏层的点击事件造成奇怪bug,切忌
16、用log打印日志的时候要确定要打印的数据结构合法,比如打印一个对象的某个属性要确定这个对象存在,不然访问undefined的某个属性js会报错导致程序崩溃