Remove Assignments to Parameters (移除对参数的赋值)
2013-04-26 00:00
393 查看
Summary:
以一个临时变量取代该参数的位置。Motivation:
首先,我们解释清楚“对参数赋值”这个说法的意思。如果你把一个名为foo的对象作为参数传给某个函数,那么,“对参数赋值”意味着改变foo,使它引用另一个对象。如果你在“被传入对象”身上进行什么操作,那没问题。我们只针对“foo被该而指向另一个对象”这种情况来讨论:void amethod(Object foo){
foo.modifyInSomeWay(); //that’s OK
foo=anotherObject; //trouble and despair will follow you
这种做法降低了代码的清晰度,而且混用了按值传递和按引用传递这两种参数传递方式。Java 只采用按值传递方式,我们的讨论也正是基于这一点。
在按值传递的情况下,对参数的任何修改,都不会对调用端造成任何影响。那些用过按引用传递方式的人可能会在这一点上犯糊涂。
另一个让人糊涂的地方是函数本体内。如果你只以参数表示“被传递进来的东西”,那么代码会清晰得多,因为这种用法在所有语言中都表现出相同语义。
在java中,不要对参数赋值:如果你看到手上的代码已经这样做了,请使用Remove Assignments to Parameters
当然,面对那些使用“出参数”的语言,你不必尊徐这条规则。
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; }
相关文章推荐
- 重构手法07:Remove Assignments to Parameters (移除对参数的赋值)
- 重新组织你的函数之七 :Remove Assignments to Parameters(移除对参数的赋值动作)
- 重构----Remove Assignments to Parameters (移除对参数的赋值动作)
- 重构改善既有代码设计--重构手法07:Remove Assignments to Parameters (移除对参数的赋值)
- java重构学习6:移除对参数的赋值(Remove Assignments to Parameters)
- 《Refactoring》,Remove Assignments to Paraments(移除对参数的赋值)
- 6.7 Remove Assigments to Parameters(移除对参数的赋值)
- Remove Assignment to Parameters(移除对参数的赋值动作)
- 6.7 Remove Assigments to Parameters(移除对参数的赋值)
- Remove Assignments to Parameters
- 『重构--改善既有代码的设计』读书笔记----Remove Assignments to Parameters
- java 代码细节(Remove Assignments to Parameters)
- SSIS Passing Parameters to an ADO .NET Source query;向ado.net数据源传递参数。
- .NET手记-Autofac进阶(传递注册参数 Passing Parameters to Register)
- 代码重构之移除对参数的赋值
- 重构笔记——移除对参数的赋值
- How to remove the dotted border on Active link state---移除链接激活时出现的虚线
- 重构笔记——移除对参数的赋值
- 条款24:若所有参数皆需要类型转换,请为此采用non-member函数(Declare non-member functions when type conversions should apply to all parameters)
- 第2章 重新组织函数(3):引入解释性变量、分解临时变量和移除对参数的赋值