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