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

来源:互联网 发布:淘宝客服工作内容介绍 编辑:程序博客网 时间:2024/05/21 22:45

在函数调用中,参数一般分为值参数和引用参数,这个概念一般比较容易理念,原本并没有打算开篇记录。然而在最近阅读《重构-改善既有代码的设计》时,在看到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
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机丢了里边有穿内衣照片怎么办 脸上不知是过敏还是湿疹流水怎么办 一个月的宝宝鼻子不通气怎么办 六个月的宝宝有清水鼻涕怎么办 一岁三个月宝宝流清鼻涕怎么办 宝宝流清水鼻涕怎么办最简单方法 8个月宝宝流清鼻涕怎么办 7个月宝宝流清鼻涕怎么办 9个月宝宝流清鼻涕怎么办 十一个月宝宝流清鼻涕怎么办 18个月宝宝咳嗽有痰怎么办 2个月宝宝鼻子不通气怎么办 两个月的宝宝鼻塞不通气怎么办 两个月大的宝宝鼻子不通气怎么办 宝宝6个月咳嗽有痰怎么办 6个月的宝宝有痰怎么办 小孩流有点咳嗽和脓鼻涕怎么办 6个月的宝宝流鼻涕该怎么办? 小孩鼻塞不流鼻涕总吸鼻子怎么办 四个多月宝宝感冒鼻塞严重怎么办 怀孕6个月严重感冒鼻塞怎么办 16个月的宝宝上火流鼻血怎么办 小狗咳嗽打了针还不好怎么办 孕妇感冒后鼻涕带血口腔发炎怎么办 宝宝出生17天睡眠不安稳怎么办 月子里宝宝睡觉老是睡不安稳怎么办 孕妇晚期咳嗽鼻涕黄咽喉痛怎么办 狗狗流脓鼻涕拉稀没食欲怎么办 孕妇眼睛充血很快就有眼屎怎么办 婴儿的眼睛流泪生眼屎怎么办呀 刚出生的婴儿眼睛有眼屎怎么办 25天的婴儿鼻子有鼻屎不通怎么办 一个月的宝宝好多鼻屎怎么办 隆鼻取线的时候好多鼻屎怎么办 小孩流浓鼻涕怎么办最简单方法 小孩流黄鼻涕怎么办最简单方法 一岁八个月宝宝鼻涕和痰多怎么办 空调铜管过不了预埋管的弯头怎么办 如果朝鲜和韩国打起来中国怎么办 寄信时不知道对方的邮编怎么办 地下钱庄转账后银行户被冻结怎么办