`

一种错误的编程习惯:一条判断语句,判断多个条件

阅读更多

 

编程规范:判断语句,不要一下子判断多个条件
 
例如:
(1)
if( userName!=null && userName.length()>0 && userType!=null && userType.length()>0 && userEmail!=null && userEmail.length()>0){
 
     //....
}else{
 
     //....
}
 
当然,抽出一个isEmpty的字符串判断函数,也可以简写成:
(2)
if( (!isEmpty(userName)) &&  (!isEmpty(userType)) && (!isEmpty(userEmail))){
 
     //....
}else{
 
     //....
     return false;
}
 
 
这样写有什么问题?(1)的问题其实就是看起来太长了,不容易理解,那么(2)呢?
 
 
以我个人看来,(2)的逻辑表达还是很清晰的,但是问题在于没有满足业务需求。
 
一般做一个接口,可能会这样写需求定义:
 
检查参数
如果参数正确,完成XXXXX业务;
如果参数不正确,返回失败。
 
显性需求就是这几条了,那么隐形需求呢?有一些隐形需求,是一些约定俗成的东西,一定也要铭记在心的。比如,例子中的接口,是否有这样一个需求:
 
     如果参数不正确,请告诉调用者是哪个不正确,为什么不正确
 
     从这条隐形需求来看上面的例子,可以看到,(2)最大的问题是,else里面怎么写?如果不是开发商业软件的人,或者不注意团队合作开发的人,也许会说“没什么问题,if后边正常业务流程,else返回条件检查错误”,但是,前边的if里既然这么是几个条件一起判断的,那后面的else里你还怎么返回?
     直接返回一个false当然是正确的返回,但是,如果调用者发现返回的是一个false,那么,怎么确定到底是哪个变量,userName、userType、userEmail里边的哪一个是空,还是null?难道你在else里边还要再判断一回吗?
     当然,你也可以假设这些变量传递到你写的这个方法之前,先在日志(甚至控制台也罢了)输出了,这当然在你的方法返回错误时,能够查找问题所在,问题是你这个假设是否能成立呢?恐怕不一定吧。
     再者,对这个简单的例子,在外边输出这几个变量就行了,但是,如果这个函数里的判断比较复杂呢,参数需要经过复杂的转换再判断呢?那种情况下,从入口参数的原始值不一定能看出问题只所在。
    再有,如果你不是把代码集成给调用者,而是提供一个jar包(或者,如果是C写的代码,给的是一个DLL的情况)给调用者使用呢?是否调用者只能把问题报告给你再判断呢? 
     如果不能从返回值里看到返回false具体的原因,那么,如果发现这个函数的调用者到这里出错了,即便把问题报告给你,也只能使用同样的参数和条件,在IDE里调试了。
所以,在这些非常简单的场景下,也应该考虑问题尽量周全,最简单的方法就是:
 
if( isEmpty(userName)){
     //....
}
if( isEmpty(userType)){
     //....
}
if( isEmpty(userEmail)){
     //....
}
 
 
       这样,外边的人想怎么用,都由他的业务场景决定。
       或者:
if( (!isEmpty(userName)) &&  (!isEmpty(userType)) && (!isEmpty(userEmail))){
     //....
}else{
     throw new ArgumentInvalid(".....");
}
 
 
       这个程序段,你可以通过异常,告诉调用者,什么样的参数才能检查通过,而他送的参数都是什么。虽然异常的代价要比判断高一些,但这个也比(1)和(2)好一些。
       其实说了这么多,也是表明这种细节,是编码的基本规则的延伸,
(一)要清晰表达业务需求(隐性需求:能够给出到底是哪个参数不对,为什么不对)
(二)不要随便假设条件(假设别人也可以调试你的代码)
 
       这样来写,的确很繁琐,但是写程序是为了干什么?要完成需求,如果不能完成需求,代码多简洁,又有什么价值呢?
 
很多人都那么喜欢在一条if语句里判断很多条件,的确能减少好几行代码,可是,只要代码清晰易懂,多写几行代码又有什么不可以呢? 
       有时候,就得用最基本的方法来表达业务逻辑,这需要有脚踏实地的态度,平和的心态。一想省事,往往到最后就会发现路走错了。再者,就是编程者老老实实的态度,平凡朴实的编码。
 
 
 
 
 
 
 

 

分享到:
评论

相关推荐

    C语言程序设计标准教程

    (1) 条件判断语句  if语句,switch语句 (2) 循环执行语句  do while语句,while语句,for语句 (3) 转向语句  break语句,goto语句,continue语句,return语句 4.复合语句 把多个语句用括号{}括起来组成的一个...

    C 语言编程常见问题解答.chm

    3 什么时候用一条switch语句比用多条if语句更好? 1. 4 switch语句必须包含default分支吗? 1. 5 switch语句的最后—个分支可以不要break语句吗? 1. 6 除了在for语句中之外,在哪些情况下还要使用逗号运算? 1. 7...

    javascript入门笔记

    4、一条语句中声明多个变量 var 变量名1=值,变量名2=值,变量名3; 3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 ...

    华为编程开发规范与案例

    上面的问题解决起来很容易,只需在第一行代码中增加一个判断条件即可,如下:  for(i=0; i<pSysHead->dbf_coun && i ; i++) // MAX_DB_NUM=127 这样就保证了循环变量i的值在正常范围内,从而避免了对指针pDBFat...

    C#编程经验技巧宝典

    79 <br>0115 如何判断是否为数字 79 <br>0116 如何在字符串中查找指定字符 79 <br>0117 如何在字符串中用一子串替换另一子串 80 <br>0118 将新字符串添加到已有字符串中 80 <br>0119 如何在...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    第一条语句说明了对象 today 属于 Date 类,第二条语句说明了对象 myRectangle 属于 Rectangle 类。对象说明并没有体现一个具体的对象,只有通过实例化后的对 象才能被使用。 2. 实例化对象 实例化对象就是创建一个...

    shell编程—-while和until循环

      condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是shell中的关键字。   while循环的执行流程为:先对condition进行判断,如果该条件成立,就进入循环,执行...

    C#.net_经典编程例子400个

    130 实例095 使用ErrorProvider组件验证文本框输入 130 实例096 利用ErrorProvider组件查看数据集中的错误 132 3.3 EventLog组件 134 实例097 使用EventLog组件读写Windows系统事件日志 134 ...

    软件测试规范

    1.语句覆盖 ............................................................................................................................................ 10 2.判定理盖 .....................................

    语言程序设计课后习题答案

    2-13 写一条for语句,计数条件为n从100到200,步长为2;然后用while和do…while语句完成同样的循环。 解: for循环: for (int n = 100; n ; n += 2); while循环: int x = 100; while (n ) n += 2; do…while...

    jsp编程技巧集锦

    用什么sql语句将数据库中的一条记录,复制为两条? 13. 有兩個按鈕A,B,其中A按下去,A就不可以再按,另外B按下去,A可以再按 請問如何用javascript控制.? 14. jsp中的数据库的连接方式 15. 在jsp中,怎么...

    C语言编程要点

    1.3 什么时候用一条switch语句比用多条if语句更好? 9 1.4 switch语句必须包含default分支吗? 10 1.5 switch语句的最后一个分支可以不要break语句吗? 11 1.6 除了在for语句中之外,在哪些情况下还要使用逗号...

    会计理论考试题

    13.微机的键盘是一种分离式的智能键盘,通过电缆与主机连接。( Y ) 14.计算机的常用输出设备有打印机和键盘。( N) 15.汉字语音识别输入技术属于汉字智能输入技术。( Y ) 16.硬盘安装在主机箱内,一般用符号C:...

    软件工程-理论与实践(许家珆)习题答案

    多视点方法也是管理需求变化的一种新方法,它可以用于管理不一致性, 并进行关于变化的推理。 2. M公司的软件产品以开发实验型的新软件为主。用瀑布模型进行软件开发已经有近十年了,并取得了一些成功。若你作为一...

    excel的使用

    合并不同单元格的内容,还有一种方法是利用CONCATENATE函数,此函数的作用是将若干文字串合并到一个字串中,具体操作为“=CONCATENATE(B1,C1)”。比如,假设在某一河流生态调查工作表中,B2包含“物种”、B3包含...

    用C编写班级成绩管理系统

    予我耐心解答的老师和同学,是他们为我小程序的成功起到了关键性的作用,那么多个日夜,如此多的困难,同学们勤恳塌实,从开始到结束,没有显出一点倦意,始终热情高涨,我感谢这种氛围,感谢学校提供的良好条件。...

    Java的六大问题你都懂了吗

    也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中...

Global site tag (gtag.js) - Google Analytics