公司在11.1-11.2两天请来了宋宝华老师来为我们培训,虽然讲的都是基于C语言的有关Linux内核的知识,我听不太懂,不过一些设计相关的常识技巧还是挺适用的。用自己的语言理解记录一下。
1.函数参数类型是boolean的,改为两个函数
我经常会写出一个类似show(boolean isShow)
函数,传入一个boolean类型的参数判断显示或者隐藏。
这样对于程序逻辑性来说并不好,函数名称既然叫show
,那么这个函数就应该只做show
的事,隐藏的事就再写一个hide()
函数去完成。
如果非要传入boolean变量,可以把参数名改成showOrHide(boolean isShow)
。在Android源码中也可以看到view.setEnabled(boolean enabled)
,我们知道传入一个值可以改变enabled
属性,可是如果把函数名改成view.enabled(boolean enabled)
,会不会觉得很奇怪?既然函数名是enabled
,为什么还可以传一个参数使得函数变成了完全相反功能的disabled
。就是这个道理。
2.如果有异常参数,抛崩溃异常,而不是由函数内部处理。
我经常写函数的第一句话就是判断传入的参数是否为空,如果为空直接return;
或者赋给一个缺省值。如果参数是int
型的,还会判断是否小于0
或者大于最大范围值,如果超过了值域范围,我还会“强行”把参数的值“拉回”正确的范围内。
这样其实是错误的处理方式!
如果出现异常数据,说明程序到这已经错了,应该尽早报告出来,哪怕是程序崩溃,所谓早死早超生。我们经常会遇到一个问题,崩溃的地方就是原因所在,也就是“所见即所得”,这样的问题一般很容易解决;我们有时候还会发现出问题的地方没有一点错误,即不是问题发生的地方,也就是“所见不是所得”。我们可以假设一下,前面运行了很多步,到了我们写的这个函数,已经出现了错误的参数,可是我们对异常的参数进行了强行转换,然后用正确范围的参数继续下面的步骤,这中间发生了很可怕的事有木有!就是不对接!
举个例子,就好像领导给了你一个文件让你给张三(通过了很多层传到你这了),文件名称是《To张三》。可是公司并没有张三这个人,你心里就琢磨,不可能给一个不存在的人发文件呀,后面没法传呀,但是你知道有个人叫张四,于是自己把名称改为了《To张四》,然后又往别的部门传。最后出状况了,前面有人不小心把《To张王》写成了《To张三》,而张王没有收到领导的文件,领导怪罪下来,罚了传文件的每一个人,可是问题在他们么?不在,问题在于你偷偷改了文件名,并且把错误的文件发下去了。而正确的做法我们应该抛出异常告诉领导,你给我的文件名字好像有点问题,是不是前面传递资料的时候有什么地方出了差错?
还需要注意一点就是异常处理和错误处理的差别。异常要抛出,而错误我们要有相应的处理措施。在写函数的时候,只有我们自己知道什么是异常,什么是错误。
我再举个例子,比如一个打开文件的函数openFile(path)
,内部我们判断如果找不到path
路径,就抛出异常;而错误处理是我们在准备调用openFile(path)
函数的时候,先调用isFileExist(path)
来判断path
是否存在,不存在在else
中写错误处理逻辑。这样既保证了函数的单一性,又强化了逻辑性。
3.函数名字和所做事情要匹配
这个和第一点有点像,就是说你函数做了什么事,你函数名就要体现出做的事,如果做了两件事(比如”开”和”关”),就要有两个动词体现