zoukankan      html  css  js  c++  java
  • 老调重弹--面向对象设计原则--S.O.L.I.D设计原则

    SRP - 单一职责原则

    • 全称:Single Responsibility Principle
    • 定义:每一个上下文对象(类、函数、变量等等)的定义应该仅仅包含单一的职责
    • 描述:对象提供单一职责的高度封装,对象的改变仅仅依赖于单一职责的改变,它基于软件设计中的高内聚性定义
    • 出处:Robert C. Martin(Bob大叔)《Agile Software Development, Principles, Patterns, and Practices》2002
    • 源头:Tom DeMarco 《Structured Analysis and Systems Specification》提出 cohesion   1979
    • 宣言:to make our classes more robust ! a class should have only one reason to change !

    OCP - 开放-封闭原则

    • 全称:Open-Closed Principle
    • 定义:上下文对象(类、模块、函数等)应该对扩展开放,对修改关闭
    • 描述:利用面向对象中的多态性(Polymorphic),更灵活地处理变更拥抱变化
    • 实现:1:抽象和继承,2:面向接口编程
    • 出处:Robert C. Martin(Bob大叔)《Agile Software Development, Principles, Patterns, and Practices》2002
    • 宣言:保护变更,拥抱变化

    LSP - Liskov替换原则

    • 全称:Liskov Substitusion Principle
    • 定义:父类型对象可以被子类型对象所取代
    • 出处:美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出
    • 场景:行为子类型,类型抽象和继承。设计类的抽象和继承及多态
    • 实现:参数(传入)的逆变性和返回(传出)的协变性
    • 设计:基于契约的设计方式模式(.net framework 4的code contract好像是另一回事?)
      • 前置条件:前置条件在子类中不可以被加强
      • 后置条件:后置条件在子类中不可以被削弱
      • 不变量:子类型的不变量必须存储在子类型中
    • 意义:如何才能设计出好的对象类型继承以及接口(参数及返回值类型)
    • 以下提供一个违反Liskov替换原则的范例,大家自己感受:
      static void DrawShape(Shape s)
      {
          if (s is Rectangle)
              DrawRectange(s as Rectangle);
          else if (s is Square)
              DrawSquare(s as Square);
          else
          {
              // ...
          }
      }

    ISP - 接口分离原则

    • 全称:Interface Segregation Principle
    • 定义:不应该强迫用户依赖于他们不用的方法
    • 描述:将粗粒度的大的接口分离为较小粒度具有明确规范的接口
    • 意义:松耦合,方便重构迭代
    • 接口:面向接口编程,降低依赖
    • 出处:Robert C. Martin(Bob大叔)《Agile Software Development, Principles, Patterns, and Practices》2002

    DIP- 依赖倒置原则

    • 全称:Dependency Inversion Principle
    • 定义:依赖于抽象,而不要依赖于具体,因为抽象相对稳定
    • 应用:在应用中通过依赖注入的方式实现解耦
      • 高级模块不应该依赖于低级模块,两者应该都依赖于抽象
      • 抽象不应该依赖于实现细节,实现细节应该依赖于抽象
    • 意义:重用低级模块,重用实现,解除依赖
    • 实现:通过接口或者抽象类
    • 其他:Plugin, Service Locator, or Dependency Injection
    • 出处:Robert C. Martin(Bob大叔)《Agile Software Development, Principles, Patterns, and Practices》2002
  • 相关阅读:
    2020/10/10周总结
    2020/10/02周总结
    2020/9/28周总结
    第十二周总结
    第十一周总结
    人月神话阅读笔记03
    人月神话阅读笔记02
    人月神话阅读笔记01
    冲刺一8
    冲刺一7
  • 原文地址:https://www.cnblogs.com/fecktty2013/p/software-design-solid.html
Copyright © 2011-2022 走看看