这里说的设计原则是指用来指导类该如何定义? 其与设计模型的区别在于,后者是用来定义类之间的行为。

类设计原则

SRP 单一职责原则

一个类应该有且仅有一个职责。关于职责的含意,面向对象大师 Robert.C.Martin 有一个著名的定义:所

谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因

引起该类变化,其实就是耦合了多个互不相关的职责,就会降低这个类的内聚性。

“职责”是站在他人的角度来定义的,而不是自己定义的。

两个关于职责的重要结论:

1)职责是站在他人的角度来定义的

2)职责不是一件事,而是很多事情,但这些事情都是和职责紧密相关的

对应到面向对象设计领域,我们可以说一个类的职责应该如下定义:

1)类的职责是站在其它类的角度来定义的;

2)类的职责包含多个相关功能;

一个类只负责一组相关的事情。

【SRP 原则范围】

SRP 不能应用于聚合类, 优先使用对象组合,而不是类继承。

OCP 开放/封装原则

对扩展开放,对修改封闭

完整的 OCP 原则实际上应该这样表述: open for provider extension, closed for consumer modification,

翻译一下就是:对使用者修改关闭,对提供者扩展开放!

更通俗的意思就是:提供者增加新的功能,但使用者不需要修改代码!

所谓的增加新功能,并不是增加一个全新的功能,而是原有的功能有了替代实现。

假设现在你设计了“卡车” 、 “跑车” 、 “家用车”三种车,现在要增加一种车“卡

丁车” ,只要“卡丁车”也实现了“加速” 、 “刹车” 、 “转向” ,那么 player 不需要修改代码,就可以玩“卡

丁车”了;但如果你增加了一种“改装”的功能,那么 player 必须修改才能使用“改装”功能。

对应到代码上来说,OCP 的应用原则如下:

1)接口不变:包括函数名、函数参数、函数返回值等,可以应用 OCP

2)接口改变:已有函数修改名称、参数、返回值,或者增加新的函数,OCP 都不再适应

1)类之间应用 OCP:使用 interface 进行交互;

2)模块和模块、系统和系统:使用规定好的协议,不管是私有的还是公开的

LSP,Liskov substitution principle,中文翻译为“里氏替换原则”

1)子类的对象提供了父类的所有行为,且加上子类额外的一些东西(可以是功能,也可以是属性) ;

2)当程序基于父类实现时,如果将子类替换父类而程序不需要修改,则说明符合 LSP 原则

函数使用指向父类的指针或者引用时,必须能够在不知道子类类型的情况下使用子类的对象。 (子类必须能替换成它们的父类)

ISP,Interface Segregation Principle,中文翻译为“接口隔离原则”

客户端不应该被强迫去依赖它们并不需要的接口

ISP 原则承认对象需要非内聚的接口,然而 ISP 原则建议客户端不需要知道整个类,只需要知

道具有内聚接口的抽象父类即可。

DIP,dependency inversion principle,中文翻译为“依赖倒置原则”

DIP 原则主要有两点含义:

1)高层模块不应该直接依赖低层模块,两者都应该依赖抽象层;

2)抽象不能依赖细节,细节必须依赖抽象;

高层模块“依赖”低层模块:指高层模块需要调用低层模块的方法;

高层模块依赖抽象层:指高层模块基于抽象层编程;

低层模块依赖抽象层:指低层模块继承(inheritance)或者实现(implementation)抽象层;

SOLID 原则具体的应用场景如下:

 SRP 原则:用于类的设计

当我们想出一个类,或者设计出一个类的原型后,使用 SRP 原则核对一下类的设计是否符合 SRP 要求。

 OCP 原则:总的指导思想

OCP 原则是一个总的指导思想,在面向对象的设计中,如果能够符合 LSP/ISP/DIP 原则,一般情况下就

能够符合 OCP 原则了。

除了在面向对象的软件设计中外,OCP 也可以用于指导系统架构设计,例如常见的 CORBA、COM 协议,

其实都可以认为是 OCP 原则的具体应用和实现。

 LSP 原则:用于指导类继承的设计

当我们设计类之间的继承关系时,使用 LSP 原则来判断这种继承关系是否符合 LSP 要求。

 ISP 原则:用于指导接口的设计

ISP 原则可以认为是 SRP 原则的一个变种, 本质上和 SRP 的思想是一样。 SRP 用于指导类的设计, 而 ISP

用于指导接口的设计。

DIP 原则:用于指导如何抽象

当我们设计类之间的依赖关系时,可以使用 DIP 原则来判断这种依赖是否符合 DIP 原则。DIP 原则和 LSP

原则相辅相成:DIP 原则用于指导抽象出接口或者抽象类,而 LSP 原则指导从接口或者抽象类派生出新的

子类。

