OOP新手:直接访问字段与传递对象作为参数

时间:2009-05-27 17:49:10

标签: oop

假设Object1需要来自Object2的信息。我会说它在Object2属性中,但信息很容易就是Object2函数的返回值。当我查看其他人的代码时,我发现有时他们会在Object1中直接访问该属性。其他时候我看到人们将Object2作为参数传递给方法,然后从传递的Object2访问该属性。

这些情况对我来说几乎是一样的。直接访问该物业似乎更简单。作为一个新手,在决定Object1如何从Object2获取信息时,您认为我应该考虑什么? (我什么时候想要一个对象参数而不是直接访问该属性?)

谢谢 - Al C。

6 个答案:

答案 0 :(得分:9)

将Object2传递给Object1的一个问题是您在Object2和Object1之间创建了一个依赖关系。 Object1获取所需数据的唯一方法是引用Object2。

现在,有时你想要那样,但大部分时间你都不想要。因此,最好只是将您需要的值作为参数传递给方法,而不是传递Object2的实例。

答案 1 :(得分:3)

如果方法只需要Object2中的一个属性值,则最好直接传递该属性值。如果该方法需要访问Object2的许多属性或其他功能,则传递对Object2的引用是合适的。

有一些例外 - 如果您需要保护方法的签名(即它是公共的)并且您预计将来在方法中额外使用Object2,则传递对象引用可能是合适的。

之前的答案也是有效的 - 你做出这个决定时应该考虑Object1和Object2的耦合。

答案 2 :(得分:2)

通常目标是尽量减少对象之间的耦合。

让我们使用一个简单的例子,我有三个对象;一个AppController,它包含对DataController和MainWindowController的引用。您需要将DataController.Data传递给MainWindowController,以便可以在主窗口的表中显示值。您可以将DataController作为方法参数传递给MainWindowController,或者将DataController作为MainWindowController中的实例变量。为了最大限度地减少耦合,最简单的方法是让AppController将Data直接传递给MainWindowController,因此它不需要了解任何有关DataController的信息。

答案 3 :(得分:1)

关于Object1是否了解Object2的全部内容。在OOP中,好的设计的一部分是让对象尽可能地存储为LITTLE信息,这仍然允许它们正常运行。所以问题从根本上归结为:Object1是否需要了解Object2的存在(即需要是否存在Object2的实例),还是告知是否存在Object2实例?通常,在OOP中,您希望更倾向于后者而不是前者。

然而,也就是说,在Object1可以对来自Object2的数据进行操作的情况下,最好的方法可能是让Object1有一个方法对该属性的类型进行操作。 Object2的;这样,你解耦了Object1和Object2,因为Object1在Object2上没有依赖来以给定的方式提供给定的属性;调用代码可以连接两个。

答案 4 :(得分:1)

是的,Randolpho说的是真的。

请记住,使用OOP,您的目标是创建可在系统中作为一个整体运行的独立身份。当你开始创建相互依赖的对象时,不仅会增加错误的机会,而且还会增加你的程序根本无法工作的机会。

现在你的例子很小,但想象5,10,100个对象通过参数相互调用,这是令人讨厌的工作。

答案 5 :(得分:1)

在维基百科上查看Encapsulation

  

Encapsulation [..]通过阻止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性。