有点啰嗦的前言
有人喜欢if-else,称之为程序结构化的灵魂。确实,就计算机逻辑来讲,if-else最符合计算机非0即1的逻辑。就连在工作时,项目经理在给我们描述业务逻辑时也会来两句if如何,else如何!但是,也有人对代码中出现过深的if-else嵌套感到深恶痛绝。因为不论是在Debug、功能扩展、后期维护还是项目代码开源共享、项目交接等情况下,若是遇到十几层深度成百上千行的if-else嵌套代码,任何人都会头疼不已。
优缺点
说了这么多,总结一下if-else的优缺点:
优点
1、最容易上手;
2、逻辑性强,在实现业务时比较实用;
缺点
1、嵌套过深,测试困难;
2、维护困难,若要修改外层逻辑有可能会影响到深层次的逻辑;
3、功能扩展可能会出现困难,需要找到对应的分支,重新梳理逻辑;
4、代码臃肿,阅读性差;
总之,if-else在程序设计中是不可避免的,作为程序员能做的就是减少嵌套,提升代码的可阅读性和质量。但是,这些都需要一定的经验,对于新手来说实现功能已经就十分困难了,若还需在过程中考虑这些无疑是雪上加霜。所以,小编就个人经验分享一些小技巧,希望能帮助大家提升代码质量。
switch case替代
这个大家都知道,当判断条件是某个变量的值时,可以用switch case来代替代码中的if-else;
int a = b + c ;if(a == 1){/*doing something*/}else if(a == 2){/*doing something*/}//*****else{/*doing something*/}
替代为:
switch (a){case 1 :{/*doing something*/}break ;case 2 :{/*doing something*/}break ;//***default:{/*doing something*/}break;}
案例
针对后文所提及的方法,有一个很经典的演示案例--输入一个年份,判断是否为闰年。其逻辑是:首先需要判断年份是否能被4整除,能被4整除还需要分整百年和非整百年,整百年还必须被400整除才是闰年。用代码实现如下:
![326e3443e20bf12286adc1851a30b6b8.png](https://img-blog.csdnimg.cn/img_convert/326e3443e20bf12286adc1851a30b6b8.png)
减少没必要的if-else
有时候if只是拿来判断某些变量是否异常,那么主程序那一块没必要加if-else,只需要在异常处加if判断;
如案例可以用这种方法重构如下:
leap=0;if(year%4==0) { leap=1;if(year%100==0) { if(year%400 !=0) leap=0;} }
优化完,明显清爽很多。像上述案例只是赋值用这种重复赋值的方式可以避免掉一部分的else出现,但是如果分支是运行不同的函数呢?此时,就需要换一种方式,那就是提前return,例如:
if(condition){ dosomething(); }else{ dootherthing(); }//采用提前return法则,去掉一个elseif(condition){ dosomething(); return ; } dootherthing();
三目运算符替代
三目运算符可以很好的替代简单的if-else逻辑,还是用案例来演示,用三目运算符重构后:
year%4==0?(year%100 ==0?(year%400==0?1:0):1):0 ;
但是这仅仅只是减少了代码量,在阅读友好性上反而降低了。三目运算符只适合替代简单的if-else;
合并嵌套
通过将判断条件用逻辑运算符&&和||合并,从而减少嵌套。案例代码可以重构为:
leap=0; if(year%4==0 && year%100==0 && year%400==0)leap=1; else if(year%4==0 &&year%100!=0)leap = 1 ;//甚至可以更狠,但是并不建议这么做if(year%4==0 && year%100==0 && year%400==0 || year%4==0 &&year%100!=0)leap=1;
拆分嵌套
通过梳理if-else的嵌套逻辑,将需要深层嵌套的if-else拆分成多个独立的if-else代码块,或者平衡if-else中嵌套深度。案例代码可以重构为:
leap = 0 ;if(year%100==0){if(year%400 ==0) leap = 1 ;}else{if(year%4 == 0)leap = 1 ;}
封装
如果遇到嵌套实在过深没有办法优化的话,可以将上下层尽量剥离并将部分嵌套封装为函数,以传参的方式将条件变量传递给函数。
//将部分嵌套封装为函数int JudgeLeap(int year){ int leap = 0 ;if(year%100==0) { if(year%400==0) leap=1; else leap=0;} else leap=1; return leap ;}//主代码即重构为:if(year%4==0) leap = JudgeLeap(year)else leap = 0 ;
总结
上述各方法并不是独立的,在实际使用过程中可以择优选择一种,也可以组合起来使用;另外还可采用设计模式和类的多态来重构,不过小编个人认为(仅代表个人想法),那已经是属于类的设计层面了,这里就不讨论;