【设计方法论】OOP设计原则
这里说的设计原则是指用来指导类该如何定义? 其与设计模型的区别在于,后者是用来定义类之间的行为。
类设计原则
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设计原则相关推荐
- 机器学习编程接口(api)设计(oop 设计)
fit: 对于 kmeans 来说,fit 的过程,就是训练,自然所需的参数,主要是数据集和聚类中心数, 1. classification(分类) def train(train_images, t ...
- 产品经理 - 产品设计方法论业务落地部分_包括流程产品文档方法论需求设计方法论
整体 - 产品设计方法论思维导图 个人整理,存在异议大家可以讨论下 业务落地方法论 在进行了需求收集以及需求分析后,针对收集到的需求以及对应的分析结论后,需针对当前的需求点进行开发落地,核心即为两点, ...
- 网龙《DJ版设计方法论微课》笔记
摘要:微信搜索[三桥君] 本课程笔记来自网龙产品设计训练营 >>课程地址 第1章 设计方法论概览 老师:刘德建 职位:研究院院长.哈佛大学客座教授(喜欢设计师头衔) 参与项目:91手机助手 ...
- 云盘存储 教学反思_对设计训练的设计:以建筑工房工作模型课题的教学实验为例对设计训练方法论的反思...
「建筑工房」第四期专题报名点击 图像的记忆与城市空间 原文于2019年第2期<时代建筑> 本文阅读时长约15分钟 摘要:围绕建筑设计能力如何被训练这一话题,建筑工房以工作模型为基本教具完成 ...
- 相亲交友源码的架构设计,合成复用原则的实现
合成复用原则是指尽量使用对象组合/聚合而不是继承关系达到相亲交友源码复用的目的.可以使相亲交友源码系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少. 继承叫作白箱复用,相当 ...
- 浅谈系统架构设计-从架构设计原理、架构设计原则、架构设计方法展开
我们工作中一直强调要做架构设计.系分,最近前端同学在追求前端质量提升的时候,也在进行架构设计.前端系分的推广,那到底什么是架构设计和系分?该怎么做架构设计和系分?本文尝试对架构设计进行全面的介绍和分享 ...
- 《标签类目体系-面向业务的数据资产设计方法论》 读书随记
<标签类目体系-面向业务的数据资产设计方法论> 读书随机 第一章 因 6大数据困局 1.数据孤岛,无法打通 2.烟囱式建设,重复造轮子 3.各说各话,没有统一口径 4.鸡同鸭讲,无法穿透业 ...
- 数据库设计方法论 - 继承
继承这个概念做java开发的同学应该都很熟悉了,继承指的是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 数据库设计的时候也是 ...
- UI设计培训分享:app图标设计要遵循哪些原则
APP图片设计是UI设计工作中经常会遇到的,一个好的APP产品,图标的设计是非常重要的,本期小编为大家分享的UI设计培训教程就是app图标设计要遵循哪些原则?来看看下面的详细介绍. UI设计培训分享: ...
最新文章
- 20101029总结
- python中函数的括号使用
- python包裹 函数_什么是最干净的方法调用一个Python函数从C++与一个Sigg包裹的Obj....
- 十分钟玩转 jQuery、实例大全
- 4.24企业数据库应用实践技术沙龙
- feign和ajax,SpringCloud-feign 声明式服务调用
- java中使用es精准查询_使用ES简单查询语句须知
- Android学习笔记——ProgressBarHandler
- python爬虫教程-有什么好的python3爬虫入门教程或书籍吗?
- 避免使用PHP保留字作为常量、类名和方法名,以及命名空间的命名
- php--------使用js生成二维码
- excel中提取中文拼音
- java编写计算器的原理_Java语言开发的计算器的心得
- 如何运用Origin进行曲线拟合
- 傅立叶变换系列(二)傅立叶级数
- cortex m3 开源_开源增强现实耳机,Steam的125M有效帐户等
- 一只一元甜筒,一年卖了1200万,宜家的销售阴谋!
- LeetCode-1374-生成每种字符都是奇数个的字符串
- 软件推荐:多屏协作scrcpy
- 程序员考证,这十大证书含金量最高