代码之家  ›  专栏  ›  技术社区  ›  Al C

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

oop
  •  5
  • Al C  · 技术社区  · 17 年前

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

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

    谢谢,艾尔·C。

    6 回复  |  直到 17 年前
        1
  •  9
  •   Randolpho    17 年前

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

    现在,有时候你想要,但大多数时候你不想要。因此,最好只将所需的值作为参数传递给方法,而不是传递Object2的实例。

        2
  •  3
  •   Scott Ewers    17 年前

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

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

    前面的答案也给出了有效的点——当你做出这个决定时,你应该考虑Objt1和Objon 2的耦合。

        3
  •  2
  •   Marc Charbonneau    17 年前

    通常目标是最小化对象之间的耦合。

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

        4
  •  1
  •   Paul Sonier    17 年前

    关键在于Object1是否知道Object2。在OOP中,良好设计的一部分是让对象存储尽可能少的信息,以使它们仍能正常工作。所以问题从根本上归结为:Object1是否需要知道Object2的存在(也就是说,它是否存在 Object2的实例是否存在)或者是否可以 告诉

    类型 在Object2上的财产的所有权;这样,就可以解耦Object1和Object2,因为Object1没有 反对2以特定方式提供特定财产;调用代码可以连接两者。

        5
  •  1
  •   Jaime    17 年前

    是的,伦道夫说的是真的。

    请记住,使用OOP,您的目标是创建单独的标识,这些标识可以作为一个整体在系统中运行。当您开始创建彼此严重依赖的对象时,不仅会增加出现bug的机会,还会增加程序根本无法工作的机会。

    现在,您的示例是一个次要的示例,但是想象一下5个、10个、100个对象通过参数相互调用,这是一项令人讨厌的工作。

        6
  •  1
  •   toolkit    17 年前

    看看 Encapsulation

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