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;
    }
相关文章
相关标签/搜索