敏捷软件开发

2021-10-25 105

一些理论

  1. 原则
    1. SRP 单一职责:
      案例1: 比赛记分模块:分离 跟踪比赛 功能和 计算得分 功能
      案例2: 画画工具部分: 绘制举行和计算面积

    2. OCP 开放-封闭
      案例: 抽象类,对扩展开放,对修改封闭(跟接下来的有关)

    3. LSP 里氏替换
      问题案例: OCP设计的抽象类,后续需要添加持久类,然而这个持久类必须要由Persistent Object 派生。如图

      客户程序不能确保该Set 实际上是否是一个PersistentSet。

      如果直接使用,会报错。dynamic_cast 会抛出 bad_cast 异常。由于是 Set 派生类导致这些函数,因此对类层次所做的这种改动违反了LSP
      解决方案1: "约定",也就是没在源代码中解决它。缺点: 要不断地跟开发人员解释。
      解决方案2: 重新设计层次结构。将Set 和 PersistentSet 分离,如下图

      问题案例2: Line 和 LineSegment 都有 IsOn()。
      解决方案1: 提取出一个公共的超类,并让他们继承它。后续如果再加多几个,可能变成抽象类。

    4. DIP 依赖转置
      解决案例1: 开关控制灯泡 -> 开关控制灯泡系统控制灯泡
      解决案例2: 读取输入,控制熔炉温度 -> 读取器读取输入,控制温度

    5. ISP 接口隔离
      问题案例: ATM 输出信息需要转换成许多不同语言 -> 几个模块实现 "总接口 UI" ( UI 接口大而杂)
      解决方案: 几个模块实现"各个模块接口UI" -> "各个接口UI"实现总的"总接口UI"