写代码的意识
不得不承认,写代码和打dota一样也是需要非常意识,“风骚的走位,淫荡的意识”,引用过来就是讲写代码的时候,需要有一定的前瞻性,意识到这段代码可能存在的潜在问题。因为在你当初写下这段代码的时候,你根本无法预料到在以后的维护过程中会发生怎样的改变,你所能做的就是尽量考虑可能的情况,然后给代码加上防范,我越发觉得这个意识很重要。有以下两个例子为证。
例子1:
- def func_a(self):
- user_info = get_user_by_roleid(roleid)
- if len(user_info) != 0:
- if user_info[0]["status"] != setting.USER_ENABLED:
- self.error_page("对不起,该角色已经被禁用!")
- return None
- elif user_info[0]["urs"].lower() != self._urs.lower():
- self.error_page("该角色暂时不允许登录");
- return None
- else:
- set_last_visit_time(role_id)
- else:
- self.error_page("内部错误,请联系管理员")
- return None
上述代码中使用函数:get_user_by_roleid获取到用户信息后,假如能获取到也就是进入第一个if条件,然后再通过一个if判断是否ok,其中除了判断是否被禁用,elif这句其实看起来有点多余,判断下从数据库里获取到的账户名和当前账户名是否一致,这里就是重点了,也是很容易忽略的地方。因为我们是通过传入roleid来获取到用户信息的,而不是通过传入账户名,在一般情况下这个检查可有可无,因为roleid和账户是一一对应的,都是unique key,但是这句代码的检查却很有意识了阻止了后期维护中可能犯的一个错误:假如有一天账户名需要修改,比如统一加上@163.com这个后缀,而因为一些维护的问题,导致用户传入的账户名是不带后缀的,但是数据库维护后里面的账户名是已经带后缀了(后期维护出现啥问题谁也无法预料),如果没有这句elif判断则这个用户显然可以通过这段代码登录成功,后续操作就不堪设想。而现在在执行到这段代码的时候,加上elif判断就可以有效阻止用户登录成功进行后续操作,从而避免了一系列连锁问题。
这里的len(user_info) != 0这句判断也值得商榷,我们期望返回的数目肯定是1,而不是!=0也不是=2,所以哪天要是roleid不是unique key了,这个判断也是可能会有问题的。
例子2:
在写易推的时候,报错最多的就是NullPointerException,究其原因就是缺少了判断,很多时候想当然的认为这个函数不会返回Null,但实际用户运行环境复杂,总是出乎你意料,程序就这样崩溃了,不友好了,只能怪自己。
所以写代码多检查,准没错。写代码意识很重要;)