1. 程式人生 > >Remove Assignment to Parameters(移除對引數的賦值動作)

Remove Assignment 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;

動機:

我只針對[foo被改而指向(引用)完全不同的另一個物件]這種情況來討論:
    void aMethod(Object foo) {
       foo.modifyInSomeWay();   //that's OK
       foo = anotherObject;   //throuble and despair will follow you
    }
我之所以不喜歡這樣的作法,因為它降低了程式碼的清晰度,而且混淆了pass by value(傳值)和pass by reference(傳址)這兩種引數傳遞方式。Java只採用pass by value傳遞方式,我們的討論也正是基於這一點。

在pass by value情況下,對引數的任何修改,都不會呼叫端造成任何影響。那些用過pass by reference的人可能會在這一點上犯糊塗。

作法:

1 建立一個臨時變數,把待處理的引數值賦予它。

2 以[對引數的賦值動作]為界,將其後所有對此引數的引用點,全部替換為[對此臨時變數的引用動作]。

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

4 編譯,測試

如果程式碼的語義是pass by reference,請在呼叫端檢查呼叫後是否還使用了這個引數。也要檢查有多少個pass by reference引數[被賦值後又被使用]。請儘量只以return方式返回一個值。如果需要返回的值不只一個,看看可否把需返回的大堆資料變成單一物件,或乾脆為每個返回值設計對應的一個獨立函式。

int discount(int inputVal, int quantity, int yearToDate) {
    if(inputVal > 50) inputVal -= 2;
    if(quantity > 100) inputVal -= 1;
    if(yearToDate > 1000) 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 > 1000) 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 > 1000) result -= 4;
    return result
}

不過我的承認,我並不經常使用final來修飾引數,因為我發現,對於提高短函式的清晰度,這個辦法並無太大幫助。我通常會在較長的函式中使用它,讓它幫助我檢查引數是否被做了修改。

相關推薦

Remove Assignment to Parameters(引數動作)

int discount(int inputVal, int quantity, int yearToDate) {    if(inputVal > 50) inputVal -= 2;==〉 int discount(int inputVal, int quanti

重構改善既有代碼設計--重構手法07:Remove Assignments to Parameters參數的

改善 產生 移除 你在 nal 處理 other 問題 多少 代碼對一個 參數賦值。以一個臨時變量取代該參數的位置。 int Discount(int inputVal, int quantity, int yearTodate) {

重構改善既有代碼設計--重構手法15:Remove Middle Man (中間人)

rem pan 編譯 dash 委托 重構 man 服務 ide 某個類做了過多的簡單委托動作。讓客戶直接調用受托類。 動機:在Hide Delegate (隱藏委托關系)的“動機”中,談到了“封裝委托對象”的好處。但是這層

LeetCode 203.Remove Linked List Elements (連結串列元素)

題目描述: 刪除連結串列中等於給定值 val 的所有節點。 示例: 輸入: 1->2->6->3->4->5->6, val = 6 輸出: 1->2->3->4->5   AC C++ S

egret之引數的監聽事件

this.selectBtn.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onClickNewIndo.bind(this,this.data), this);//新增監聽事件 public onClickNewIndo

leetcode 402 Remove K Digits(k個數字 貪心)

分析和思路: 就是說給一個字串形式的正數,刪除k個數字,使得字串數字最小 貪心思路 那麼就是每次刪除一個數,每次保證高位最小。 java程式碼: class Solution { public String removeKdigits(String num

[LeetCode] Remove Linked List Elements 連結串列元素

Remove all elements from a linked list of integers that have value val. Example Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val =

three添加和

parameter mesh function remove listen inner set doctype 質變 創建場景在第一章的地方就講過怎麽樣創建一個最基本的場景,這裏不重復了html:部分 <!doctype html><html lang="

83. Remove Duplicates from Sorted List (連結串列中相等的節點)

Given a sorted linked list, delete all duplicates such that each element appear only once. For exa

leetcode 203. Remove Linked List Elements-連結串列元素

【思路】 思路很簡單,遍歷連結串列,如果節點的值等於 val,那麼就將節點移除。這裡新增加一個節點,是為了防止頭結點和 val 相等時無法移除的情況: public ListNode re

LeetCode#203-Remove Linked List Elements-連結串列元素

一、題目 刪除連結串列中等於給定值 val 的所有節點。 示例: 輸入: 1->2->6->3->4->5->6, val = 6 輸出: 1->2->3->4->5 二、題解 解法1:哨兵節點。 初始化一個哨兵節點 solider,並將其 n

PHP在foreach中$value無效,應該用 ‘鍵’ 或者 &$value的形式

image blank key warn 運行 clas 應該 發現 建議 首先我們看下這段代碼: foreach ($data as$value) { $value[‘name‘] = ‘Hehe‘; } $data中原始的數據為: array(

Python學習-解壓可叠代給多個變量

col 如果 可變 home nbsp one nobody lis 輸出 解壓序列賦值給多個對象 任何的序列(或者是可叠代對象)可以通過一個簡單的賦值語句解壓並賦值給多個變量。唯一的前提就是變量的數量必須跟序列元素的數量是一樣的。 >>> data =

php中的

pre 賦值 pan 打印 不同的 public 傳遞 應該 pub 如果現在問你一個問題: <?php class A{ public $a = 1; } $a = new A(); $b = $a; $b->a = 3; print_r($a-&

反射給——類型轉換

-1 microsoft 比較 lai pan eof code edit cti 文章轉自: http://blog.csdn.net/xiaohan2826/article/details/8536074 反射給對象賦值遇到的問題——類型轉換 發布時間:2012-10-

一種簡單的方法,定義實例後以{},比傳統方法更簡潔

method ott static set num arr nbsp st2 () public class Rectangle { public Point TopLeft { get; set; } public Point Botto

python_cookbook之路:數據結構-解壓可叠代給多個變量以及擴展的叠代解壓語法(*)

rec 3.4 open pan spl python res cor coo 1.一一對應: >>> data = [ ‘ACME‘, 50, 91.1, (2012, 12, 21) ] >>> name, shares, pri

Java中List<E>問題(深淺拷貝)

不能 沒有 add size for .get one util contains Java中List<E>對象賦值操作問題 業務需求是:取2個集合中的交集對象並返回。如下代碼,busMap中key值和stocks中Map中的key值相等的對象則返回繼續操作,

javascript - 一種方式

結果 bsp step clas class 賦值 讓我 console obj /** * step1: * 結果為:1,‘2‘ */ let opt = { num: 1, str: ‘2‘

【Java】 foreach陣列問題

  今天寫程式碼時發現瞭如下問題: public class Test { public static void main(String[] args) { int[] arr= new int[5]; for (int a : arr) { a=1; } Sys