小结

 内聚是指模块内部元素的“凝聚力”

 是否专注模块的职责,才是内聚性的充要条件

 内聚性不是越高越好

 内聚关注模块内部的元素结合程度,耦合关注模块之间的依赖程度

 无论是“低内聚” ,还是“高耦合” ,其本质都是“不稳定”

 真正好的设计是在高内聚和低耦合间进行平衡

 职责是站在他人的角度来定义的,而不是自己定义的

 职责不是一件事,而是很多事情,但这些事情都是和职责紧密相关的

 SRP 原则用于指导类的设计

 OCP 原则是总的设计指导思想

 LSP 原则用于指导类继承的设计

 ISP 原则用于指导接口的设计

 DIP 原则用于指导类抽象的设计

 不要过度设计

【设计方法论】OOP设计原则相关推荐

  1. 机器学习编程接口(api)设计(oop 设计)

    fit: 对于 kmeans 来说,fit 的过程,就是训练,自然所需的参数,主要是数据集和聚类中心数, 1. classification(分类) def train(train_images, t ...

  2. 产品经理 - 产品设计方法论业务落地部分_包括流程产品文档方法论需求设计方法论

    整体 - 产品设计方法论思维导图 个人整理,存在异议大家可以讨论下 业务落地方法论 在进行了需求收集以及需求分析后,针对收集到的需求以及对应的分析结论后,需针对当前的需求点进行开发落地,核心即为两点, ...

  3. 网龙《DJ版设计方法论微课》笔记

    摘要:微信搜索[三桥君] 本课程笔记来自网龙产品设计训练营 >>课程地址 第1章 设计方法论概览 老师:刘德建 职位:研究院院长.哈佛大学客座教授(喜欢设计师头衔) 参与项目:91手机助手 ...

  4. 云盘存储 教学反思_对设计训练的设计:以建筑工房工作模型课题的教学实验为例对设计训练方法论的反思...

    「建筑工房」第四期专题报名点击 图像的记忆与城市空间 原文于2019年第2期<时代建筑> 本文阅读时长约15分钟 摘要:围绕建筑设计能力如何被训练这一话题,建筑工房以工作模型为基本教具完成 ...

  5. 相亲交友源码的架构设计,合成复用原则的实现

    合成复用原则是指尽量使用对象组合/聚合而不是继承关系达到相亲交友源码复用的目的.可以使相亲交友源码系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少. 继承叫作白箱复用,相当 ...

  6. 浅谈系统架构设计-从架构设计原理、架构设计原则、架构设计方法展开

    我们工作中一直强调要做架构设计.系分,最近前端同学在追求前端质量提升的时候,也在进行架构设计.前端系分的推广,那到底什么是架构设计和系分?该怎么做架构设计和系分?本文尝试对架构设计进行全面的介绍和分享 ...

  7. 《标签类目体系-面向业务的数据资产设计方法论》 读书随记

    <标签类目体系-面向业务的数据资产设计方法论> 读书随机 第一章 因 6大数据困局 1.数据孤岛,无法打通 2.烟囱式建设,重复造轮子 3.各说各话,没有统一口径 4.鸡同鸭讲,无法穿透业 ...

  8. 数据库设计方法论 - 继承

    继承这个概念做java开发的同学应该都很熟悉了,继承指的是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 数据库设计的时候也是 ...

  9. UI设计培训分享:app图标设计要遵循哪些原则

    APP图片设计是UI设计工作中经常会遇到的,一个好的APP产品,图标的设计是非常重要的,本期小编为大家分享的UI设计培训教程就是app图标设计要遵循哪些原则?来看看下面的详细介绍. UI设计培训分享: ...

最新文章

  1. 20101029总结
  2. python中函数的括号使用
  3. python包裹 函数_什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj....
  4. 十分钟玩转 jQuery、实例大全
  5. 4.24企业数据库应用实践技术沙龙
  6. feign和ajax,SpringCloud-feign 声明式服务调用
  7. java中使用es精准查询_使用ES简单查询语句须知
  8. Android学习笔记——ProgressBarHandler
  9. python爬虫教程-有什么好的python3爬虫入门教程或书籍吗?
  10. 避免使用PHP保留字作为常量、类名和方法名,以及命名空间的命名
  11. php--------使用js生成二维码
  12. excel中提取中文拼音
  13. java编写计算器的原理_Java语言开发的计算器的心得
  14. 如何运用Origin进行曲线拟合
  15. 傅立叶变换系列(二)傅立叶级数
  16. cortex m3 开源_开源增强现实耳机,Steam的125M有效帐户等
  17. 一只一元甜筒,一年卖了1200万,宜家的销售阴谋!
  18. LeetCode-1374-生成每种字符都是奇数个的字符串
  19. 软件推荐:多屏协作scrcpy
  20. 程序员考证,这十大证书含金量最高

热门文章

  1. xp故障恢复控制台和它的命令 1
  2. 火狐浏览器webdriver下载
  3. word 2013 并列显示两张图片(且各自带有题注)
  4. mmseg底层代码分析及修改
  5. Fiddler死活抓不了HTTPS包解决办法(2018更新版本)
  6. 身体指数bmi流程图_一说减肥就讲BMI,除了身体质量指数,还要关注这些身体数据...
  7. 有关一个公用的BPL的问题
  8. 单细胞-拟时序分析-R包SCORPIUS
  9. 破窗理论:搜索引擎暗规则之三(转)
  10. 基于ESP8266-12f 最小系统接线说明