1. 程式人生 > >重構改善既有代碼設計--重構手法07:Remove Assignments to Parameters (移除對參數的賦值)

重構改善既有代碼設計--重構手法07:Remove Assignments to Parameters (移除對參數的賦值)

改善 產生 移除 你在 nal 處理 other 問題 多少

代碼對一個 參數賦值。以一個臨時變量取代該參數的位置。

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

動機:要清楚“對參數賦值”這個說法的意思。如果你把一個名為foo的對象作為參數傳給某個函數,那麽“對參數賦值”意味著改變foo,使它引用另外一個對象。如果你在“被傳入對象”身上進行什麽操作,那沒什麽問題。這裏只針對“foo被改而指向另一個對象”這種情況來討論。

 Void aMethod(Object    foo)

{

      Foo.ModifyInSomeWay();

      Foo=anotherObject;

}

這樣的做法降低了代碼的清晰度,而且混用了按值傳遞和按引用傳遞這2種參數傳遞方式。

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

另一個讓人糊塗的地方時函數本體內。如果你只以參數表示“被傳遞進來的東西”。那麽代碼會清晰地多,因為這種用法在所有語言都表現出相同語義。

做法:1、建立一個臨時變量,把待處理的參數值賦予它。

2、以“對參數的賦值”為界,將其後所有對此參數的引用點,全部替換為“對此臨時變量的引用”。

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

4、編譯、測試。如果代碼的語義是按引用傳遞的,請在調用端檢查調用後是否還使用了這個參數,也要檢查有多少個按引用傳遞的參數被賦值後又被調用。請盡量只以rteturn方式返回一個值。如果需要發揮的值不止一個,看看可否把需返回的大堆數據變成單一對象,或幹脆為每個返回值設計對應的一個單獨函數。

總結:一句話,就是對於傳進來的參數如果是傳值方式,不要直接對參數在代碼函數中賦值,因為這種賦值其有效域就在本身這個函數中,為此通常我們將參數前面都加上final,防止其對參數進行賦值,一般都用臨時變量代替,一旦產生臨時變量就可以采用前面的技巧了。

重構改善既有代碼設計--重構手法07:Remove Assignments to Parameters (移除對參數的賦值)