if/else的優化方法
1)if/else 語句塊的順序
首先處理正邏輯而不是負邏輯
先處理簡單的情況
先處理有趣的或者是可疑的情況
2)通過提早返回減少嵌套
3)總結變量
用一個短很多的名字來代替一大塊代碼,這就是總結變量。
使用德摩根定理,分解復制的判斷邏輯
拆分巨大的語句,讓語句更容易快速閱讀
4)分析函數(或代碼塊)畫出邏輯樹
邏輯樹是整合1)和2)兩個部分,為了理清復雜if語句邏輯二產生的。
邏輯樹的結構與哈夫曼樹類似
邏輯樹規則:(模塊的定義:每一個if/else的分支即為一個模塊)
1.每個模塊都是一個根結點,每一個根結點都會結束函數運行。
2.同等級的模塊(即if語句的正反兩面),無子模塊的模塊(內部無if語句)優先級高於擁有子模塊的模塊(內部嵌套if語句)
3.同等級和同條件(兩個模塊都擁有子模塊或者都沒有子模塊)的情況下,使用率高的模塊優先級高於使用率低的
4.若模塊中包含子模塊,子模塊的優先級高於父模塊。
如下程序
if(user_result == SUCCESS ){ if( permission_result != SUCCESS){ reply.WriteErrors("error reading permissions"); reply.Done(); return; } reply.WriteErrors(""); }else{ reply.WriteErrors(user_result); } reply.Done();
return;
可將程序分為綠、紅、紫三模塊,藍色是前置條件,黑色是共有部分。
根據上述規則
1.根據規則2,紫、紅兩個屬於同等級模塊,但是由於紅色模塊中包含一個子模塊,所以紅色模塊優先級低於紫色模塊
2.根據規則4,綠色模塊屬於紅色模塊子模塊,所以綠色模塊優先級高於紅色模塊
3.根據1,2,函數的優先級排列由高到低為:紫色>綠色>紅色
結果為:
if(user_result != SUCCESS){ reply.WriteErrors(user_result); reply.Done(); return; } if(permission_result != SUCCESS){ reply.WriteErrors(permission_result); reply.Done(); return; } reply.WriteErrors(""); reply.Done();
return;