老调重弹--面向对象设计原则--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
老调重弹--面向对象设计原则--S.O.L.I.D设计原则的更多相关文章
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html < ...
- (转) 面向对象设计原则(二):开放-封闭原则(OCP)
原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...
- S.O.L.I.D五大原则之单一职责SRP
转自 : 汤姆大叔的blog Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单 ...
- 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...
- 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...
- S.O.L.I.D五大原则- 深入了解javascript
/* S.O.L.I.D五大原则 1. 单一原则 2. 开闭原则 3. 里氏替换原则 4. 接口分离原则 5. 依赖反转原则 */ /*单一原则:类发生更改的原因只有一个 如何知道一个对象的多个行为构 ...
- 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(The Dependency Inversion Principle ). 英文原文:htt ...
- 深入理解JavaScript系列(7):S.O.L.I.D五大原则之开闭原则OCP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第2篇,开闭原则OCP(The Open/Closed Principle ). 开闭原则的描述是: Software ...
- 第五周:面向对象部分内容总结(5)---java设计规则
面向对象设计原则 1.开闭原则 开闭原则理解: 简单说就是一个软件实体支持扩展,不支持修改.就是在不改变源码的基础上,扩展其它的功能. 其实笔者认为,开闭原则无非就是想表达这样一层意思:用抽象构建框架 ...
随机推荐
- Swift: 打造滑动解锁文字动画
原文:Swift: 打造滑动解锁文字动画 最近木事,找出来玩了玩facebook的paper.到处都是那个"slide to unlock your phone"的效果啊.忽闪忽闪 ...
- 【年终分享】彩票数据预测算法(一):离散型马尔可夫链模型实现【附C#代码】
原文:[年终分享]彩票数据预测算法(一):离散型马尔可夫链模型实现[附C#代码] 前言:彩票是一个坑,千万不要往里面跳.任何预测彩票的方法都不可能100%,都只能说比你盲目去买要多那么一些机会而已. ...
- 解决Gradle minifyEnabled无法找到错误
Android studio最新版0.9支持proguard minify,shrinkResources ,尝试了下,提示找不到minifyEnabled方法 Error:(29, 0) Gradl ...
- 什么是WEBserver? 经常使用的WEBserver有哪些?
什么是WEBserver? 经常使用的WEBserver有哪些? 一.什么是WEBserver Webserver能够解析HTTP协议.当Webserver接收到一个HTTP请求,会返回一个HTTP响 ...
- java 7K交通灯管理系统面试题
交通灯管理系统 模拟实现十字路口的交通灯管理系统逻辑.详细需求例如以下: 1. 异常随机生成依照各个路线行驶的车辆. 比如: 由南向而来去往北向的车辆----直行车辆 由西向而来去往 ...
- HTTP的REST服务简介
REST简介 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么, ...
- ServiceStack.Redis——Redis于.net向上client解
ServiceStack.Redis--Redis于.net向上client解 源代码和使用: https://github.com/ServiceStack/ServiceStack.Redis 样 ...
- 动态传递参数到DevExpress.XtraReports的小结
原文:动态传递参数到DevExpress.XtraReports的小结 前两种方法和WinForm一样,可以传递参数.数组.实体对象.DataTable等1. 采用构造函数具体用法:在Report中p ...
- crawler_网络爬虫中编码的正确处理与乱码的解决策略
转载: http://hi.baidu.com/erliang20088/item/9156132bdaeae8949c63d134 最近一个月一直在对nutch1.6版进行中等层次的二次开发,本来是 ...
- SQL Server Log文件对磁盘的写操作大小是多少
原文:SQL Server Log文件对磁盘的写操作大小是多少 SQL Server 数据库有三种文件类型,分别是数据文件.次要数据文件和日志文件,其中日志文件包含着用于恢复数据库的所有日志信息,SQ ...