2

对于具有多个团队成员的大型企业应用程序来说,依赖注入 (DI) 是否更重要?现在我是一个单一的开发人员,试图破解一个小网站,看看它是否获得了牵引力。然而,我不相信 DI 会为我正在编写的代码增加价值,尽管这个社区提供了压倒性的支持。

上周我一直在研究 DI 并在我的代码中实现,这并不难,只是耗时。但是我仍然看不到解耦和单元测试的好处。相反,它似乎使代码更难理解,编写时间更长,并且可能存在性能问题。在我浪费时间实施 DI 之前,我对正在解决的以下问题感兴趣。

1) 解耦的好处?我看不出 DI 如何降低代码的依赖性。代码本质上需要相互依赖才能工作。DI 只是将此依赖项移动到您看不到它的另一个区域。例如,假设我有一个调用另一个静态方法的方法。

class User {

// Static Dependency //
function process_registration() {
    if(Form::validate($_POST['email'])) {
        Message::send_message("Registration Complete");
    }
}

// Dependency Injection //
function __construct($form, $message) {
    $this->form = $form;
    $this->message = $message;
}
function process_registration() {
    if($this->form->validate($_POST['email'])) {
        $this-message->send_message("Registration Complete");
    }
}
}

DI 不会改变对和类process_registration的依赖。即使将它们作为属性注入到“用户”类中,是否仍然依赖于其类属性来工作?此外,如果我有一个将属性注入“用户”类的容器,该方法是否依赖于容器来实例化其类?假设我将来将“process_registration”重构为另一个类,或者将其重用于不同的项目。无论是否使用 DI,该方法都将停止工作,因为可能不存在相同的类属性和注入容器。FormMessageprocess_registration

2) 代码可读性?从上面的示例可以看出,该process_registration方法所需的代码现在增加了一倍。如果考虑到每次实例化新类或每次修改类方法时都需要修改的 Container 类,则增加一倍以上。除此之外,代码现在不太直观。$database$form和等属性如何$message与 a 相关User?代码也不太优雅。以前,我的静态方法是!Form::validate(),两个字。现在,它$this->form->validate()长了 30%。这会影响我注入到类中的所有方法。因此,现在当我查看一页代码时,它会$this->重复一百次$this->$this->而不是立即描述性的静态方法。而不是$user=new User($user_id);现在ioc::get('user')->newUser($user_id);. 我的观点是 DI 鼓励非 PHP 标准的惯用代码。

3) 更好的性能?DI 鼓励实例化可能永远不会使用的对象(例如,当验证失败或抛出错误时),而不是在准备好使用时调用方法 Just In Time。如果这些对象有巨大的库并且负载很重(例如 PHPExcel),这可能是一个性能问题。解决这个问题的方法是什么?

4)单元测试?中小型项目是否需要代码测试?现在,当我的代码中有错误时,PHP 会通知我。它们通常很容易通过检查 error_log 来查明和修复。如果我将来需要扩大我的项目,这会是一个问题吗?如果没有,什么时候需要 DI 进行测试?

由于上述原因,我发现没有必要在我的项目中实现 DI。但是,我对何时何地有必要实施感兴趣,以便我可以适当地实施。请给出你自己的详细例子和推理支持。我对其他文章的链接不感兴趣,因为它们可能很不清楚。提前致谢!

4

1 回答 1

0

1)假设您想更改表单类名称。如果您使用 DI,那么在容器中注册 Form 类时,您只需要在一处进行更改。

使用 DI 进行单元测试更容易,因为您已经解耦了组件。您可以分别测试 User、Message 和 Form 类。在您的示例中,如果没有 Message 和 Form 类,您将无法测试 User 类。

2)可读性与函数/可变长度无关。DI 提高了可读性,因为您可以通过查看构造函数清楚地看到在某些类中如何以及使用哪些依赖项。

3)我不知道不允许共享对象的单个 DIC - 仅实例化一次并应请求(延迟加载)。

4) 见 1。

于 2013-01-11T09:05:36.770 回答