对于具有多个团队成员的大型企业应用程序来说,依赖注入 (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,该方法都将停止工作,因为可能不存在相同的类属性和注入容器。Form
Message
process_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。但是,我对何时何地有必要实施感兴趣,以便我可以适当地实施。请给出你自己的详细例子和推理支持。我对其他文章的链接不感兴趣,因为它们可能很不清楚。提前致谢!