2018-4-17-软件设计-白话依赖注入
title | author | date | CreateTime | categories |
---|---|---|---|---|
软件设计 白话依赖注入
|
lindexi
|
2018-04-17 18:19:40 +0800
|
2018-4-17 14:8:59 +0800
|
软件设计
|
有很多小伙伴来问依赖注入和如何做一个框架,我说了好久想到下面的故事,所以就写下来。
如果遇到一个需求,去小卖部买一瓶水,那么会怎么做?
对于一个入门的小伙伴,会很快做完。一般对于项目,新手的开发速度都会很快。
买一瓶水(小明 小明)
{
美国自行车 自行车 = 寻找小明的美国自行车();
自行车.骑自行车(小明,西六小卖部);//西六小卖部就是目的地
小明.在小卖部买一瓶水();
}
大概代码就是这样,那么重点需要说的是,和新手开发不相同的是设计。
大家很快就可以看到,这个方法只对小明去西六小卖部买水有用,对于他去其他地方买别的没有用。所以需要让方法通用。
那么一个框架,实际上就是什么都不做,具体的是注入的。
从上面代码是不是觉得有些怪,居然是自行车反过来调用方法,应该是小明调用车,所以暂时修改为下面代码。
买一瓶水(小明 小明)
{
美国自行车 自行车 = 寻找小明的美国自行车();
小明.美国自行车 = 自行车;
小明.骑车去西六小卖部();
小明.在小卖部买一瓶水();
}
这样看起来所有都是小明,所以代码可读就好很多。
但是有一天,小明找不到自己的美国自行车,他就只找到自行车,那么上面的代码就无法使用了。但是看到小明是会骑车的,也就是所有自行车他都可以骑。修改一下代码。
买一瓶水(小明 小明)
{
自行车 自行车 = 寻找自行车();
小明.自行车 = 自行车;
小明.骑车去西六小卖部();
小明.在小卖部买一瓶水();
}
从上面代码可以看到,属性尽可能使用基类,如果用到只是基类的功能。如果使用的类是越高级,那么越难以定制。
但是从上面代码也可以看到,既然尽可能使用基类,就需要使用抽象,具体骑车是业务,需要拿出来,所以小明只是使用交通工具,至于交通工具是什么,框架就不需要知道。
也就是小明有使用交通工具功能,具体什么交通工具是使用的时候注入的,那么先做很小的改动。
买一瓶水(小明 小明)
{
交通工具 自行车 = 寻找小明的美国自行车();
小明.使用交通工具(自行车,西六小卖部)//西六小卖部就是目的地
小明.在小卖部买一瓶水();
}
可以看到,小明有一个接口,使用交通工具,只需要传入交通工具,小明就可以使用,只是可能他没有驾照,出去被交警抓了,但是作为开发者,最多给他创建一个驾照。
这个写法就是依赖注入。
那么来试试小明在小卖部买一瓶水的更改。到小卖部就是一个具体的过程,小明需要去某个地方才是抽象。
从代码可以看到,买一瓶水也是具体,如果框架写了买一瓶水,那么框架就只能做买一瓶水。如果框架写的是买东西,那么框架就面对抽象。
如果要做一个框架,那么框架要尽可能抽象,所有步骤都使用注入。
如果大家看到的框架是对于小明的,需要让他对于学生?人?那么也需要做一些修改,这时就需要使用基类学生或人,支持使用交通,买东西。
但是有一天,发现有一个机器也需要完成这个功能,机器不能继承人,所以这个框架又不能用。
所以就需要把两个方法定义在一个接口里,让学生和机器都继承这个接口,这样就可以使用这个框架。所以接口主要在框架使用。
大概看了上面的大家可以知道依赖注入的作用,和如何使用接口。
如果是刚入门,那么千万不要去学框架去写框架,这时需要做的是用框架,或者不用任何框架自己来写。然后写的时候会觉得自己是不是写了重复的代码,逻辑差不多的代码。或者这个项目的代码无法用在其他项目。这时就可以尝试去看看博客,读一下框架的代码。不过一般框架的代码会有很多容错和其他的代码,实际的设计很难很快看到,这时找个人来问也是很好。