gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:22:21 24 4
gpt4 key购买 nike

就简洁的设计而言,哪个更可取?

1) 将一个对象,比如说你自己,传递给另一个类方法,该方法将直接操纵传递对象的属性。

A级里面...

B.doStuff(this);

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

A级里面...
this.var1 = B.doStuff(this.var1);

第一种方法的缺点是模棱两可,它不明确 B 在 A 中改变了什么。
第二种方法的缺点是,除非属性通过引用/指针传递,否则需要返回一个数组,如果最终传递了很多属性,也会构成更长的函数调用。我猜正确的选择取决于具体情况,但是在我做出决定之前,还有其他人可以提出的其他优点/缺点吗?

编辑:由于将有大量属性传递给第二个类(我将某些任务委托(delegate)给它),我认为在这种情况下使用第一种方法是有道理的。我想出的另一个缺点是 B 类只能访问 A 类中的公共(public)属性和方法,而第二种方法允许 B 类操作 A 类可能不希望向公众透露的私有(private)属性。但是再一次,使用第二种方法更常见,当然在只访问几个变量的情况下更可取。

最佳答案

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

我认为这个问题归结为是通过引用还是通过值(value)传递值。

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

例如,当您在窗体绘制事件(在 C# 中)中引用图形对象时,已知操作将在传递的对象引用上完成(但肯定取决于您的要求和实现)。

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

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

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

关于OOP:将对象与将属性传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5061009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com