在清洁设计方面,哪个更好?
1)将一个对象(比如说自己)传递给另一个类方法,该方法将直接操作传递对象的属性。
内部A级......
B.doStuff(this);
2)改为传递对象的属性,并将返回值分配回属性,或者通过引用传递。
内部A级......
this.var1 = B.doStuff(this.var1);
第一种方法的缺点是含糊不清,不清楚B在A中改变了什么。 第二种方法的缺点是,除非通过引用/指针传递属性,否则需要返回一个数组,如果你最终传递了很多属性,它也会构成一个更长的函数调用。我猜测正确的选择取决于具体情况,但是在我做出决定之前,还有其他优点/缺点吗?
编辑:由于将有大量属性传递给第二个类(我将某些任务委托给它),我认为它保证使用第一个方法在这种情况下。我提出的另一个缺点是B类只能访问A类中的公共属性和方法,而第二种方法允许B类操纵A类可能不希望向公众透露的私有属性。但是再一次,使用第二种方法更为常见,当然只会访问少数变量时更为可取。
答案 0 :(得分:1)
你是对的。选择真的取决于这里的情况。如果您正在使用像Hibernate这样的ORM,那么父域类通常会编写类似这样的内容来配置子域类的双向依赖: -
public void addChild(Child child) {
children.add(child);
child.setParent(this);
}
对于大多数其他情况,最好将方法参数设为显式...换句话说,只将您需要的字段传递给方法来执行任务。它使类图更易于理解,并且您知道API正在尝试完成什么,因为您知道实际输入和生成的输出。
答案 1 :(得分:1)
我更喜欢第二种方法,那么B类就不会有任何A类依赖。
答案 2 :(得分:1)
您应该选择能够为功能提供最少量信息但最适合功能工作的设计。这样可以确保处理过程中产生的副作用最少。
我认为这个问题归结为是通过引用还是通过值传递值。
大多数情况下,函数应该是最少或没有副作用,但如果你的函数意图是处理在参数中传递的数据,那么传递整个类引用会更好。
例如,当您在Forms绘图事件(在C#中)中引用Graphic对象时,已知将对传递的Object引用进行操作(但这肯定取决于您的要求和实现)。
如果您的功能可以正常工作而不需要传递整个Class引用,那么您应该再次选择。但是请记住,按值传递大量参数会占用更多资源,因为每次都要创建新的副本,因此要分配新的内存,而在引用时,您只是传递引用,因此不会分配新的内存。
如果您希望方法对传递的数据没有副作用,则可以使用第二种设计,而不是它对所提供的数据起作用,并创建一个包含结果的新Object,然后将其分配给所需的属性。 / p>
通常你的代码读者的感知是,如果在赋值运算符的右侧调用了某个函数,那么他知道某些事情是通过数据完成的,但是返回了一个新的数据,因此他通常不希望它对作为参数提供的数据进行操作。如果读者只看到没有任何赋值操作符的函数调用,那么他希望对作为参数提供的数据做一些事情。