面向对象(OOP)与面向对象设计(OOD)
文章目录
- 面向对象的基本原则
- 什么是面向对象OOP?
- OOP与OOD
- 为什么要OOD?
- OOD的基本原则
- S : 单一职责原则
- O : 开放闭合原则
- L :Liskov's替换原则
- I : 接口分离原则
- D : 依赖倒置原则
- 其他原则
面向对象的基本原则
这是对于该文章的一些总结,感谢作者:如何向妻子解释OOD
什么是面向对象OOP?
OOP (Object Oriented Programming),一种抽象化的编程思想,又被称为物件导向程式设计,先将客观事物抽象化,再通过程序来‘具体’实现,其中探讨整体、组分、以及各组分之间的联结关系,有些类似于还原论思想。
OOP将程序极度细分与模块化,使其灵活而可复用,意图将软件做得跟硬件一样,具备热插拔的能力。
其中包括了 封装,继承,多态 等重要思想。
类、对象、继承、重写 等技术手段,都是为了实现这些思想而准备。
OOP与OOD
OOP与OOD,类似于现实语言中 ‘基础语法’ 和 ‘书写文章’ 之间的关系。
OOP中,我们定义类、封装属性与方法,并根据类的关系定义它们之间的层次,这是 基本原则与核心思路,而OOD则是 整体思路与框架。
为什么要OOD?
一句话:因为软件一定会变化。
软件是为了解决现实世界的任务与人们的需求而生,而没有什么需求是永远不变的,软件仅仅在今天工作的很好是不够的,它还应该能灵活的适应将来的变化。
也就是说,我们要开发强健而敏捷的软件。
而如果能够做到以下几点,那我们就正在OOD:
1. 面向对象 | 2. 可复用 |
---|---|
3. 能以最小的代价满足变化 | 4. 不用改变现有代码满足扩展 |
OOD的基本原则
被称为SOLID的基本5原则:
S = Single Responsibility Principle(单一职责原则)
O = Opened Closed Principle (开放闭合原则)
L = Liskov Substitution Principle(Liscov替换原则)
I = Interface Segregation Principle(接口分离原则)
D = Dependency Inversion Principle(依赖倒置原则)
S : 单一职责原则
“并不是因为你能,你就应该做”。
引起类变化的因素永远不要多于一个或者说一个类的职责有且只有一个:
如果一个类,会因为多个原因导致它发生改变(多于一个职责),那就要将它拆分为多个类。
因为每个职责是轴向变化的,如果类包含了多个职责,代码会变得耦合。
做法:将类与方法拆分为许多 子部分,让每一部分只做一件事,便于复用和集中管理。
O : 开放闭合原则
软件实体(模块、类、方法)对扩展开放,对修改闭合
即可以在不修改的类的前提下,扩展类的行为。
当需求变化时,核心类和模块的源代码不应被改动。
比如,服务器和浏览器耦合得太紧,那么如果服务器被替换或是改变了,浏览器也需要改变甚至替换掉。
做法:抽象出服务器类,浏览器包含一个抽象服务器的引用,再由具体的服务器类来实现抽象服务器类。
L :Liskov’s替换原则
why:保证继承能够被正确使用。
如果没有LSP,类继承就会混乱;
如果没有LSP,适用与基类的单元测试将不能成功用于测试子类;
如果子类作为一个参数传递给方法,将会出现未知行为;
解释:任何基类出现的地方都应该可以无差别的使用子类替换,而不引起其他行为的改变。
或者说:使用基类引用的方法必须能使用继承类的对象而不必知道它。
做法:合理继承、慎重重写。
I : 接口分离原则
客户端不应该被迫依赖于它们不用的接口。
像是以前电视机的遥控器,布满了各种不知名的、花里胡哨的按钮,然而有很多永远都用不到。
实际上,现在许多智能电视机的遥控器,就都设计得很简洁。
接口也是如此,其应该尽量瘦下来,不要实现不必x要的功能,肥胖的接口会在系统中引入不必要的复杂度,降低可维护性或鲁棒性。
做法:一个类要给多个客户使用,那么可以为每个客户创建一个接口,然后这个类实现所有的接口。
而不要只创建一个接口,其中包含所有客户类需要的方法,然后这个类实现这个接口。
D : 依赖倒置原则
高层模块不应该依赖底层模块,两者都应该依赖其抽象
就像汽车、电脑等实体如果除了问题,可以通过替换引擎、显卡等零件来修复,而不用再买一个一样,软件中也应该做到如此。
如果破坏了这个原则,那么会有这样的风险:
使用低级类会破环高级代码;
当低级类变化时需要很多时间和代价来修改高级代码;
产生低复用的代码;
其他原则
除了SOLID,还有一些关于OOP的其他原则:
“Composition over Inheritance”: This says about favoring composition over inheritance.(“组合高于继承”:这是说要更倾向于使用组合,而非继承)
“Principle of least knowledge”: This says that “the less your class knows, the better”.(“笛米特法则【最小知识原则】”:这是说"你的类对其它类知晓得越少越好"【松耦合:类只与其协作的类进行交互,且无需了解它们的内部结构】)
“The Common Closure principle” : This says that “related classes should be packaged together”.(“共同封闭原则”:这是说"相关类应该打包在一起"【这样所有的修改都会发生在一个包中,而不是很多个】)
“The Stable Abstractions principle”: This says that “the more stable a class is, the more it must consist of abstract classes.”(“稳定抽象原则”:这是说"类越稳定,越应该由抽象类组成"【稳定性跟抽象程度成正比,越是具体,越不稳定】)
最后,要想更深入的理解OOP与OOD,还是要通过自身不断实践。
面向对象(OOP)与面向对象设计(OOD)相关推荐
- S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则
注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html <How ...
- 如何向妻子解释面向对象设计(OOD)
前言 此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不 ...
- 面向对象的分析和设计
OOA,面向对象分析(Object Oriented Analysis ) 的目的是获得对应问题的理解. 理解的目的是确定系统功能和性能要求.面向对象分析技术可以将系统的行为和信息的关系表示为迭代构造 ...
- OOAD:面向对象的分析和设计
OOAD:面向对象的分析和设计 1.什么是面向对象 面向对象(Object-Orientation,简称OO)是一种系统建模技术/编程思想. 面向对象编程(Object-Orienta ...
- UML和模式应用(1):面向对象的分析与设计
UML和模式应用(1):面向对象的分析与设计 学习笔记:1小时 1.1.什么是分析和设计 分析(analysis):强调的是对问题和需求的调查研究,而不是解决方案,即应该如何使用系统,系统应该具有哪些 ...
- 面向对象(OOP)基本概念
面向对象(OOP)基本概念 {#toc_0} 面向对象编程 ------ Object Oriented Programming 简写 OOP 目标 {#toc_1} 了解 面向对象 基本概念 面向对 ...
- 面向对象的分析与设计
目录 介绍 你会学到什么? 你不会学到什么? 背景 软件开发过程模型简介 为什么我需要了解过程模型 面向对象的分析和设计--最需要的定义 开发过程与开发方法论的区别 面向对象分析 面向对象的设计 你应 ...
- Python使用---面向对象OOP(类和对象)--完善中
来源于此 目录 1.面向对象(OOP)基本概念 1.1 过程和函数(科普) 1.2 面相过程 和 面相对象 基本概念 2 类和对象 2.1 类 2.2 对象 2.3 类和对象的关系 3 类的设计 4 ...
- java怎样用类模板创建对象_java入门(十四) | 面向对象(OOP)之类和对象
上一期是变量,在java中变量总是无处不在,而变量其意就是可以改变的数,在一般情况下我们可以以变量类型,变量名,变量值来描述它 这一期是给面向对象(OOP)开了一个头,对他的概念,三大特征有了一个基础 ...
- 第一阶段:Java基础总复习一一一和一一一面向对象OOP总复习
一.Java基础 0.Maven的介绍: 官网:https://maven.apache.org/download.cgi (1)Maven是什么? Maven 是 Apache 开源组织奉献的一个开 ...
最新文章
- IOS6.0 应用内直接下载程序 不需跳转AppStore
- 一线互联网智能推荐系统架构演进
- 浅谈SQL Server内部运行机制
- excel java concat
- python any()和all()
- 日志模板html源码,HTML红色欧美形式教堂动态日志网页模板代码
- 百练OJ:4151:电影节
- PHP 实现归并排序算法
- linux驱动文件操作简单介绍
- 求两个已排序单链表中相同的数据(C语言)
- 如何清空android ListView控件的内容
- 【Vue学习】—Vue UI组件库(二十八)
- .Net时间运算 - DateTime类,TimeSpan类
- [转]java String的经典问题(new String(), String)
- 至强cpu型号列表_Cascade Lake全家福:图说第二代至强可扩展处理器
- 【原理】 进程调度算法
- class 文件比较
- Notelife for Mac(笔记管理工具)
- 靠谱的企业并购流程|塔米狗
- 如何高效优雅地下载CMIP6模式数据
热门文章
- 安装失败解决方法-针式PKM
- python安装包下载太慢解决
- 谈谈如何抓取ajax动态网站
- 踔厉奋发,笃行不怠,我的第一篇CSDN文章
- PHP+mysql数据库开发搜索功能:中英文分词+全文检索(MySQL全文检索+中文分词(SCWS))...
- 笔记本网卡总断连,如何使得网卡不自动休眠?
- win10下1920*1080字体模糊解决办法
- 西门子PLC 1214C 做的压机控制 可以在触摸屏上任意编辑压装逻辑
- 支付宝直付通管理系统,进件二级商户
- vue 使用人脸识别_使用Vue.js和Kairos构建简单的人脸识别应用