避免嵌套条件式
嵌套条件式
今天在面对一个一般复杂的业务情况时,对着活动图写了一个嵌套三层的逻辑判断,review代码时被别人提醒了,在指导下也将嵌套三层的逻辑判断压缩到约等于两层,顿时代码整体简洁已读,结构也很清晰,不禁感慨如果处处注意代码的优美和易读性,写代码其实也可以是很美的事情。
写代码经常会遇到逻辑稍微复杂点的情况,比如逻辑分支众多,直接理解来写代码可能会出现嵌套多个 “if-else” 的情况,嵌套层数大于两层以后代码对于后人来看增加了很多成本。
遇到复杂逻辑的流程时,需要分解成简单易懂的逻辑代码,我能想到的方法有:拆分代码逻辑使功能模块化、使用卫语句。
使用函数模块化
对一些嵌套的逻辑,可以提取出其中的一部分代码,封装成一个函数来使用,对于多种情况下可能涉及到的差不多的操作,也可以直接提取出其中相同的部分来模块化实现。
卫语句
卫语句的核心在于:在多层逻辑判断中,如果某个分支出现的请看股较于其他分支比较特殊,给它提出来单独处理,如果它真的发生了,做一些必要的整理工作,然后返回退出。
一下是一个卫语句的例子:1
2
3
4
5
6
7
8
9
10
11
12
13public void func(){
if(isHuman()){
System.out.println("是个人");
}else{
if(isAlien()){
System.out.println("是个外星人");
}else{
if(isChenglong()){
System.out.println("是成龙");
}
}
}
}
这样的代码如果再多几层嵌套,给他人看起来的时候可能需要花不少时间理清楚你这里面不同情况的分支是什么条件过来的。
使用卫语句来改造就能在保持逻辑的情况下更加清晰明了。1
2
3
4
5
6
7
8
9
10
11
12
13
14public void func(){
if(isHuman()){
System.out.println("是个人");
return;
}
if(isMan()){
System.out.println("是个外星人");
return;
}
if(isChenglong()){
System.out.println("是成龙");
return;
}
}
卫语句可以把我们的视线从异常处理中解放出来,集中精力到正常处理的代码中。
Tips
想要自己的代码在复杂逻辑下依旧保持美感和清晰的结构,关键还是理解整个代码逻辑,能清楚的认识到每一个情况的输入输出,充分认识到其中每个情况的条件出现概率,例如提取出出现概率罕见的情况直接单独检查,及早的依据结果返回。