当前位置: 首页 > news >正文

面向对象的基本原则

背景

面向对象是抽象技术的一种实现,将对象作为真实世界中实体的抽象,代表了特定的一块密集而内聚的信息。在面向对象设计及实现中,重点考虑的就是如何做到关注点分离。因为对象内的联系通常比对象间的联系更强。关注点分离就是将对象中高频的动作(涉及对象的内部结构)和低频率的动作(涉及对象间的相互作用)分离出来。针对对象内部结构的设计原则,这里也称为"高内聚",而针对对象间相互作用的设计原则,这里也称为"低耦合"或"松耦合"。
高内聚、松耦合只是偏理论的原则,那么在实际的面向对象的设计和实现过程中,又该如何保证这个原则呢?罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字SOLID(单一职责、开闭原则、里氏替换、接口隔离以及依赖反转,指代了面向对象的五个基本原则。当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。SOLID所包含的原则是通过引发编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时可以应用的指南。需要说明的是,在实际的面向对象开发过程中,开发者还会使用“迪米特法则”和“组合/聚合复用原则”。所以,面向对象的基本原则一共有7个(SOLID + 2),它们是:(1) 单一职责原则;(2) 开闭原则;(3) 里氏替换原则;(4) 接口隔离原则;(5) 依赖倒置原则;(6) 迪米特法则;(7) 组合/聚合复用原则。

1. 单一职责原则(Single Responsibility Principle)

每一个类应该专注于做一件事情。在编码的过程中,常使用“职责分离”思想来遵循该原则。

2. 开闭原则(Open Close Principle)

面向扩展开放,面向修改关闭。该原则是一种编码追求,过度的追求“开闭原则”会带来功能会系统的复杂性。

3. 里氏替换原则(Liskov Substitution Principle)

基类存在的地方,都可使用子类替换。里氏代换原则的直接应用是多态(动态绑定)。

4. 接口隔离原则(Interface Segregation Principle)

应为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。该原则指明客户(client)应该不依赖于它不使用的方法。也是实现“高内聚”的方式之一。该原则也用于系统解耦,方便系统重构。

5. 依赖倒置原则(Dependency Inversion Principle)

也称为“依赖倒置原则”,“依赖反转原则”。该原则是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。该原则规定:
(1)高层次的模块不应该依赖于低层次的模块,两者都应该依赖于抽象接口。(面向接口编程)
(2)抽象接口不应该依赖于具体实现(类的实例)。而具体实现则应该依赖于抽象接口(实现尽量依赖抽象,不依赖具体实现)

6. 迪米特法则(Law Of Demeter)

又叫“最少知识原则”,一个软件实体应当尽可能少的与其他实体发生相互作用。(这里将其称为“最小知道原则”)该原则是实现松耦合(Loose Coupling)遵循的原则之一。

7. 组合/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)

合成/聚合复用原则(CARP),也称为组合复用原则。该原则的语义化描述是:尽量使用合成/聚合达到复用,尽量少用继承。 注意,该原则并不是银弹,因为不能完全使用组合替换继承。只是在告知要慎用“继承”,一旦使用继承,就会带来“子类”和“父类”的紧耦合。实现方式,在一个类中引用另一个类的对象。

总结

面向对象需要把握的核心原则是关注点分离。这一原则并不仅仅适用于面向对象设计与实现。进一步说,实现关注点分离,就是要做到"高内聚"和"松耦合"。在面向对象领域,主要指以下七个原则:(1) 单一职责原则;(2) 开闭原则;(3) 里氏替换原则;(4) 接口隔离原则;(5) 依赖倒置原则;(6) 迪米特法则;(7) 组合/聚合复用原则。
需要说明的是,并不是说,实现了上面的7点就是好的设计,实际开发中,要根据具体情况具体分析,不可思维定式。

参考

《面向对象分析与设计》 Grady Booch, Robert A. Maskimchuk, Michael W. Engle, Bobbi J. Young, Jim Conallen, Kelli A. Houston 著, 王海鹏, 潘加宇 译
https://en.wikipedia.org/wiki/Single_responsibility_principle Single Responsibility Principle
https://en.wikipedia.org/wiki/Open–closed_principle Open Closed Principle
https://en.wikipedia.org/wiki/Interface_segregation_principle Interface Segregation Principle
https://en.wikipedia.org/wiki/Dependency_inversion_principle Dependency Inversion Principle
https://en.wikipedia.org/wiki/Law_of_Demeter Law of Demeter
https://en.wikipedia.org/wiki/Composition_over_inheritance Composition Over Inheritance

相关文章:

面向对象的基本原则

背景 面向对象是抽象技术的一种实现,将对象作为真实世界中实体的抽象,代表了特定的一块密集而内聚的信息。在面向对象设计及实现中,重点考虑的就是如何做到关注点分离。因为对象内的联系通常比对象间的联系更强。关注点分离就是将对象中高频…...

C语言开发基础知识(一)

