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

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

  1. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

  2. (转) 面向对象设计原则(二):开放-封闭原则(OCP)

    原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...

  3. S.O.L.I.D五大原则之单一职责SRP

    转自 : 汤姆大叔的blog Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单 ...

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

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...

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

    前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...

  6. S.O.L.I.D五大原则- 深入了解javascript

    /* S.O.L.I.D五大原则 1. 单一原则 2. 开闭原则 3. 里氏替换原则 4. 接口分离原则 5. 依赖反转原则 */ /*单一原则:类发生更改的原因只有一个 如何知道一个对象的多个行为构 ...

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

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:htt ...

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

    前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...

  9. 第五周:面向对象部分内容总结(5)---java设计规则

    面向对象设计原则 1.开闭原则 开闭原则理解: 简单说就是一个软件实体支持扩展,不支持修改.就是在不改变源码的基础上,扩展其它的功能. 其实笔者认为,开闭原则无非就是想表达这样一层意思:用抽象构建框架 ...

随机推荐

  1. 谈话ZooKeeper(一个)分析ZooKeeper的Quorums机制--预防Split-Brain问题

    使用ZooKeeper学生们应该看到一个参数.它是ZooKeeper超过一半的群集必须节点(Majority)可用的.外来人才在整个集群中可用.在大多数情况下,这种说法是正确的. 谈论这篇文章背后的原 ...

  2. WIN8 、WIN7 下IIS7.5、IIS8 的rewrite 伪静态功能设置方法

    原文 WIN8 .WIN7 下IIS7.5.IIS8 的rewrite 伪静态功能设置方法 win7和win8系统都自带有iis的功能.关于IIS的安装,上一篇已经讲述,这里就不重复了. 下面说下在w ...

  3. C++它 typedef void *HANDLE

    阅读时编写代码的代码,经常看到一个代码: typedef void *HANDLE ,这是它背后的故事?怎么理解呢? 不明白的时候.这是非常美妙的感觉,后来我才知道这,这是typedef定义,就在vo ...

  4. 启示—地点IT高管20在职场心脏经(读书笔记6)

    启示--一个IT高管20在职场心脏经 第七章  关于销售 用"最"来形容公司的销售.能够用上若干的词汇: 最牛,最累,最精,最傻,最有钱,最贱,最能吹.最能装... 1.1  销售 ...

  5. 【剑指offer】数字数组中只出现一次(2)

    转载请注明出处:http://blog.csdn.net/mmc_maodun/article/details/27800577 题目:一个int数组中有三个数字a.b.c仅仅出现一次,其它数字都出现 ...

  6. android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色

    1.更改PagerTabStrip背景颜色 我们直接在布局中设置background属性可以: <android.support.v4.view.ViewPager android:id=&qu ...

  7. 使用ExpandableListView时间轴效果达到

    不废话,首先在地图上,查看结果 这是用ExpandableListView来实现时间轴效果,原理比較简单,以月份为第一级,以天为第二级来实现的. package com.hj.main; import ...

  8. Lichee (六) 优化配置的微内核

    我们的分析<Lichee(二) 在sun4i_crane平台下的编译 >的时候.竟然没有一个步骤是在配置内核 make ARCH=arm menuconfig 细致的读过的代码的会发现,在 ...

  9. javascript系列之执行上下文

    原文:javascript系列之执行上下文 写在前面:一 直想系统的总结一下学过的javascript知识,喜欢这门语言也热爱这门语言.未来想从事前端方面的工作,提前把自己的知识梳理一下.前面写了些 ...

  10. Swift游戏开发实战教程(霸内部信息大学)

    Swift游戏开发实战教程(大学霸内部资料) 试读下载地址:http://pan.baidu.com/s/1sj7DvQH 介绍:本教程是国内第一本Swift游戏开发专向资料. 本教程具体解说记忆配对 ...