敏捷软件开发
2021-10-25 105
一些理论
- 原则
-
SRP 单一职责:
案例1: 比赛记分模块:分离 跟踪比赛 功能和 计算得分 功能
案例2: 画画工具部分: 绘制举行和计算面积 -
OCP 开放-封闭
案例: 抽象类,对扩展开放,对修改封闭(跟接下来的有关) -
LSP 里氏替换
问题案例: OCP设计的抽象类,后续需要添加持久类,然而这个持久类必须要由Persistent Object 派生。如图客户程序不能确保该Set 实际上是否是一个PersistentSet。
如果直接使用,会报错。dynamic_cast 会抛出 bad_cast 异常。由于是 Set 派生类导致这些函数,因此对类层次所做的这种改动违反了LSP
解决方案1: "约定",也就是没在源代码中解决它。缺点: 要不断地跟开发人员解释。
解决方案2: 重新设计层次结构。将Set 和 PersistentSet 分离,如下图问题案例2: Line 和 LineSegment 都有 IsOn()。
解决方案1: 提取出一个公共的超类,并让他们继承它。后续如果再加多几个,可能变成抽象类。 -
DIP 依赖转置
解决案例1: 开关控制灯泡 -> 开关控制灯泡系统控制灯泡
解决案例2: 读取输入,控制熔炉温度 -> 读取器读取输入,控制温度 -
ISP 接口隔离
问题案例: ATM 输出信息需要转换成许多不同语言 -> 几个模块实现 "总接口 UI" ( UI 接口大而杂)
解决方案: 几个模块实现"各个模块接口UI" -> "各个接口UI"实现总的"总接口UI"
-