什么是衛語句?更優雅的代碼方式


什么是衛語句?更優雅的代碼方式

不知你有沒有被多層嵌套的 if-else 語句所折磨過,就像下面這種 “橫放着的金字塔”:

if(true){ if(true){ if(true){ if(true){ if(true){ if(true){ } } } } } }

實際項目中你要是真敢這樣寫,保證你過幾天就忘了這里面的邏輯是什么。一開始一頓操作猛如虎,到后來懷疑自己二百五。

其實我們仔細看看上面的判斷語句,它們都是在 if 里面的條件是真的情況才執行,也就是說它們都是走的正常情況,才會導致這么無限嵌套下去,那么我們從反面思考是不是就可以終止這種情況呢?也就是我們把不正常的條件先摘出來處理,剩下的就都是正常情況了。這其實就是衛語句的思考模式,也就是逆向思考。衛語句可以減少 if-else 語句嵌套的情況出現。所以在阿里巴巴 Java 規范里也寫到 “多層條件語句建議使用衛語句、策略模式、狀態模式等方式重構。”

為了讓大家對衛語句有一個直觀的認識,我將給大家舉一個例子。if-else 語句一般在 for 循環里面使用,用於分支控制,如求 100 以內同時是 3、4、5 的倍數的題,如果我們根據題目所說的老老實實地判斷符合倍數的情況,將會寫成這樣(假設每個 if 語句只判斷一個條件):

for (int i = 1; i <= 100; i++) { if (i%3 == 0){ if (i%4 == 0){ if (i%5 == 0){ System.out.println(i); } } } }

這就是前面說的 “橫放着的金字塔”,而如果我們逆向思考,從是 3、4、5 的倍數的反面思考,也就是哪些情況不是 3、4、5 的倍數,先把這些情況摘出來,然后結束本次循環,繼續找下一個數。這樣我們就能防止多層嵌套了:

for (int i = 1; i <= 100; i++) { if (i%3 != 0){ continue; } if (i%4 != 0){ continue; } if (i%5 != 0){ continue; } System.out.println(i); }

只有在上面三個條件都不成立的情況下,才會走到最后一步輸出的語句。也就是排除那些不符合條件的情況,剩下的自然就是符合條件的了。希望通過這個小例子能讓你明白到底什么是衛語句。

其實在寫這篇文章之前我也在網上搜了一下什么是衛語句,但都沒有講到精髓上,大都是舉一個例子,然后舉一個反例,沒有提高到思考模式上來。這樣你也只是會這一個例子,如果換了一個你可能又不會了。所以我總結了一下,決定寫一遍講衛語句背后的思考模式的文章,希望大家真正掌握這個編程方式。雖然給大家解釋了什么是衛語句,但是這種逆向思維模型的 if-else 語句為什么叫衛語句我還沒有找到出處,可能它就是保衛代碼不臃腫吧。


原文地址 www.chuckfang.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM