zoukankan      html  css  js  c++  java
  • 2018-4-17-软件设计-白话依赖注入

    title author date CreateTime categories
    软件设计 白话依赖注入
    lindexi
    2018-04-17 18:19:40 +0800
    2018-4-17 14:8:59 +0800
    软件设计

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    这个写法就是依赖注入。

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

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

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

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

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

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

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

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

  • 相关阅读:
    URL记录
    Mongodb集群节点故障恢复场景分析(转)
    IO 和 NIO 的区别
    VUE 前端项目优化方法
    缓存的穿透和雪崩
    接口如何处理重复请求?
    线程池构造类 ThreadPoolExecutor 的 5 个参数
    大型网站在架构上应当考虑哪些问题
    synchronized 和 lock 的区别
    JVM虚拟机 YGC和FGC发生的具体场景
  • 原文地址:https://www.cnblogs.com/lindexi/p/12086010.html
Copyright © 2011-2022 走看看