0
点赞
收藏
分享

微信扫一扫

写给所有程序员_if...else简化研究


编程过程中,发现一些if…else写的很乱,需要整理,以下代码中A表示逻辑表达式1,B表示逻辑表达式2。一般情况下不会用A和B,但此处似乎用A和B更清晰,所以用A,B。

简单的与

int num = 0;
if(A){
if(B){
num = 5;
}
}

可转换为:

int num = 0;
if(A && B){
num = 5;
}

简单的或

int num = 0;
if(A){
num = 5;
}else if(B){
num = 5;
}

可转换为:

int num = 5;
if(A || B){
num = 5;
}

复杂变式:A和!A&&B设置相同

int num = 0;
if(A){
num = 5;
}else{
if(B){
num = 5;
}
}

合成步骤1:

int num = 0;
if(A){
num = 5;
}else if(B){
num = 5;
}

结果:

int num = 0;
if(A || B){
num = 5;
}

解析:

A||B含义:A成立时截断,不会判断B,A不成立时,判断B

验算表:

写给所有程序员_if...else简化研究_编程

复杂变式:A&&B和!A设置相同

int num = 0;
if(A){
if(B){
num = 5;
}
}else{
num = 5;
}

合成步骤1:

int num = 0;
if(!A){
num = 5;
}else{
if(B){
num = 5;
}
}

根据复杂变式:A和!A&&B设置相同带入上一个例子,可得:

if(!A||B){

}

不过这几种写法也不绝对要这样变,如果改变后的含义不容易理解,上面那个,我宁可这样写:
int b = 0;
if(A && B){
b = 5;
}else if(!A){
b = 5;
}

复杂变式:与非和非或(数学逻辑)

int b = 0;
if(!(A&&B)){
b = 5;
}

int b = 0;
if(!A || !B){
b = 5;
}

复杂变式:或非和非与(数学逻辑)

int b = 0;
if(!(A||B)){
b = 5;
}

int b = 0;
if(!A && !B){
b = 5;
}

这种修改,是以含义完整性为前提的,否则以后再去检查,看不懂就悲催了,呵呵。尤其是后面两种,因为基于数学逻辑,虽然逻辑没错,但可能一下变得很难理解,这样的话就没有必要修改。

我很讨厌多重嵌套,看起来很糟糕,于是强迫自己计算下,新的逻辑方式可以让代码变得更整洁。通过计算发现了这些规律,特此记录。

附:
(1)

if(A){
if(B){
}else{
}
}

(2)

if(A && B){

}else if(A

就性能而言,(1)的性能优于(2)因为(2)的A逻辑和B逻辑都判断了两次,而(1)个字只判断了一次。此时需要做权衡,可以使用拆分到函数的方式降层(看起来)来保证性能;如果A和B的逻辑判断不复杂,可忽略性能问题。
(3)拆分到函数:

if(A){
checkB();

private void checkB(){
if(B){
}else{
}
}


举报

相关推荐

0 条评论