文章目录 数据类型宏变量函数inline 内联函数static 关键字的作用const 关键字的作用extern 关键字的作用volatile 关键字的作用include 关键字的作用数组、字符串指针堆内存管理结构体文件操作数据类型 C语言中数据类型分有符号和无符号,默认是有符号的。 有符号类型: 数据…...

​API网关类型与区别​

什么是API网关? 在现代软件架构中,API(应用程序编程接口)网关起着重要的作用。它是一个中间层,用于管理和控制应用程序之间的通信。API网关可以提供一些关键功能,如流量控制,安全认证&#xff…...

linux:nginx网站升级至http2

参考: 怎样把网站升级到http/2 - 知乎 HTTP/2 与 HTTP/1.1:它们如何影响 Web 性能? | Cloudflare 总结: nginx.conf修改 http2需要ssl支持 listen 443 ssl http2;...

Flutter:屏幕适配

flutter_screenutil flutter_screenutil是一个用于在Flutter应用程序中进行屏幕适配的工具包。它旨在帮助开发者在不同屏幕尺寸和密度的设备上创建响应式的UI布局。 flutter_screenutil提供了一些用于处理尺寸和间距的方法,使得开发者可以根据设备的屏幕尺寸和密度…...

中科亿海微ROM使用

标题 ROM(Read-Only Memory,只读存储器)是一种在FPGA(Field-Programmable Gate Array,现场可编程门阵列)中常用的存储器类型。与RAM(Random Access Memory,机存取存储器)…...

Python接口自动化测试之UnitTest详解

基本概念 UnitTest单元测试框架是受到JUnit的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。 它分为四个部分test fixture、TestC…...

python——案例17:判断某年是否是闰年

案例17:判断某年是否是闰年 判断依据:闰年就是能被400整除,或者能被4整除的年份numint(input(输入年份:))if num%1000: if num%4000: #整百年份的判断print("%s年是闰年"%num) #…...

allure测试报告

使用pytest结合Allure进行测试报告生成的简单教程 allure测试报告 Allure基于Java开发,因此我们需要提前安装Java 8或以上版本的环境。 ◆安装allure-pytest插件在DOS窗口输入命令“pip3 install allure-pytest”,然后按“Enter”键。 下载安装Allure…...

Vue 路由懒加载

Vue 路由懒加载 随着 Web 应用的复杂性不断增加,性能优化成为了开发人员必须面对的挑战之一。Vue 路由懒加载是一项关键技术,它可以帮助我们提高 Web 应用的加载速度,从而提升用户体验。 在本篇技术博文中,我们将深入探讨 Vue 路…...

软件设计师(七)面向对象技术

面向对象: Object-Oriented, 是一种以客观世界中的对象为中心的开发方法。 面向对象方法有Booch方法、Coad方法和OMT方法等。推出了同一建模语言UML。 面向对象方法包括面向对象分析、面向对象设计和面向对象实现。 一、面向对象基础 1、面向对象的基本…...

Qt中将信号封装在一个继承类中的方法

QLabel标签类对应的信号如下: Qt中标签是没有双击(double Click)这个信号的; 需求一:若想双击标签使其能够改变标签中文字的内容,那么就需要自定义一个“双击”信号,并将其封装在QLabel类的派生…...

Docker介绍

1. docker是什么 1.1 为什么会有docker出现? 假设你在开发一个项目的时候,你使用的是windows系统而且你的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。你正在开发的应用依赖于你当前的配置而且还要依赖于某些配置文件。此外&#xf…...

C++红黑树

一、红黑树的概念 红黑树是一种二叉搜索树,在其每个节点上增加一个存储位用于表示节点的颜色,可以是Red或Black 通过对任何一条从根到叶子的路径上的各个节点着色方式的限制,红黑树确保没有一条路径比其他路径长两倍 红黑树的性质&#xff…...

LangChain与大模型的学习ing

