编程过程中,发现一些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
验算表:
复杂变式: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{
}
}