有很多小伙伴来问依赖注入和如何做一个框架,我说了好久想到下面的故事,所以就写下来。

如果遇到一个需求,去小卖部买一瓶水,那么会怎么做?

对于一个入门的小伙伴,会很快做完。一般对于项目,新手的开发速度都会很快。

买一瓶水(小明 小明)
{
    美国自行车 自行车 = 寻找小明的美国自行车();
    自行车.骑自行车(小明,西六小卖部);//西六小卖部就是目的地
    小明.在小卖部买一瓶水();
}

大概代码就是这样,那么重点需要说的是,和新手开发不相同的是设计。

大家很快就可以看到,这个方法只对小明去西六小卖部买水有用,对于他去其他地方买别的没有用。所以需要让方法通用。

那么一个框架,实际上就是什么都不做,具体的是注入的。

从上面代码是不是觉得有些怪,居然是自行车反过来调用方法,应该是小明调用车,所以暂时修改为下面代码。

买一瓶水(小明 小明)
{
    美国自行车 自行车 = 寻找小明的美国自行车();
    小明.美国自行车 = 自行车;
    小明.骑车去西六小卖部();
    小明.在小卖部买一瓶水();
}

这样看起来所有都是小明,所以代码可读就好很多。

但是有一天,小明找不到自己的美国自行车,他就只找到自行车,那么上面的代码就无法使用了。但是看到小明是会骑车的,也就是所有自行车他都可以骑。修改一下代码。

买一瓶水(小明 小明)
{
    自行车 自行车 = 寻找自行车();
    小明.自行车 = 自行车;
    小明.骑车去西六小卖部();
    小明.在小卖部买一瓶水();
}

从上面代码可以看到,属性尽可能使用基类,如果用到只是基类的功能。如果使用的类是越高级,那么越难以定制。

但是从上面代码也可以看到,既然尽可能使用基类,就需要使用抽象,具体骑车是业务,需要拿出来,所以小明只是使用交通工具,至于交通工具是什么,框架就不需要知道。

也就是小明有使用交通工具功能,具体什么交通工具是使用的时候注入的,那么先做很小的改动。

买一瓶水(小明 小明)
{
    交通工具 自行车 = 寻找小明的美国自行车();
    小明.使用交通工具(自行车,西六小卖部)//西六小卖部就是目的地
    小明.在小卖部买一瓶水();
}

可以看到,小明有一个接口,使用交通工具,只需要传入交通工具,小明就可以使用,只是可能他没有驾照,出去被交警抓了,但是作为开发者,最多给他创建一个驾照。

这个写法就是依赖注入。

那么来试试小明在小卖部买一瓶水的更改。到小卖部就是一个具体的过程,小明需要去某个地方才是抽象。

从代码可以看到,买一瓶水也是具体,如果框架写了买一瓶水,那么框架就只能做买一瓶水。如果框架写的是买东西,那么框架就面对抽象。

如果要做一个框架,那么框架要尽可能抽象,所有步骤都使用注入。

如果大家看到的框架是对于小明的,需要让他对于学生?人?那么也需要做一些修改,这时就需要使用基类学生或人,支持使用交通,买东西。

但是有一天,发现有一个机器也需要完成这个功能,机器不能继承人,所以这个框架又不能用。

所以就需要把两个方法定义在一个接口里,让学生和机器都继承这个接口,这样就可以使用这个框架。所以接口主要在框架使用。

大概看了上面的大家可以知道依赖注入的作用,和如何使用接口。

如果是刚入门,那么千万不要去学框架去写框架,这时需要做的是用框架,或者不用任何框架自己来写。然后写的时候会觉得自己是不是写了重复的代码,逻辑差不多的代码。或者这个项目的代码无法用在其他项目。这时就可以尝试去看看博客,读一下框架的代码。不过一般框架的代码会有很多容错和其他的代码,实际的设计很难很快看到,这时找个人来问也是很好。


本文会经常更新,请阅读原文: https://lindexi.gitee.io/lindexi/post/%E8%BD%AF%E4%BB%B6%E8%AE%BE%E8%AE%A1-%E7%99%BD%E8%AF%9D%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系