繁多的 if else,if 中的 if else,else 中的 if else,這些龐大的邏輯看上去就讓人云山霧繞,是時候祭出重構公式來簡化它了。
思路
重構的思路為:
if 和 else 的邏輯我們只能二選一
對于 if,我們可以在 if 的邏輯塊里加上一個 return,表明執(zhí)行完 if 之后,不再涉及 else 的代碼;對于 else,由于之前已確保 if 的邏輯執(zhí)行后會返回,我們大可放心地將 else 的代碼提出來,去掉 else 這個關鍵字
實戰(zhàn)
一個例子
if ( m_Prop.A == 1 ) {
if ( m_Prop.B == 1 ) {
return "Good";
} else if ( m_Prop.B == 2 ) {
return "Not too bad";
} else {
return "Just so so";
}
} else if ( m_Prop.A == 2 ) {
if ( m_Prop.B == 1 ) {
if ( m_Prop.C == 1 ) {
return "Need improvement";
} else {
return "Need more improvement";
}
} else if ( m_Prop.B == 2 ) {
return "Have a chance to improve";
} else {
return "Too bad";
}
}
先從最外層的 else if ( m_Prop.A == 2 ) 開始修改,去掉 else
if ( m_Prop.A == 1 ) {
if ( m_Prop.B == 1 ) {
return "Good";
} else if ( m_Prop.B == 2 ) {
return "Not too bad";
} else {
return "Just so so";
}
}
if ( m_Prop.A == 2 ) {
if ( m_Prop.B == 1 ) {
if ( m_Prop.C == 1 ) {
return "Need improvement";
} else {
return "Need more improvement";
}
} else if ( m_Prop.B == 2 ) {
return "Have a chance to improve";
} else {
return "Too bad";
}
}
然后以此類推,得到如下代碼
if ( m_Prop.A == 1 ) {
if ( m_Prop.B == 1 ) {
return "Good";
}
if ( m_Prop.B == 2 ) {
return "Not too bad";
}
return "Just so so";
}
if ( m_Prop.A == 2 ) {
if ( m_Prop.B == 1 ) {
if ( m_Prop.C == 1 ) {
return "Need improvement";
}
return "Need more improvement";
}
if ( m_Prop.B == 2 ) {
return "Have a chance to improve";
}
return "Too bad";
}
就這樣,去掉了 else,代碼看起來清晰了很多,心情也變好了。
好處
-
可讀性
當函數中出現任一一個
return,意味著分支到此為止。這樣一個個return,將一塊塊的邏輯分支分段。讀代碼的人只需專心理解每一段的邏輯,而不必耗費精力去深挖該段邏輯之后是否還有額外的處理——因為我們代碼已經return了。 -
避免修改
當然,我們也可以在每個分支的結尾,將返回值賦給一個變量,在函數的末位返回這個變量。這樣保證了函數只有一次返回,并且該處還可以做一些諸如異常捕捉的統(tǒng)一處理。
但是,這樣就沒法保證,這個作為返回值的變量,不會再后續(xù)的處理中被意外地修改。俗話說:夜長夢多。還是該出手時就出手,能返回就返回。