Remove Assignments to Parameters (移除對參數的賦值)

Summary:

以一個臨時變量取代該參數的位置。 java

Motivation:

首先,咱們解釋清楚「對參數賦值」這個說法的意思。若是你把一個名爲foo的對象做爲參數傳給某個函數,那麼,「對參數賦值」意味着改變foo,使它引用另外一個對象。若是你在「被傳入對象」身上進行什麼操做,那沒問題。咱們只針對「foo被該而指向另外一個對象」這種狀況來討論: 函數

 void amethod(Object foo){ 測試

   foo.modifyInSomeWay();  //that’s OK spa

  foo=anotherObject;          //trouble and despair will follow you code

這種作法下降了代碼的清晰度,並且混用了按值傳遞和按引用傳遞這兩種參數傳遞方式。Java 只採用按值傳遞方式,咱們的討論也正是基於這一點。 對象

在按值傳遞的狀況下,對參數的任何修改,都不會對調用端形成任何影響。那些用過按引用傳遞方式的人可能會在這一點上犯糊塗。 input

另外一個讓人糊塗的地方是函數本體內。若是你只以參數表示「被傳遞進來的東西」,那麼代碼會清晰得多,由於這種用法在全部語言中都表現出相同語義。 it

在java中,不要對參數賦值:若是你看到手上的代碼已經這樣作了,請使用Remove Assignments  to Parameters io

固然,面對那些使用「出參數」的語言,你沒必要尊徐這條規則。 編譯

Mechanics:

1.創建一個臨時變量,把待處理的參數賦值予它。

2.以「對參數的賦值」爲界,將其後全部對此參數的引用點,所有替換爲「對此臨時變量的引用」

3.修改賦值語句,使其爲對新建之臨時變量賦值。

4. 編譯,測試。

範例

咱們從下面這段簡單的代碼開始

double discount( int inputVal, int quantity, int yearToDate )
    {
        if( inputVal > 50 )
        {
            inputVal -= 2;
        }
        if( quantity > 100 )
        {
            inputVal -= 1;
        }
        if( yearToDate > 10000 )
        {
            inputVal -= 4;
        }
        return inputVal;
    }
以臨時變量取代對參數的賦值動做,獲得下列代碼:
double 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;
    }
相關文章
相關標籤/搜索