likes
comments
collection
share

Flutter 入门与实战(八十一):从创业公司CEO找程序员来说依赖注入

作者站长头像
站长
· 阅读数 3

什么是依赖注入(DI)

依赖注入的英文为 Dependency Injection,从字面的理解就是类似打针一样,将药水注入到我们身体内。为了理解依赖注入,我们举个例子来说明。某互联网创业公司CEO最近已经成功利用 PPT 忽悠到了投资,但是他还缺个牛掰的程序员来帮他把产品开发出来,为此他需要自己到处寻找这个程序员,比如去字节门口蹲点大牛程序员。 Flutter 入门与实战(八十一):从创业公司CEO找程序员来说依赖注入 我们用代码表示:

class CEO {
  late Coder nbCoder;
  CEO() {
    seekCoder();
  }
  
  seekCoder() {
    // CEO蹲点到了大牛程序员
    nbCoder = Coder('大牛程序员');
  }
  
  void developProduct() {
    // 牛掰的码农努力敲代码开发
    nbCoder.coding();
  }
}

这是理想情况,CEO一蹲点就找到了大牛程序员。但是更多情况是,CEO 应付各种事情,根本没时间蹲点,甚至这 CEO 可能压根不懂辨别谁是牛掰的程序员(总不能看穿格子杉,背双肩包就算吧)。 Flutter 入门与实战(八十一):从创业公司CEO找程序员来说依赖注入 这种情况 CEO 很累,他需要找程序员,还需要找产品,还需要找运营……等待人齐了,项目都黄了!我们可以借鉴一下娱乐圈,搞养成系CEO,在一开始就给他配备好程序员,项目就有戏了!

class CEO {
  late Coder nbCoder;
  // 直接配备程序员
  CEO(this.nbCoder);
  
  void developProduct() {
    // 牛掰的码农努力敲代码开发
    nbCoder.coding();
  }
}

这就是依赖注入!也就是一个类需要别的对象的时候,以前的方式是这个类自己创建需要的对象,但是这样其实很低效,而且耦合性增强了——需要知道对应对象怎么构建。而依赖注入则是在外部创建这个类的对象的时候,直接把依赖的对象“注入”给它,这样在业务中就可以直接使用了,至于这个对象怎么构建并不需要关心。比如上面的 CEO 他需要的是一个牛掰的程序员,至于是不是某知名大神倒不重要——不能吊死在一棵树啊! ​

当然这种方式也有缺陷,譬如 CEO 限定了必须是程序员(Coder 类),但是现如今大家都知道,连“小潘”同志都在学 Python了,因此,会写代码的人不一定就是程序员。而对 CEO 来说,他的准确需求是会写代码的人(敲黑板:理解真实需求很重要)

会写代码的人

从字面意思理解,会写代码的人有两部分意思:

  • 是一个人;
  • 会写代码。

至于这个人是男是女,年龄大小,以前干什么不重要(暂不允许搞性别、年龄歧视!程序员可以写代码干到退休)。会写代码是行为,因此对应程序来说就是接口,而人自然是一个类,因此CEO 需要的是下面图示的人。 Flutter 入门与实战(八十一):从创业公司CEO找程序员来说依赖注入 转成代码:

abstact class Coding {
  void coding();
}

class Coder implements Coding {
  final String name;
  final int age;
  final Gender gender;
  
  Coder({required this.name, required this.age, required this.gender});
}

class Someone implements Coding {
  final String name;
  
  Someone({required this.name});
}

class CEO {
  late Coding personCanCoding;
  // 配备会写代码的人
  CEO(this.personCanCoding);
  
  void developProduct() {
    // 会写代码的人努力敲代码开发
    personCanCoding.coding();
  }
}

这里会写代码的有两种类型,一种是正经的码农出身的 Coder,一种是某中人,至于年龄、性别不关心,会写代码就行(初创期就不考虑那么多了,先上线圈再说)。于是我们养成系CEO的落地就简单了,可以给他配备正经的码农,也可以是 Someone。

void main() {
  // 养成系 CEO1,高配专业程序员
  var ceo1 = CEO(Coder(name: '大牛程序员', age: 28, gender: Gender.male));
  ceo1.developProduct();
  
  // 养成系 CEO2,会写代码非专业选手小潘
  var ceo2 = CEO(Someone(name: '小潘'));
  ceo2.developProduct();
}

从这里可以看出,CEO 并不关心谁来给他写代码开发(毕竟关心程序员的老板是少数),只要知道这个人会写代码,能把他的产品开发出来就行。这样就大大降低了 CEO 和写代码的人的耦合度。

总结

本篇介绍了依赖注入的概念,依赖注入在很多场合会用到,尤其在构建软件框架的时候,比如 Java 中大名鼎鼎的 Spring 就使用了大量的依赖注入。而为了提高对象的复用性,往往会通过 IoC(控制反转) 容器将对象注入到需要该对象的类中。下一篇我们以真实的例子来讲解依赖注入和容器在GetX中的使用。