大模型的菜鸟初学习 一、问题记录1、库的版本问题 二、实例记录1、公司名生成2、提示模板的使用3、LLM Chain4、LLMMemory5、聊天语言API 参考资料 一、问题记录 1、库的版本问题 openai.error.APIConnectionError: Error communicating with OpenAI: HTTPSConnectionPool(ho…...

Go把Map转成对象

最近使用了Redis的Hash,把一个对象给存储到了hash里面,具体如下: 现在需要从RedisHash缓存里面把结果给取出来,同时赋值到一个对象上面 result, err : global.GVA_REDIS.HGetAll(context.Background(), key).Result() 问题是resul…...

Java-网络编程

TCP TCP(Transmission Control Protocol)是一种在计算机网络中用于可靠数据传输的协议。它是一种面向连接的协议,确保数据在发送和接收之间的可靠性和有序性。以下是TCP是如何工作的简要概述: 建立连接: 当两台计算机…...

[数据集][目标检测]道路坑洼目标检测数据集VOC格式1510张2类别

数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):1510 标注数量(xml文件个数):1510 标注类别数:2 标注类别名称:["keng","…...

全网最详细,Pytest自动化测试框架-Fixture固件实战,你要的都有...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是固件 Fixt…...

React 入门学习

React 入门 一、基本认识1.1、前言1.2、什么是1.3、编译<br>1.4、特点1.5、高效 二、React环境和基本使用2.1、环境搭建2.2、脚手架项目基本使用2.2.1、src2.2.2、public2.2.3、package.json 三、JSX的理解和使用四、模块与模块化, 组件与组件化的理解4.1、模块与组件4.2…...

Keil环境下ST-LINK调试实战指南与常见问题解析

1. ST-LINK调试环境搭建 第一次用ST-LINK调试STM32时&#xff0c;我花了整整一个下午才搞定环境配置。现在回想起来&#xff0c;其实只要注意几个关键点就能避免很多坑。先说说硬件连接&#xff0c;ST-LINK和开发板的接线看似简单&#xff0c;但接错线的情况太常见了。VCC、GND…...

Python asyncio 并发任务分发机制

Python asyncio并发任务分发机制解析 在当今高并发的网络应用中&#xff0c;如何高效处理大量I/O密集型任务成为开发者关注的焦点。Python的asyncio库通过事件循环和协程机制&#xff0c;提供了一种轻量级的并发解决方案。与传统的多线程相比&#xff0c;asyncio避免了线程切换…...

Step3-VL-10B-Base模型部署避坑指南:解决C盘空间不足与依赖冲突

Step3-VL-10B-Base模型部署避坑指南&#xff1a;解决C盘空间不足与依赖冲突 最近有不少朋友在尝试部署Step3-VL-10B-Base这个视觉语言大模型时&#xff0c;遇到了两个特别头疼的问题。一个是刚跑起来没多久&#xff0c;C盘就飘红了&#xff0c;系统提示空间不足&#xff1b;另…...

Ubuntu动态库路径管理全攻略:从LD_LIBRARY_PATH到ldconfig实战

1. 动态库路径管理基础 当你第一次在Ubuntu上运行程序时&#xff0c;看到"error while loading shared libraries"这样的报错&#xff0c;是不是感觉一头雾水&#xff1f;这其实是Linux系统在告诉你&#xff1a;"我找不到程序需要的动态库文件啦&#xff01;&q…...

大学生英语学习实测:低压力碎片化阅读,轻松养成长期学习习惯

不少大学生的英语学习&#xff0c;一直陷入恶性循环&#xff1a;单词书本本堆积&#xff0c;学习软件来回更换&#xff0c;每日打卡的计划屡屡中断。等到面对四六级考试时&#xff0c;依旧存在阅读缓慢、写作匮乏、听力薄弱等问题。其实大多数人并非不够努力&#xff0c;而是传…...

QCustomPlot图表美化指南:坐标轴刻度格式的全面解析(gb、f、c格式详解)

QCustomPlot图表美化指南&#xff1a;坐标轴刻度格式的全面解析&#xff08;gb、f、c格式详解&#xff09; 在数据可视化领域&#xff0c;细节决定专业度。一个优秀的图表不仅需要准确传达信息&#xff0c;更需要通过精心的视觉设计提升阅读体验。作为Qt生态中最强大的绘图库之…...

从零到自动化:用FastAPI+Requests打造你的第一个接口测试平台(告别Postman手动点点点)

从零构建企业级接口自动化测试平台&#xff1a;FastAPIRequests实战指南 在当今快速迭代的软件开发周期中&#xff0c;接口测试已成为保障产品质量的关键环节。传统手工测试工具如Postman虽然直观易用&#xff0c;但面对频繁变更的接口和大量回归测试场景时&#xff0c;往往显得…...

【AIAgent代码审查黄金标准】:2026奇点大会联合IEEE发布的首个L3级可信审查评估框架(仅限首批200家获授)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AIAgent代码审查 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上&#xff0c;AIAgent代码审查成为核心议题之一。与传统静态分析工具不同&#xff0c;新一代AIAgent具备上下文感知、跨文件语义理解…...

Qt6.8编译路径问题解析:解决QMainWindow文件缺失的三种方案

1. 遇到Qt6.8编译错误时的第一反应 当你满怀期待地打开Qt Creator准备编译项目&#xff0c;突然蹦出一个红色错误提示&#xff1a;"...\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist"&#xff0c;这时候的心情就像煮熟的鸭子飞走了。别担…...

Unsloth量化指南:手把手教你压缩模型,速度提升2倍

Unsloth量化指南&#xff1a;手把手教你压缩模型&#xff0c;速度提升2倍 1. Unsloth量化技术概述 1.1 什么是模型量化 模型量化是一种通过降低模型参数的数值精度来减小模型体积和加速推理的技术。想象一下&#xff0c;当你需要搬运一堆书籍时&#xff0c;把精装本换成平装…...