老调重弹--面向对象设计原则--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
时间: 2024-08-11 21:21:09

老调重弹--面向对象设计原则--S.O.L.I.D设计原则的相关文章

深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http://freshbrewedcode.com/derekgreer/2011/12/31/solid-javascript-the-liskov-substitution-principle/ 开闭原则的描述是: Subtypes must be substitutable for their ba

深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP

前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The Open/Closed Principle(开闭原则OCP) The Liskov Substitution Principle(里氏替换原则LSP) The Interface Segregation Principle(接口分离原则ISP) The Dependency Inversion Pr

五大设计原则之(三)--------开闭原则

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 开闭原则的定义: 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭. 遵循开闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说,我们可以改变模块的功能. (2)对于修改是关闭的(Closed

深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/22/solid-javascript-the-dependency-inversion-principle/ 依赖倒置原则 依赖倒置原则的描述是: A. High-level modules should not

深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. 软件实体(类,模块,方法等等)应当对扩展开放,对修改关闭,即软件实体应当在不修改的前提下扩展.

深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP

前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(The Interface Segregation Principle). 英文原文:http://freshbrewedcode.com/derekgreer/2012/01/08/solid-javascript-the-interface-segregation-principle/ 注:这篇文章作者写得比较绕口,所以大叔理解得也比较郁闷,凑合着看吧,别深陷进去了 接口隔离原则的描述

六大设计原则(三)DIP依赖倒置原则

原文:六大设计原则(三)DIP依赖倒置原则 依赖倒置原则DIP(Dependence Inversion Principle) 依赖倒置原则的含义 高层模块不能依赖低层模块,二者都应该依赖其抽象. 抽象不应该依赖于细节. 细节应该依赖抽象. 什么是高层模块?低层模块? 每一个原子逻辑就是低层模块,原子逻辑再组就是高层模块. 什么是抽象和细节? 抽象是抽象类,不可被实例化. 细节是实现类,比如实现的接口或继承抽象类的子类,可以被实例化. 表现在Java语言中就是面向接口编程 模块间的依赖是通过抽象

六大设计原则(二)LSP里氏替换原则

里氏替换原则LSP(Liskov Subsituation Principle) 里氏替换原则定义 所有父类出现的地方可以使用子类替换并不会出现错误或异常,但是反之子类出现的地方不一定能用父类替换. LSP的四层含义 子类必须完全实现父类的方法 子类可以自己的个性(属性和方法) 覆盖或实现父类的方法时输入参数可以被放大 覆盖或实现父类的方法时输出结果可以被缩小 LSP的定义含义1--子类必须完全实现父类的方法 假设如下场景:定义一个枪支抽象类,一个场景类,三个枪支实现类,一个士兵类.此处,三个枪

设计模式六大原则(1):单一职责原则(转载)

设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案:遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险. 说到单一职责原则,很多人都会不屑一顾