28、代码那些事儿
这个是讲软件研发过程管理的系列,目标人群是那些身处研发管理位置或想成为研发管理的人。所以我不希望这个系列中出现代码,也不希望出现和某种技术密切相关的代码技巧。
但是没有办法,软件开发过程管理,有个很重要的一环,就是软件代码编写。不编写代码,说的天花乱坠,管理做的再扭,也成为不了软件。
最近blog好友到了上限,所以无法加入好友了。于是就加入了N多QQ网友。大多数刚出道一两年,还有不少在校学生,希望认识并聊聊,要和我聊设计模式、OO、SOA,还有人建议我去看看OO和UML的书籍。
我确实没有阅读过OO的书籍,我不是一个死钻牛角尖的人。我只是有什么问题,就去找解决问题的方法,能解决我的问题就OK,而不在乎我用的正不正宗,也不在乎我用的是不是OO。可能它是OO的外壳,但是它实质上可能是伪OO,我也不想去深究和区分什么是正宗OO,什么是伪OO。反正能解决我的问题就行。
我首先遇上的问题是代码大流水的问题。一个代码3000多行,数不清的if..else。我实在无法分析出这个代码到底实现了什么功能,它复杂的就像一把瑞士军刀,如果军刀里面能出来一支小手电也觉得不奇怪。这段代码我想它就是这样。我想写这段代码的人一定是在学校做惯了《图书馆管理系统》,一个程序文件中实现了所有的功能。
所以,经历了痛苦,我就一直要求手下的开发人员,一个函数代码行数不能超过一个屏幕。如果超过一个屏幕,就需要来回滚动。一滚动,就容易把思路滚动的走神,乱了,还得回到上面去重新理逻辑。
这种规定,直接导致了一个后果,函数太多了。但是函数间是有关系的。有时候突然需要增加一个参数,但是此函数已经被其他代码调用了,于是为了省事不改动其他代码(当然,他可能已经忘了再哪些地方都调用到了),他就定义了一个全局变量,在函数之间传。
新的问题有出来了,全局变量的问题。代码在他一个人手里还好说。被维护了好几手,新手对日益复杂的代码已经不太容易理出头绪,但修改任务是有时间限制的,只能在现有理解水平上工作。这位新手看到这个全局变量的命名,感觉是自己能用的到,就用了,还给赋了值。意向不到的事情发生了,数据库中进了错误的数据,怎么来的,不知道,看代码,处理的都正确,代码没有问题,也不知道怎么出现的。
于是禁止大家使用全局变量,能藏到多低的可见级别就藏的多深。但是仍然问题依旧。
于是,我们就把这个全局变量封装成属xìng,给它赋予读和写的函数。不管有多少个地方调用了它,有谁给它乱赋值,这里掐源头,都做好日志和异常保护校验。
把所有函数,能变成私有的就变成私有的,需要公共供其他人调用的谨慎的放出来。放出来的函数,一定要做好参数的校验,什么空指针,什么没有初始值,什么非法参数值的,尤其是临界值上下边界,都在门口就挡住,根本不往下执行进行业务处理,否则走的越远引起的问题越大。
而且要求每个函数都要做好自己的内存保护工作,自己函数内创建的就要在函数内释放。每个函数要做好异常处理和日志记录。
这样,一个样子像OO的类产生了。它可能只遵守了OO所提了封装,它却没有实现OO所提的继承和多态。所以它可能是个伪OO,但它确实解决了我们的问题。
封装了类之后,又一个问题产生了。几个类之间不知怎么的,总是你中有我,我中有你,互相调用了。就好像左右手互搏,弄不好就会把自己给捆起来。
为了堵住这个问题,规定只能