<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### Replace Nested Conditional with Guard Clauses(以衛語句取代嵌套條件式) 函數中的條件邏輯(conditional logic)使人難以看清正常的執行路徑。 使用衛語句(guard clauses)表現所有特殊情況。 ~~~ double getPayAmount() { double result; if (_isDead) result = deadAmount(); else { if (_isSeparated) result = separatedAmount(); else { if (_isRetired) result = retiredAmount(); else result = normalPayAmount(); }; } return result; }; ~~~ => ~~~ double getPayAmount() { if (_isDead) return deadAmount(); if (_isSeparated) return separatedAmount(); if (_isRetired) return retiredAmount(); return normalPayAmount(); }; ~~~ **動機(Motivation)** 根據我的經驗,條件式通常有兩種呈現形式。第一種形式是:所有分支都屬于正常行為。第二種形式則是:條件式提供的答案中只有一種是正常行為,其他都是不常見的情況。 這兩類條件式有不同的用途,這一點應該通過代碼表現出來。如果兩條分支都是正常行為,就應該使用形如「if…then…」的條件式;如果某個條件極其罕見,就應該單獨檢查該條件,并在該條件為真時立刻從函數中返回。這樣的單獨檢查常常被稱為「衛語句(guard clauses)」[Beck]。 Replace Nested Conditional with Guard Clauses 的精髓就是:給某一條分支以特別的重視。如果使用if-then-else 結構,你對if 分支和else 分支的重視是同等的。 這樣的代碼結構傳遞給閱讀者的消息就是:各個分支有同樣的重要性。衛語句(guard clauses)就不同了,它告訴閱讀者:『這種情況很罕見,如果它真的發生了,請做 一些必要的整理工作,然后退出。』 「每個函數只能有一個入口和一個出口」的觀念,根深蒂固于某些程序員的腦海里。 我發現,當我處理他們編寫的代碼時,我經常需要使用Replace Nested Conditional with Guard Clauses。現今的編程語言都會強制保證每個函數只有一個入口, 至于「單一出口」規則,其實不是那么有用。在我看來,保持代碼清晰才是最關鍵的:如果「單一出口」能使這個函數更清楚易讀,那么就使用單一出口;否則就不必這么做。 **作法(Mechanics)** - 對于每個檢查,放進一個衛語句(guard clauses)。 - 衛語句要不就從函數中返回,要不就拋出一個異常(exception)。 - 每次將「條件檢查」替換成「衛語句」后,編譯并測試。 - 如果所有衛語句都導致相同結果,請使用Consolidate Conditional Expressions。 **范例:(Example)** 想像一個薪資系統,其中以特殊規則處理死亡員工、駐外員工、退休員工的薪資。這些情況不常有,但的確偶而會出現。 假設我在這個系統中看到下列代碼: ~~~ double getPayAmount() { double result; if (_isDead) result = deadAmount(); else { if (_isSeparated) result = separatedAmount(); else { if (_isRetired) result = retiredAmount(); else result = normalPayAmount(); }; } return result; }; ~~~ 在這段代碼中,非正常情況的檢查掩蓋了正常情況的檢查,所以我應該使用『衛語句」來取代這些檢查,以提高程序清晰度。我可以逐一引入衛語句。讓我們從最上面的條件檢查動作開始: ~~~ double getPayAmount() { double result; if (_isDead) return deadAmount(); if (_isSeparated) result = separatedAmount(); else { if (_isRetired) result = retiredAmount(); else result = normalPayAmount(); }; return result; }; ~~~ 然后,繼續下去,仍然一次替換一個檢查動作: ~~~ double getPayAmount() { double result; if (_isDead) return deadAmount(); if (_isSeparated) return separatedAmount(); if (_isRetired) result = retiredAmount(); else result = normalPayAmount(); return result; }; ~~~ 然后是最后一個: ~~~ double getPayAmount() { double result; if (_isDead) return deadAmount(); if (_isSeparated) return separatedAmount(); if (_isRetired) return retiredAmount(); result = normalPayAmount(); return result; }; ~~~ 此時,result 變量已經沒有價值了,所以我把它刪掉: ~~~ double getPayAmount() { if (_isDead) return deadAmount(); if (_isSeparated) return separatedAmount(); if (_isRetired) return retiredAmount(); return normalPayAmount(); }; ~~~ 嵌套(nested)條件代碼往往由那些深信「每個函數只能有一個出口」的程序員寫出。我發現那條規則(函數只能有一個出口)實在有點太簡單化了。如果對函數剩余部分不再有興趣,當然應該立刻退出。引導閱讀者去看一個沒有用的else 區段,只會妨礙他們的理解。 **范例:將條件逆反(Reversing the Conditions)** 審閱本書初稿時,Joshua Kerievsky 指出:你常常可以將條件表達式逆反,從而實現Replace Nested Conditional with Guard Clauses。為了拯救我可憐的想像力,他還好心幫我想了個例子: ~~~ public double getAdjustedCapital() { double result = 0.0; if (_capital > 0.0) { if (_intRate > 0.0 && _duration > 0.0) { result = (_income / _duration) * ADJ_FACTOR; } } return result; } ~~~ 同樣地,我逐一進行替換。不過這次在插入衛語句(guard clauses)時,我需要將相應的條件逆反過來: ~~~ public double getAdjustedCapital() { double result = 0.0; if (_capital <= 0.0) return result; if (_intRate > 0.0 && _duration > 0.0) { result = (_income / _duration) * ADJ_FACTOR; } return result; } ~~~ 下一個條件稍微復雜一點,所以我分兩步進行逆反。首先加入一個"logical-NOT"操作: ~~~ public double getAdjustedCapital() { double result = 0.0; if (_capital <= 0.0) return result; if (!(_intRate > 0.0 && _duration > 0.0)) return result; result = (_income / _duration) * ADJ_FACTOR; return result; } ~~~ 但是在這樣的條件式中留下一個"logical-NOT",會把我的腦袋擰成一團亂麻,所以我把它簡化成下面這樣: ~~~ public double getAdjustedCapital() { double result = 0.0; if (_capital <= 0.0) return result; if (_intRate <= 0.0 || _duration <= 0.0) return result; result = (_income / _duration) * ADJ_FACTOR; return result; } ~~~ 這時候我比較喜歡在衛語句(guard clause)內返回一個明確值,因為這樣我可以一 目了然地看到衛語句返回的失敗結果。此外,這種時候我也會考慮使用Replace Magic Number with Symbolic Constant 。 ~~~ public double getAdjustedCapital() { double result = 0.0; if (_capital <= 0.0) return 0.0; if (_intRate <= 0.0 || _duration <= 0.0) return 0.0; result = (_income / _duration) * ADJ_FACTOR; return result; } ~~~ 完成替換之后,我同樣可以將臨時變量移除: ~~~ public double getAdjustedCapital() { if (_capital <= 0.0) return 0.0; if (_intRate <= 0.0 || _duration <= 0.0) return 0.0; return (_income / _duration) * ADJ_FACTOR; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看