<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### Remove Assignments to Parameters(移除對參數的賦值動作) 你的代碼對一個參數進行賦值動作。 以一個臨時變量取代該參數的位置。 ~~~ int discount (int inputVal, int quantity, int yearToDate) { if (inputVal > 50) inputVal -= 2; ~~~ => ~~~ int discount (int inputVal, int quantity, int yearToDate) { int result = inputVal; if (inputVal > 50) result -= 2; ~~~ **動機(Motivation)** 首先,我要確定大家都清楚「對參數賦值」這個說法的意思。如果你把一個名為foo 的對象作為參數傳給某個函數,那么「對參數賦值」意味改變foo,使它引用(參考、指涉、指向)另一個對象。如果你在「被傳入對象」身上進行什么操作,那沒問題,我也總是這樣干。我只針對「foo被改而指向(引用)完全不同的另一個對象」這種情況來討論: ~~~ void aMethod(Object foo) { foo.modifyInSomeWay(); // that's OK foo = anotherObject; // trouble and despair will follow you ~~~ 我之所以不喜歡這樣的作法,因為它降低了代碼的清晰度,而且混淆了 pass by value(傳值〕和 pass by reference (傳址)這兩種參數傳遞方式。Java只采用 pass by value傳遞方式(稍后討論),我們的討論也正是基于這一點。 在 pass by value情況下,對參數的任何修改,都不會對調用端造成任何影響。那些用過 pass by reference的人可能會在這一點上犯糊涂。 另一個讓人糊涂的地方是函數本體內。如果你只以參數表示「被傳遞進來的東西」,那么代碼會清晰得多,因為這種用法在所有語言中都表現出相同語義。 在Java中,不要對參數賦值;如果你看到手上的代碼已經這樣做了,請使用Remove Assignments to Parameters。 當然,面對那些使用「輸出式參數」( output parameters)的語言,你不必遵循這條規則。不過在那些語言中我會盡量少用輸出式參數。 **作法(Mechanics)** - 建立一個臨時變量,把待處理的參數值賦予它。 - 以「對參數的賦值動作」為界,將其后所有對此參數的引用點,全部替換為「對此臨時變量的引用動作」。 - 修改賦值語句,使其改為對新建之臨時變量賦值。 - 編譯,測試。 - 如果代碼的語義是 pass by reference,請在調用端檢查調用后是否還使用了這個參數。也要檢查有多少個 pass by reference參數「被賦值后又被使用」。請盡量只以return方式返回一個值。如果需要返回的值不只一個,看看可否把需返回的大堆數據變成單一對象,或千脆為每個返回值設計對應的一個獨立函數。 **范例(Example)** 我從下列這段簡單代碼開始: ~~~ int discount (int inputVal, int quantity, int yearToDate) { if (inputVal > 50) inputVal -= 2; if (quantity > 100) inputVal -= 1; if (yearToDate > 10000) inputVal -= 4; return inputVal; } ~~~ 以臨時變量取代對參數的賦值動作,得到下列代碼: ~~~ int discount (int inputVal, int quantity, int yearToDate) { int result = inputVal; if (inputVal > 50) result -= 2; if (quantity > 100) result -= 1; if (yearToDate > 10000) result -= 4; return result; } ~~~ 還可以為參數加上關鍵詞final,從而強制它遵循「不對參數賦值」這一慣例: ~~~ int discount (final int inputVal, final int quantity, final int yearToDate) { int result = inputVal; if (inputVal > 50) result -= 2; if (quantity > 100) result -= 1; if (yearToDate > 10000) result -= 4; return result; } ~~~ 不過我得承認,我并不經常使用final來修飾參數,因為我發現,對于提高短函數的清晰度,這個辦法并無太大幫助。我通常會在較長的函數中使用它,讓它幫助我檢查參數是否被做了修改。 **Java的pass by value(傳值)** Java使用"pass by value"「函數調用」方式,這常常造成許多人迷惑。在所有地點,Java都嚴格釆用pass by value,所以下列程序: ~~~ class Param { public static void main(String[] args) { int x = 5; triple(x); System.out.println ("x after triple: " + x); } private static void triple(int arg) { arg = arg * 3; System.out.println ("arg in triple: " + arg); } } ~~~ 會產生這樣的輸出: ~~~ arg in triple: 15 x after triple: 5 ~~~ 這段代碼還不至于讓人糊涂。但如果參數中傳遞的是對象,就可能把人弄迷糊了。如果我在程序中以Date對象表示日期,那么下列程序: ~~~ class Param { public static void main(String[] args) { Date d1 = new Date ("1 Apr 98"); nextDateUpdate(d1); System.out.println ("d1 after nextDay: " + d1); Date d2 = new Date ("1 Apr 98"); nextDateReplace(d2); System.out.println ("d2 after nextDay: " + d2); } private static void nextDateUpdate (Date arg) { arg.setDate(arg.getDate() + 1); System.out.println ("arg in nextDay: " + arg); } private static void nextDateReplace (Date arg) { arg = new Date (arg.getYear(), arg.getMonth(), arg.getDate() + 1); System.out.println ("arg in nextDay: " + arg); } } ~~~ 產生的輸出是: ~~~ arg in nextDay: Thu Apr 02 00:00:00 EST 1998 d1 after nextDay: Thu Apr 02 00:00:00 EST 1998 arg in nextDay: Thu Apr 02 00:00:00 EST 1998 d2 after nextDay: Wed Apr 01 00:00:00 EST 1998 ~~~ 從本質上說,object reference是按值傳遞的(passed by value)。因此我可以修改參數對象的內部狀態,但對參數對象重新賦值,沒有意義。 Java1.1及其后版本,允許你將參數標示為final,從而避免函數中對參數賦值。 即使某個參數被標示為final,你仍然可以修改它所指向的對象。我總是把參數視為final,但是我得承認,我很少在參數列(parameter list)中這樣標示它們。
                  <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>

                              哎呀哎呀视频在线观看