架构简洁之道-设计原则

设计原则(SOLID)

SOLID原则主要作用就是告诉我们如何将数据和函数组合成类,以及如何将这些链接起来成为程序。

软件构建中层结构的主要目标

  • 使软件可以容忍被改动
  • 使软件更容易被理解
  • 构建可在多个软件系统中复用的组件

SOLID

  • SRP:单一职责原则
  • OCP:开闭原则
  • LSP:里式替换原则
  • LSP:接口隔离原则
  • DIP:依赖反转原则

SRP 单一职责原则

原则:任何一个软件模块(源代码文件)都应该只对某一类行为者负责。
主要讨论的是函数和类之间的关系,会以不同的形式出现。

主要是负责类和函数的组合

OCP 开闭原则

原则:设计良好的计算机软件应该易于扩展,同时抗拒修改。
将代码的修改量降至最小:先将满足不同需求的代码分组SRP, 然后再来调整这些分组之间的依赖关系DIP
如果A组件不想被B组件上发生的修改所影响,那么就应该让B组件依赖于A组件

  • 依赖方向控制
  • 信息隐藏

主要是负责类之间的指向关系

LSP 里氏替换原则

原则:这里需要的是一种可替换性:如果对于每个类型是 S 的对象 o1 都存在一个类型为 T 的对象 o2, 能使操作 T 类型的程序 P 在用 o2 替换 o1 时行为保持不变,我们就可以将 S 称为 T 的子类型。

负责类的继承,泛化实现

ISP 接口隔离原则

原则:任何层次的软件设计如果依赖了它并不需要的东西,就会带来意料之外的麻烦。

编程语言之间的关系:而正是这些语句带来了源代码之间的依赖关系,这也就导致了某些模块需要被重新编译和重新部署。这就是动态类型语言要比静态类型语言更灵活、稠合度更松的原因。

软件设计:框架之间的依赖关系

DIP 依赖反转原则

原则:如果想要设计一个灵活的系统,在源代码层次的依赖关系中就应该多引用抽象类型,而非具体实现。我们主要应该关注的是软件系统内部那些会经常变动的 (volatile) 具体实现模块,这些模块是不停开发的,也就会经常出现变更

编码守则

  1. 应在代码中多使用抽象接口,尽量避免使用那些多变的具体实现类。
  2. 不要在具体实现类上创建衍生类。
  3. 不要覆盖 (override)包含具体实现的函数。
  4. 应避免在代码中写入与任何具体实现相关的名字,或者是其他容易变动的事物的名字。

依赖守则: 而跨越边界的、朝向抽象层的单向依赖关系则会成为一个设计守则

抽象接口,易变的实现隔离。从而可以减少修改。(架构边界)
主要是负责 组织原则