OOP:将对象与将属性传递给方法

Ara*_*yan 5 oop variables attributes argument-passing

就干净的设计而言,哪个更好?

1)将一个对象(例如您自己)传递给另一个类方法,该方法将直接操纵所传递对象的属性。

内部A级...

B.doStuff(this);
Run Code Online (Sandbox Code Playgroud)

2)改为传递对象的属性,然后将返回值分配回属性,或通过引用传递。

内部A级...

this.var1 = B.doStuff(this.var1);
Run Code Online (Sandbox Code Playgroud)

第一种方法的不利之处是模棱两可,尚不清楚B在A中的变化。第二种方法的不利之处在于,除非属性由引用/指针传递,否则将需要返回数组,并且如果最终传递了很多属性,则构成更长的函数调用。我猜测正确的选择取决于情况,但是在我做出决定之前,其他任何人都可以提出其他优点/缺点吗?

编辑:由于将大量属性传递给第二类(我正在将某些任务委派给它),因此,我认为在这种情况下可以使用第一种方法。我想到的另一个缺点是,类B只能访问类A中的公共属性和方法,而第二种方法允许类B操纵类A可能不想向公众公开的私有属性。但是再一次,使用第二种方法更为普遍,并且在只访问少量变量的情况下肯定更可取。

She*_*Pro 2

您应该选择为功​​能提供最少信息量但对于功能的工作来说足够最佳的设计。这确保了处理过程中预期的副作用最少。

我认为这个问题归结为是按引用传递值还是按值传递值。

大多数情况下,这些函数应该至少没有副作用,但如果您的函数意图是处理参数中传递的数据,那么传递整个类引用会更好。

例如,当您在表单绘制事件(在 C# 中)中引用 Graphic 对象时,众所周知,操作将在传递的对象引用上完成(但这当然取决于您的要求和实现)。

如果您的函数可以正常工作而不需要传递整个类引用,那么您应该再次选择它。但请记住,按值传递大量参数会消耗更多资源,因为每次都会创建一个新副本,因此要分配新内存,而在通过引用中,您只是传递引用,因此不会分配新内存。

如果您希望您的方法对传递的数据没有副作用,则可以使用第二种设计,而是它对提供的数据起作用并创建一个包含结果的新对象,然后将其分配给所需的属性。

通常,代码读者的看法是,如果在赋值运算符的右侧调用了某个函数,那么他知道对数据执行了某些操作,但正在返回一个新数据,因此他通常不会这样做期望它对作为参数提供的数据进行操作。如果读者只看到没有任何赋值运算符的函数调用,那么他期望对作为参数提供的数据进行某些处理。