gpt4 book ai didi

php - 为什么不是 "instantiate a new object inside object constructor"?

转载 作者:IT王子 更新时间:2023-10-28 23:52:51 27 4
gpt4 key购买 nike

我回答了一个问题(link),我在另一个类的构造函数中使用了新对象的创建,这里是示例:

class Person {
public $mother_language;

function __construct(){ // just to initialize $mother_language
$this->mother_language = new Language('English');
}

我得到了用户“Matija”(his profile)的评论,他写道:你不应该在对象构造函数中实例化一个新对象,依赖关系应该从外部推送,所以任何使用这个类的人都知道这个类依赖什么!

总的来说,我可以同意这一点,并且我理解他的观点。

不过,我以前经常这样做,例如:

  • 作为私有(private)属性,其他类为我提供了无需复制代码即可解决的功能,例如,我可以创建一个对象列表(实现 ArrayAccess 接口(interface)的类),这个类将是在另一个类中使用,具有这样的对象列表,
  • 某些类使用例如 DateTime 对象,
  • 如果我include(或自动加载)依赖类,应该没有错误的问题,
  • 因为依赖对象的数量可能很大,将它们全部传递给类构造函数可能会很长而且不清楚,例如

    $color = new TColor('red'); // do we really need these lines?
    $vin_number = new TVinNumber('xxx');
    $production_date = new TDate(...);
    ...
    $my_car = new TCar($color, $vin_number, $production_date, ...............);
  • 当我在 Pascal 中“出生”,然后在 Delphi 中,我从那里就有了一些习惯。在 Delphi(以及 FreePascal 作为其竞争对手)中,这种做法非常常见。例如,有一个处理字符串数组的 TStrings 类,为了存储它们,它不使用 array,而是使用另一个类 TList ,它提供了一些有用的方法,而 TStrings 只是某种接口(interface)。 TList 对象是私有(private)声明的,除了 TStrings 的 getter 和 setter 之外,无法从外部访问。

  • (不重要,但出于某种原因)通常我是使用我的类(class)的人。

请解释一下,避免在构造函数中创建对象真的很重要吗?

我已阅读 this discussion但脑子里还不清楚。

最佳答案

是的,确实如此。然后,您就清楚了构建对象需要什么。传入的大量依赖对象是一种代码异味,可能是您的类做得太多,应该分解为多个较小的类。

如果你想测试你的代码,传入依赖对象的主要优势就来了。在您的示例中,我不能使用假语言类。我必须使用实际的类来测试 Person。我现在无法控制 Language 的行为来确保 Person 正常工作。

这篇文章有助于解释为什么这是一件坏事以及它导致的潜在问题。 http://misko.hevery.com/code-reviewers-guide/flaw-constructor-does-real-work/

更新

除了测试之外,传递依赖对象还可以使您的代码更加明确、灵活和可扩展。引用我链接到的博客文章:

When collaborator construction is mixed with initialization, it suggests that there is only one way to configure the class, which closes off reuse opportunities that might otherwise be available.

在您的示例中,您只能创建以“英语”为语言的人。但是当你想创造一个说“法语”的人时呢?我无法定义。

至于创建对象并将它们传入,这就是Factory模式的全部目的http://www.oodesign.com/factory-pattern.html .它将创建依赖项并为您注入(inject)它们。因此,您可以向它询问将以您想要的方式初始化的对象。 Person 对象不必决定它需要是什么。

关于php - 为什么不是 "instantiate a new object inside object constructor"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15901861/

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