首页 新闻 会员 周边 捐助

对象作为参数传递的疑问?

0
悬赏园豆:10 [已解决问题] 解决于 2018-02-01 20:26

对象作为参数传递给方法,方法内部把对象的部分属性修改了,在面向接口编程的情况下,方法调用结束后,怎么能知道哪些属性被修改了?

在开发和后期维护阅读代码时都是令人很头疼的。仅对于对象作为参数传递,有没有更好的方式或者想法呢。

junlu的主页 junlu | 菜鸟二级 | 园豆:204
提问于:2018-01-27 16:29
< >
分享
最佳答案
0

一个对象,交于一个方法(不论是谁的方法)来处理的时候,肯定涉及到被读取、甚至是修改。如果是调用者不应该修改,却做了修改的操作,这本身就是代码写得有问题,必须要检查出来,并且给予修正。如果条件不允许检查出代码并修改,同时又要保证执行之后,对象保持原样,那么,你只能deepcopy一份对象,将deepcopy出来的对象交于这个方法处理,以此来保证原有的对象。还有一种情况,不知道你是不是这样的需求,就是,希望编码这个方法的人,操作这个对象的时候,本身就操作不了,如果是这样,你只能使用富血对象,也就是,几乎所有对这个对象的操作,都封装在这个对象的内部,然后这个对象的属性使用public string Name{get;private set;}来实现。这样,如果你把这个对象,传给了其它对象的方法,他们是无法操作Name这个属性的,但是,这样开疑增加了项目的复杂度,但是,在实现没有办法的情况下,也只能通过这种方式来实现。

收获园豆:10
ensleep | 小虾三级 |园豆:1682 | 2018-01-31 09:54

谢谢您的回复,对我的帮助很大!

junlu | 园豆:204 (菜鸟二级) | 2018-02-01 20:26
其他回答(2)
0

在set方法中记下来就行了三。

比如类似微软那个INotifyPropertyChanged(貌似叫这个)接口。

花飘水流兮 | 园豆:13595 (专家六级) | 2018-01-27 16:32

数据绑定,界面数据呈现很管用,但是backend开发不奏效。例如Web开发的Controller调用Service的方法。

支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-01-27 16:52

@junlu: 这跟绑定有什么关系,就是说别个操作你记下来,不记下来,那你怎么知道。至于怎么记,如何记那是你根据上下文具体代码的事

支持(0) 反对(0) 花飘水流兮 | 园豆:13595 (专家六级) | 2018-01-27 17:38
0

面向对象思想中,对象作为参数传入的目的就是修改对象中的属性信息,以此来改变对象的状态的。如果你不想修改而只要传入数据,你可以将对象属性设置为只读的。

授之以渔 | 园豆:1107 (小虾三级) | 2018-01-27 16:46

这个方法不可行,设置为只读的,不仅方法内部不能修改,任何地方都不能修改了。

支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-01-27 16:49

@junlu: 面向对象编程中,除了方法内部可以写代码,还有什么地方能执行代码?一个对象的信息要么在别的对象的方法中读写、要么在自己的方法中读写。应该没有其他地方能读写对象属性了吧。

支持(0) 反对(0) 授之以渔 | 园豆:1107 (小虾三级) | 2018-01-27 16:52

@授之以渔: 应用场景:Web开发,Controller调用Servcie的方法,传递一个DTO对象通过返回值返回数据,但是Servcie里又把DTO对象的属性给修改了。方法调用结束返回返回值,程序继续执行,在读取DTO的属性时发现莫名的被修改了(凶手就是Servcie)。该如何避免在Service被非法修改,同时Controller可以正常访问?

支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-01-27 17:01

@junlu: 我的理解中,dto对象是作为数据传输实体,是不需要修改的,是个值类型,设置为只读也可以。

支持(0) 反对(0) 授之以渔 | 园豆:1107 (小虾三级) | 2018-01-27 17:11

@授之以渔: 如果设置为只读的,由界面传输到Controller,对象的属性都没有办法set的。

支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-01-27 17:23

@junlu: 在controller进行vo到dto转换,是直接新建dto对象,而不是改变已有dto的属性。我的理解。

支持(0) 反对(0) 授之以渔 | 园豆:1107 (小虾三级) | 2018-01-27 17:26

@授之以渔: 感谢您的解答。

支持(0) 反对(0) junlu | 园豆:204 (菜鸟二级) | 2018-01-27 17:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册