Design patterns 如何向5岁儿童解释依赖注入?

Design patterns 如何向5岁儿童解释依赖注入?,design-patterns,dependency-injection,inversion-of-control,Design Patterns,Dependency Injection,Inversion Of Control,什么是好的解释方式 我在Google上找到了几本教程,但没有一本认为读者只是Java初学者。你会如何向新手解释这一点呢?我给你注射了针对五岁儿童的依赖注射 当你自己去把冰箱里的东西拿出来时,你可能会引起问题。你可能会把门开着,你可能会得到妈妈或爸爸不想要的东西。你甚至可能在寻找我们甚至没有的东西或者已经过期的东西 你应该做的是陈述一个需求,“我午餐需要喝点东西”,然后我们会确保你坐下吃饭时有东西 我不知道有任何简化的教程,但我可以给你一个大约25 250字或更少的版本: 使用依赖项注入,对象不会

什么是好的解释方式


我在Google上找到了几本教程,但没有一本认为读者只是Java初学者。你会如何向新手解释这一点呢?

我给你注射了针对五岁儿童的依赖注射

当你自己去把冰箱里的东西拿出来时,你可能会引起问题。你可能会把门开着,你可能会得到妈妈或爸爸不想要的东西。你甚至可能在寻找我们甚至没有的东西或者已经过期的东西

你应该做的是陈述一个需求,“我午餐需要喝点东西”,然后我们会确保你坐下吃饭时有东西


我不知道有任何简化的教程,但我可以给你一个大约25 250字或更少的版本:

使用依赖项注入,对象不会基于已知的内容配置自己的组件,而是通过更高级别的逻辑配置对象,然后调用它没有内置预知的组件。其思想是使对象更像一个组件,而不是一个应用程序,从而在更高的层次上重新定位配置任务。这使得该对象更有可能在将来有用,或者使用不同的配置

这对于测试更好,当需要修改应用程序时更好。典型的实现将配置放在XML中,并使用框架动态加载类。

这是怎么回事

如果您有一个类
Employee
,并且该员工有一个
地址
,则可以按如下方式定义
Employee
类:

class员工{
私人地址;
//建造师
公共雇员(新地址){
this.address=newAddress;
}
公共广播getAddress(){
返回此地址;
}
公共无效设置地址(地址新地址){
this.address=newAddress;
}
}
到目前为止一切都很好

这段代码显示了员工和他的地址之间的HAS-a关系,没关系

现在,这种关系在他们之间产生了依赖关系。问题出现在构造函数中

每次要创建
员工
实例时,都需要一个
地址
实例:

地址someAddress=。。。。
员工奥斯卡=新员工(someAddress);
以这种方式工作会产生问题,尤其是当您想要执行单元测试时

主要的问题是,当您需要测试一个特定的对象时,您需要创建另一个对象的实例,并且很可能需要创建另一个对象的实例。链可能变得无法管理

为了避免这种情况,您可以如下更改构造函数:

公共雇员(){
}
使用无参数构造函数

然后,您可以随时设置地址:

地址someAddress=。。。。
员工奥斯卡=新员工();
oscar.setAddress(someAddress);
现在,如果您有多个属性或者对象很难创建,那么这可能是一个拖动

但是,想想看,比如说,您添加了
Department
属性:

class员工{
私人地址;
私人部门,;
....
如果您有300名员工,并且所有员工都需要有相同的部门,并且该部门必须在其他对象之间共享(如公司部门列表或每个部门的角色等)然后,您将很难看到
部门
对象并通过所有对象网络共享它

依赖项注入的目的就是帮助您在代码中“注入”这些依赖项。大多数框架允许您通过在外部文件中指定要注入的对象来实现这一点

假设虚拟依赖项注入器的属性文件:

#模拟员工
employee.address=MockAddress.class
employee.department=MockDepartment.class
#生产设置
employee.address=RealAddress.class
employee.department=RealDepartment.class
您将定义为给定场景注入的内容

依赖注入框架将为您设置正确的对象,这样您就不必编写
setAddress
setDepartment
。这可以通过反射、代码生成或其他技术来完成

因此,下次您需要测试
Employee
类时,您可以在生产代码中插入模拟
地址
部门
对象,而不必为所有测试编写所有的set/get。更妙的是,您可以在生产代码中插入real
地址
部门
对象,并且仍然具有他相信你的代码可以通过测试

差不多就是这样

我仍然不认为这个解释适合你要求的5岁孩子


我希望您仍然觉得它有用。

在编写类时,它自然会使用其他对象。例如,您可能有一个数据库连接,或者您使用的其他服务。这些其他对象(或服务)是依赖项。编写代码最简单的方法就是创建和使用这些其他对象。但这意味着您的对象与这些依赖项有着不灵活的关系:无论您为什么调用您的对象,它都使用相同的依赖项

一种更强大的技术是能够创建对象并为其提供要使用的依赖项。因此,您可以创建要使用的数据库连接,然后将其交给对象。这样,您可以在不同的时间创建具有不同依赖项的对象