在系统开发中,我们经常会见到为修复一个Bug,而另外产生一个新的Bug。对于这种司空见惯的现象,很多人技术人习以为常,甚至认为这是很正常的事情,这真是技术人的悲哀。作为一名技术人,应该认真分析问题的根源,并找到解决问题的方案,这才是一名合格的技术人。
事实上,每当修复一个Bug,而产生一个新Bug时,85%的可能性是技术人乱用接口所致,10%的可能性是技术人没有理清系统的业务逻辑,只有5%的可能性是由于技术人粗心造成的。很多技术人开始发问,到底什么样的接口才是标准的接口。
其实,标准接口的定义很简单,可以匹配某种功能,具有高内聚低耦合特性的一种规范。很多公司都定义了自己的一套编码规范以及接口规范,只不过在开发过程中,很多规范慢慢被技术人和谐了,而整个项目又没有代码走查过程,导致错误的代码越积越多,最终接口的耦合性越来越强,而里面的逻辑也越来越混乱。接下来,我们一起看一些接口乱用的例子。
- init : function (type) {
- this.inherited(arguments);
- this.reset(type);
- this.initParameter(type);
- },
- reset : function(type){
- var bookStore = repository.getStore("Book");
- this.ddlLib..editorWidget.set("store",bookStore);
- this.txtName.editorWidget.set("value","");
- this.txtStatus.editorWidget.set("value","");
- if(type == "A"){
- this.readStaus.editorWidget.set("value","Read");
- }else{
- this.readStaus.editorWidget.set("value","Write");
- }
- },
- initParameter : function(type){
- this.ddlLib..editorWidget.set("value","first");
- if(type == "C"){
- this.readStaus.editorWidget.set("value","Read");
- }else{
- this.readStaus.editorWidget.set("value","Write");
- }
- }
从上面的代码可以看出,在reset方法和initParameter方法中,都有对readStaus对象进行操作,此时如果调用init方法的话,readStaus会在initParameter中重写,即使传入了正确的Type : A,也会在initParameter中重写为None.
这就是典型的乱用接口的情况,从方法名中应该可以看出,在系统初始化时,由reset重置所有的条件,initParameter根据其业务,进行不同的表单内容加载。不知哪个粗心大意的程序猿将本应在initParameter中执行的方法,放到了reset方法中。
还有另外一种常见的乱用接口现象,就是在不满足当前业务时,就使用If Else强制更改接口。虽然If Else具有强大的适应性,但是If Else并不是为混乱接口而设计的。技术人不应该只是盲目的追求该Bug快,应该考虑修改一段代码是否会对原有的代码造成影响,是否会影响其它的业务逻辑。比如下面的代码。
- loadAttachments : function(event){
- if(event.type === undefined){
- return;
- }
- ... //此处省略加载附件的逻辑
- }
某前端开发人员在修复某模块的Bug时,使用if else终止了当前循环。后来发现event.type并非必填参数,很多情况下,都是undefined返回。造成后面的代码无法执行。
接口乱用的情况还有很多,以上只是两个常见的例子。作为一名技术人,应该主动去寻找自己技术的漏洞,并尽快去弥补这些漏斗,增加自己的技术实力,让技术人以技术而自豪!
转载于:https://blog.51cto.com/favccxx/1105339