`

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

阅读更多

 

编程规范:判断语句,不要一下子判断多个条件
 
例如:
(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语句里判断很多条件,的确能减少好几行代码,可是,只要代码清晰易懂,多写几行代码又有什么不可以呢? 
       有时候,就得用最基本的方法来表达业务逻辑,这需要有脚踏实地的态度,平和的心态。一想省事,往往到最后就会发现路走错了。再者,就是编程者老老实实的态度,平凡朴实的编码。
 
 
 
 
 
 
 

 

分享到:
评论

相关推荐

    Python基础教程-2.1python条件判断语句.pdf

    3. **if-elif-else判断语句**:当有多个条件需要检查时,可以使用elif来添加更多条件分支。比如,根据剩余的钱数购买不同价位的食品。这样,程序会依次检查每个条件,直到找到满足的条件并执行相应的动作,或者所有...

    成功软件开发者的9种编程习惯

    4. **谨慎使用if语句**:避免过度使用if语句,尤其是当多个if语句形成嵌套时。考虑使用else if或switch-case结构来简化条件判断。这不仅可以使代码更简洁,还能降低出错的可能性。 5. **避免滥用程序切割(Block)*...

    精彩编程与编程技巧-如何过滤键盘录入...

    总之,“精彩编程与编程技巧-如何过滤键盘录入”所涉及的知识点不仅限于VB编程语言本身,还涵盖了Windows API函数的使用、钩子机制的应用等多个方面。这些知识点对于希望深入了解Windows编程和提升编程技巧的开发者...

    详解写好JS条件语句的5条守则

    在JavaScript编程中,条件语句是基本控制结构之一,用于根据不同的条件执行不同的代码块。为了编写出更加高效和可维护的代码,以下5条守则可以帮助开发者写出更优质和清晰的JavaScript条件语句。 守则1:多重判断时...

    C#编程-3 条件判断;.ppt

    通过学习这些条件判断语句,开发者能够编写出具有分支逻辑的程序,根据不同的条件执行不同的操作,这是编写复杂程序的基础。在实际开发中,if语句和switch语句经常被用来处理用户输入、控制程序流程、做决策等。熟练...

    SIMATIC S7-300和S7-400语句表STL编程手册.pdf

    2. **比较指令**:用于比较两个数值或变量,常用于条件判断。 3. **转换指令**:将数据在不同格式之间进行转换,如位到字、字到双字等。 4. **计数器指令**:用于计数,如递增、递减以及边沿检测等,常见于计数器...

    PB基础语句

    需要注意的是,PowerScript 不支持多重赋值,一条赋值语句只能对一个变量赋值,不能同时对多个变量赋值。 二、条件语句 条件语句是 PowerBuilder 语言中用来控制程序流程的语句,包括 IF 语句和 CHOOSE CASE 语句...

    第09章、条件语句(理论课).ppt

    1. **简单if语句**:只包含一个条件表达式和一条要执行的语句。 ```c if (条件表达式) { // 条件成立时执行的语句 } ``` 示例: ```c if (max ) max = b; ``` 2. **if-else语句**:当需要根据条件选择两...

    PB基本语句循环语句[参考].pdf

    需要注意的是,PowerScript 的赋值语句不支持多重赋值,一条赋值语句只能对一个变量赋值,不能同时对多个变量赋值。 条件语句 条件语句有两种形式:单行 IF 语句和多行 IF 语句。 单行 IF 语句 单行 IF 语句的...

    【视频】Excel精讲专题VBA-判断语句

    在这个“Excel精讲专题VBA-判断语句”的视频教程中,我们将深入探讨VBA中的条件判断,这是编程中最基础也是最重要的概念之一。 首先,VBA中的判断语句允许我们在程序执行过程中做出决策,根据特定条件决定执行哪段...

    tc编程错误手册下载,很好的

    - **含义**:复合语句(即由多个语句组成的语句块)缺失。 - **解决方法**: 1. 确保所有复合语句都使用大括号包围。 2. 检查是否有遗漏的大括号。 - **Conflicting type modifiers(类型修饰符冲突)** - **...

    PHP编程基础--表达式与语句.ppt

    if-elseif-else语句支持多重判断,如果多个条件表达式中有一个为真,则执行对应语句块,否则执行else后面的语句块。switch语句适用于根据变量的值匹配不同情况,与case常量匹配时执行相应语句,default语句块用于...

    选择结构程序设计(if-else语句).ppt

    选择结构程序设计是计算机编程中的一种基本结构,if-else语句是选择结构的基本形式,用于判断条件是否成立,如果成立则执行相应的操作,如果不成立则执行else子句中的操作。if语句的应用非常广泛,例如求二元一次...

    ti nspire编程初步

    控制指令主要是If语句,用于编写条件判断逻辑,它有多种形式,包括基础形式If[条件a][命令a],带有Then和EndIf的多行形式,包含Else的双条件形式,以及包含多个ElseIf的多条件判断形式。 通过以上的知识框架,可以...

    英文编程英语.txt

    - **回调(Callback)**:是一种编程技巧,允许函数在其完成执行后调用另一个函数。回调通常用于处理异步操作的结果。 ### 40. 函数调用运算符 (Call Operator) - **函数调用运算符(Call Operator)**:在某些编程...

    执行一条sql语句update多条记录实现思路

    对于批量更新,可以将多个值组合成一个大INSERT语句,以减少数据库交互。 总结来说,处理多条记录的更新时,应尽量避免循环执行UPDATE语句,而是采用CASE语句或INSERT ... ON DUPLICATE KEY UPDATE。这不仅能提高...

    确定三角形形状编程题

    在本编程题中,我们面临的任务是通过编程来确定一个三角形的形状,这通常涉及到三角形的边长检查。三角形有三种基本形状:等腰三角形、等边三角形和一般三角形。让我们详细探讨一下如何用C++解决这个问题。 首先,...

    易语言源码易语言滚动条位置判断源码.rar

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语句,降低了编程的门槛,使得更多非计算机专业的人也能轻松学习编程。在本压缩包“易语言源码易语言滚动条位置判断源码.rar”中,包含的是关于易语言中...

    MATLAB编程快速入门 MATLAB编程基础入门教程 第3章 分支语句和编程设计 共39页.pdf

    首先,章节介绍了自上而下的编程方法,这是一种常见的编程思维方式,即按照代码的顺序依次执行,遇到分支语句时,根据条件选择执行路径。这种编程方法易于理解和调试,是初学者的良好起点。 接着,章节深入探讨了...

    ExcelVBA编程教程.doc

    本教程涵盖了 Excel VBA 编程的基础知识,包括标识符、运算符、数据类型、变量与常量、数组、注释和赋值语句、书写规范和判断语句等八个部分。 第一节:标识符 标识符是一种标识变量、常量、过程、函数、类等语言...

Global site tag (gtag.js) - Google Analytics