敏捷软件开发之敏捷设计原则

第七章 什么是设计模式

1. 源代码是软件系统的主要设计文档

  • 我们不应该认为软件设计就是一组和代码分离的UML图,UML图只是描述了设计的一部分。
  • 软件项目的设计是一个抽像的概念。它和程序的概括形状、结构以及每一个模块、类和方法的详细形状和结构有关。
  • 设计的最终体现在 源代码 中。

2.设计中臭味——腐化软件的气味

  • 僵化性: 耦合性高,模块组件件关系太紧密,依赖性高,一动全动。
  • 脆弱性: 改动一处,其他相关联的地方也会变动,引发意想不到的问题。
  • 牢固性: 设计难以重用。
  • 粘滞性: 这一点有点难以理解。
  • 不必要的复杂性: 导入不必要的模块,组件或包。
  • 不必要的重复: 随意copy,将可以的抽象隐藏起来,而且如果随处copy的代码(如果有错误)需要变动,得到处进行修改。
    • 【案例】:开发中,打印空指针异常信息处理方法的例子
  • 晦涩性: 模块难以理解。
  • 设计中的臭味

  • 本质: 构造抽象来隔离引起的变化
  • 如何知道变化的发生:
    • 进行适当的调查,提出正确的问题,并且使用我们的经验和一般常识,最终,直到我们会一直等到变化发生的时候才采取行动。
  • 结论:
  • 在许多方面,OCP都是面向对象设计的核心所在,遵循这个原则可以带来巨大好处。比如,灵活性,可重用性以及可维护性。

  • 第十章 Liskov替换原则(LSP)

    • 定义:
    • 子类型必须能够替换掉它们的基类型

    • 背后的本质:继承
    • 描述: 若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P行为功能不变,则S是T的子类型。
    • 隐藏的问题:一般违反LSP原则的同时,也潜在的违反了OCP原则。
    • Rectangle类与Square类违反了LSP的有趣例子
    • 结论:
    • 一个模型,如果孤立地看,并不具有真正意义上的有效性。在考虑一个特定设计是否恰当时,不能完全孤立地来看这个解决方案。必须要根据该设计的使用者所做出的合理假设来审视它。

    • 基于契约式设计(约定大于配置)
      • 契约:是通过为每个方法声明的前置条件和后置条件来指定的。
      • 要使一个方法得以执行,前置条件必须为真。执行完毕后,该方法要保证后置条件为真。
    • 继承的适用性

    • 分离接口的两种方式:
      • 使用委托分离接口
      • 使用多重继承分离接口

    第十二章 依赖倒置原则(DIP)

    • 定义:

    • a.高层模块不应该依赖于低层模块。两者都应该依赖于抽象。
      b.抽象不应该依赖于细节。细节应该依赖于抽象。

    • 依赖倒置原则描述

      敏捷软件开发之敏捷设计原则
    • 设计的层次化;

      • 所有结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供了一组内聚的服务。
      • 这里的倒置不仅仅是依赖关系的倒置,它也是接口所有权的倒置。
    • 依赖于抽象: 程序中所有的依赖关系都应该终止于抽象类或者接口。

      1. 任何变量都不应该持有一个指向具体类的指针或者引用。
      2. 任何类都不应该从具体类派生。
      3. 任何方法都不应该覆写它的任何基类中的已经实现了的方法。
    • java是静态编程语言,python是动态编程语言。

    参考博客:
    • 单一职责原则(Single Responsibility Principle)
    • 开放封闭原则(Open Closed Principle)
    • 设计模式六大原则(2):里氏替换原则
    • 里氏替换原则(Liskov Substitution Principle)
    • 接口分离原则(Interface Segregation Principle)
    • 依赖倒置原则(Dependency Inversion Principle)

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年2月21日
    下一篇 2019年2月21日

    相关推荐