如何解释dependency injection到一个5岁?

什么是解释dependency injection的好方法?

我在Google上find了几个教程,但是没有一个会假设读者只是一个Java初学者。 你如何解释这个新手?

我给你五岁的依赖注射。

当你从冰箱里取出东西给自己的时候,可能会导致问题。 你可能会打开门,你可能会得到一些妈妈或爸爸不希望你拥有的东西。 你甚至可能正在寻找我们甚至没有或已经过期的东西。

你应该做的是说明一个需要,“我需要用午餐喝点东西”,然后当你坐下来吃饭的时候,我们会确定你有什么东西。

那这个呢?

如果你有一个Employee类,并且这个员工有一个Address你可以定义如下的Employee类:

 class Employee { private Address address; // constructor public Employee( Address newAddress ) { this.address = newAddress; } public Address getAddress() { return this.address; } public void setAddress( Address newAddress ) { this.address = newAddress; } } 

一切看起来都很好。

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

现在,这个HAS-A关系在它们之间创build了一个依赖关系。 问题出现在构造函数中。

每次你想创build一个Employee实例,你都需要一个Address实例:

  Address someAddress = .... Employee oscar = new Employee( someAddress ); 

以这种方式工作变得有问题, 特别是当你想执行unit testing时。

当你需要testing一个特定的对象时,主要的问题就出现了,你需要创build一个其他对象的实例,而且很可能你需要创build另外一个对象的实例来完成这个任务。 该链可能变得难以pipe理。

为了避免这种情况,你可以像这样改变构造函数:

  public Employee(){ } 

使用一个无参数构造函数。

那么你可以设置地址,只要你想要的:

  Address someAddress = .... Employee oscar = new Employee(); oscar.setAddress( someAddress ); 

现在,这可能是一个拖延,如果你有几个属性,或者很难创build对象。

然而,想想这个,比方说,你添加Department属性:

  class Employee { private Address address; private Department department; .... 

如果你有300名员工,并且他们都需要有相同的部门,并且同一个部门必须在其他一些对象之间共享(例如公司部门名单或每个部门的angular色等)对于Department对象的可见性很难,并通过所有的对象networking来共享它。

什么是dependency injection是关于它帮助你,以及“注入”这些依赖项在你的代码。 大多数框架允许您通过在外部文件中指定要注入的对象来完成此操作。

假设一个虚构的dependency injection器的属性文件:

  #mock employee employee.address = MockAddress.class employee.department = MockDepartment.class #production setup employee.address = RealAddress.class employee.department = RealDepartment.class 

您将定义要为特定场景注入的内容。

dependency injection器框架将做什么是为你设置正确的对象,所以你不必编码setAddresssetDepartment 。 这可以通过reflection或代码生成或其他技术来完成。

因此,下一次您需要testingEmployee类时,您可能会注入AddressDepartments对象,而无需为所有testing编写所有set / get代码。 更妙的是,您可以在生产代码中注入实际的 AddressDepartment对象,并且仍然能够确信您的代码在testing过程中能够正常工作。

这几乎是关于它。

不过,我不认为这个解释适合你所要求的5岁。

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

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

一个更强大的技术是能够创build你的对象,并提供依赖使用。 所以你可以创build一个数据库连接来使用,然后把它交给你的对象。 这样,您可以在不同的时间用不同的依赖关系创build对象,使对象更加灵活。 这是dependency injection,在这里你将依赖关系“注入”到对象中。

顺便说一句:在使用flickr照片来说明概念的现代演示风格中,可以用一个吸毒者用毒品自杀来说明。 哦,等等,这是注射依赖…好吧,对不起,坏玩笑。

我不知道任何简化的教程,但是我可以给你一个差不多25个 250字或更less的版本:

通过dependency injection,对象不会根据已知的事物来configuration自己的组件,而是通过更高级别的逻辑来configuration对象,然后调用没有内置预知的组件。 这个想法是让对象更多的是一个组件而不是一个应用程序,在更高的层次上重新定位configuration任务。 这使得该对象更有可能在将来有用或者具有不同的configuration。

testing会更好,当修改应用程序的时候会更好。 典型的实现是将configuration放在XML中,并使用框架来dynamic加载类。

当你得到一个新的任天堂,你可以使用button和触摸屏玩游戏。

但在任天堂工厂,他们需要知道如何把它们放在一起。

当工厂的聪明人拿出任天堂DS时,内部会有所不同,但是你仍然会知道如何使用它。