feature/step分支下只有项目配置
feature/step1到feature/step7则分别为下面1.0.1到1.0.7的代码
- 0.0.6和0.0.7版本中已经出现了一些不太合理的逻辑耦合,运用面向切面编程的**可以很好的解决这些问题
- 雪地、草地和极寒的三种情况在这个版本中互相完全没有依赖
- 车的类也对各个状态没有感知,完全符合了设计原则中的单一职责原则
- 并且也能做到对已有的test代码和xishuai的代码没有影响
- 类似tapable一样,也和axios的beforeRequest和afterRequest的拦截器差不多,理解起来比较简单;
- 类似express的洋葱模型,理解成本较大,但是可以更加灵活地引用其他注入逻辑的结果;
- D同学在雪地之后还会经过一段草地 这种情况下就算有多重继承也不好解决 解决方案:
- 一般来说直接将A的代码改改就好了,反正A不会经过草地,ACar的代码也能正常运行。但是实际上D的需求对A需求有一定侵入性,这样很可能会导致后续的测试与维护出现问题;
- 或者就把ACar状态的代码改为protected,再从ACar继承一个DCar,重载getWheels方法,但这样解决的话后续如果遇到更多奇葩的情况,那可能就需要维护非常多的类
- B同学则有不一样的需求,每天都会路过一段非常寒冷的地方,需要及时换引擎
- C同学则更惨,他首先需要路过一段雪地,然后要攀爬一段雪山,所以又要换轮胎,还要换引擎
- 可以将一部分共通的代码封装起来,但是这样会产生新的耦合:一但A或者B的需求变更,都可能影响到C
- 垃圾java和javascript没有多重继承,最新的一些scala或者rust都提供了多重继承的可能性
- A同学每天上下班(A面向过程的代码也需要在很多地方复用)都需要手动换很麻烦,于是他重新设计(继承和重载)了一辆车;
- A同学也想复用蟋蟀的车,但是他上班的地方中间有一段雪地,普通轮胎无法过去,所以需要在路过的时候动态的换成带有铁链的轮胎。 使用了setter函数来动态的注入依赖
- 同学知道蟋蟀组装的车之后都希望蟋蟀也能为自己组装一台,不过每个同学都有自己的想法,比如测试同学想要用自己做的活塞组装并且测试一下
- 依赖倒置原则,之前蟋蟀自己组装的车直接依赖了自己的轮胎、活塞、引擎的实现。那想要复用车的代码,就需要将依赖的关系反过来,由需要复用的车来声明自己所需要的的部件需要的能力(interface);
- 注入依赖,对于使用方,则相当于是将车所需要的依赖动态的注入到类的内部实现中,注入依赖的方式一般有三种,这一步骤中就是constructor这种
- constructor;
- setter;
- 接口动态注册;
- 蟋蟀为了自己上班组装了一台自己专用的车
- 项目配置