浅谈函数参数中的引用传递

在函数调用中,参数一般分为值参数和引用参数,这个概念一般比较容易理念,原本并没有打算开篇记录。然而在最近阅读《重构-改善既有代码的设计》时,在看到Remove Assignments to Parameters的重构规则时,才发现理解这方面的内容对于编写良好的代码是有一定的辅助改善的作用的。
所以特地写下本文,以记录和阐述自己的理解,希望能够在今后指导自己或者其他的读者,能够直接避免这方面的设计。

先说说参数的问题,一般来说,参数可以统一的认为是值传递,无论是值还是对象引用。了解C的同学可能知道,对象引用其实就是一个内存地址,我们访问对象,都是通过这个地址去访问的。所以当其作为参数时,可以理解就是一个int型的数据,就像普通数据那样,会将数据赋值给参数变量(值对象直接赋值,引用对象就是内存地址的值传递)。

var obj=new Person();//为了概念区分,定义一个Person对象
obj.name="name";
function paramTest(param)
{
   console.log(param.name);//变量obj的name属性,通过param保存的int地址查找
   param.name="changed name";//obj的name属性改变
   param=new Object();//param 代表新对象的内存地址,obj的地址是param原来的值
   param.nameNew="new name";
}
paramTest(obj);//传参obj对象进去
console.log(obj.nameNew);//obj代表的是Person的值,所以无nameNew属性

在函数里面的操作,引用类型可以影响到原有的对象,但是当new新的Object的时候,这个int值改变了,param的值变成了Object对象的地址,之后对于param的操作都是针对新地址,新的对象的,自然不会影响param参数原来代表的对象。
因此当我们在赋值之后,对参数抱有其他的操作期待时,自然会失望。

而在函数设计中,我们应该避免对参数直接赋值,这也是在重构时,需要遵循的处理规则。
对于值类型的参数,可能只是使得函数显得不那么清晰直观,然后对于引用类型参数,如果我们重新赋值,并不会改变参数原值所代表的对象。如果此时原对象已经处理完全,函数后期不再需要,那也没特别大的必要,新的对象也不如重新使用一个新的变量,定义一个更加符合其职责的变量名。你并没有浪费很多空间,只是一个int型内存地址的空间。

曾经我就因为快速编码,而没有深思造成过这样的疑惑,我再使用曾经我在C#使用委托处理一个对象的特殊情况时,业务场景是将对象重置为null,代表无效数据,返回时,对这个数据进行丢弃处理。最初设计我直接将对象赋值为null,结果可想而知。

因此,我比较认同“不要对参数进行赋值”这个原则,至少能够让代码的设计更加合理、清晰、直观。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途
转载请保持完整性并注明来源链接
http://skysper.me/2016/08/talk-about-parameters-assignment
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值