假如你有一組巢狀式條件, 且很難去了解正常的程式碼執行流程.
此時使用Guard Clauses來重構
假設有個腳踏車特技選手, 根據他的表演內容而獲得不同分數.
再假設選手有四種表現狀況: 摔車、後空翻、側身翻與正常表演.
public class BicyclePlayer
{
public double GetScore()
{
double result;
if (isFellOff)
{
result = FellOffScore();
}
else
{
if(isBackflipDone)
{
result = BackflipScore();
}
else
{
if (isSideSpinDone)
{
result = SideSpinScore();
}
else
{
result = NormalScore();
}
}
}
return result;
}
}
發現到, 這幾個巢狀條件式不太好理解, 因此我們將這些特技表演的條件式做"攤平"
public class BicyclePlayer
{
public double GetScore()
{
if (isFellOff)
{
return FellOffScore();
}
if (isBackflipDone)
{
return BackflipScore();
}
if (isSideSpinDone)
{
return SideSpinScore();
}
return NormalScore();
}
}
經過這種重構, 可以很快了解每一個條件的優先順序.
有開發經驗的人會發現, 當巢狀式條件式越來越多的時候, 將會形成一種"波動拳縮排"
如下圖:
(圖片來源: https://medium.com/@brooknovak/why-you-should-reduce-nesting-blocks-in-your-code-with-practical-refactoring-tips-11c122735559)
這種程式碼到底該如何維護...?無法想像維護要花多少精力.