对象作为参数传递给方法,方法内部把对象的部分属性修改了,在面向接口编程的情况下,方法调用结束后,怎么能知道哪些属性被修改了?
在开发和后期维护阅读代码时都是令人很头疼的。仅对于对象作为参数传递,有没有更好的方式或者想法呢。
一个对象,交于一个方法(不论是谁的方法)来处理的时候,肯定涉及到被读取、甚至是修改。如果是调用者不应该修改,却做了修改的操作,这本身就是代码写得有问题,必须要检查出来,并且给予修正。如果条件不允许检查出代码并修改,同时又要保证执行之后,对象保持原样,那么,你只能deepcopy一份对象,将deepcopy出来的对象交于这个方法处理,以此来保证原有的对象。还有一种情况,不知道你是不是这样的需求,就是,希望编码这个方法的人,操作这个对象的时候,本身就操作不了,如果是这样,你只能使用富血对象,也就是,几乎所有对这个对象的操作,都封装在这个对象的内部,然后这个对象的属性使用public string Name{get;private set;}来实现。这样,如果你把这个对象,传给了其它对象的方法,他们是无法操作Name这个属性的,但是,这样开疑增加了项目的复杂度,但是,在实现没有办法的情况下,也只能通过这种方式来实现。
谢谢您的回复,对我的帮助很大!
在set方法中记下来就行了三。
比如类似微软那个INotifyPropertyChanged(貌似叫这个)接口。
数据绑定,界面数据呈现很管用,但是backend开发不奏效。例如Web开发的Controller调用Service的方法。
@junlu: 这跟绑定有什么关系,就是说别个操作你记下来,不记下来,那你怎么知道。至于怎么记,如何记那是你根据上下文具体代码的事
面向对象思想中,对象作为参数传入的目的就是修改对象中的属性信息,以此来改变对象的状态的。如果你不想修改而只要传入数据,你可以将对象属性设置为只读的。
这个方法不可行,设置为只读的,不仅方法内部不能修改,任何地方都不能修改了。
@junlu: 面向对象编程中,除了方法内部可以写代码,还有什么地方能执行代码?一个对象的信息要么在别的对象的方法中读写、要么在自己的方法中读写。应该没有其他地方能读写对象属性了吧。
@授之以渔: 应用场景:Web开发,Controller调用Servcie的方法,传递一个DTO对象通过返回值返回数据,但是Servcie里又把DTO对象的属性给修改了。方法调用结束返回返回值,程序继续执行,在读取DTO的属性时发现莫名的被修改了(凶手就是Servcie)。该如何避免在Service被非法修改,同时Controller可以正常访问?
@junlu: 我的理解中,dto对象是作为数据传输实体,是不需要修改的,是个值类型,设置为只读也可以。
@授之以渔: 如果设置为只读的,由界面传输到Controller,对象的属性都没有办法set的。
@junlu: 在controller进行vo到dto转换,是直接新建dto对象,而不是改变已有dto的属性。我的理解。
@授之以渔: 感谢您的解答。