面向对象七大原则

news2024/12/26 0:06:01

学习目标

了解面向对象七大原则基本概念。

在之后实践应用中,要给予七大原则去设计程序。

为什么有七大原则

七大原则总体要实现的目标是:

高内聚、低耦合。

使程序模块的可重复性、移植性增强。

高内聚低耦合

从类角度来看,高内聚低耦合:

减少类内部,对其他类的调用。

从功能块来看,高内聚低耦合:

减少模块之间的交互复杂度。

七大原则

单一职责原则、开闭原则、里氏替换原则、依赖倒转原则、迪米特原则、接口隔离原则、合成复用原则。

单一职责原则

SRP(Singal Responsibility Principe)

类被修改的几率很大,因此应该专注于单一的功能。如果把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能终止另一个功能。

举例:假设程序、策划、美术三个工种是三个类,他们应该各司其职,在程序世界中只应该做自己应该做的事情。

开闭原则

OCP(Open-Closed Principe)

对拓展开发,对修改关闭。

拓展开发:模块的行为可以被拓展从而满足新的要求。

修改关闭:不予许修改模块的源代码(或者尽量使修改最小化)。

举例:继承就是最典型的开闭原则的体现,可以通过添加新的子类和重写父类的方法来实现。

里氏替换原则

LSP(Liskov Substitution Principle)

任何父类出现的地方,子类都有可以替代。

举例:用弗雷容器装载子类对象,因为子类对象包含了父类的所有内容。

依赖倒转原则

DIP(Dependence Inversion Principle)

要依赖于抽象,不要依赖于具体的实现

迪米特原则

LoP(Law of Demeter)

又称最少知识原则

一个对象应当对其他对象尽可能少的了解,不要和陌生人说话。

举例:一个对象中的成员,要进克少的和其它类建立关系,目的是降低耦合性。

 接口分类原则

ISP(Interface Segregation Principle)

不应该强迫别人以来他们不需要使用的方法。

一个接口不需要提供太多的行为,一个接口应该金莲只提供一个对外的功能,让别人去选择需要实现什么样的行为,而不是把所有的行为都封装到一个接口当中。

举例:飞行接口、走路接口、跑步接口等等虽然都是移动的行为,但是我们应该把他们分为一个一个单独的接口,让别人去选择使用。

合成复用原则

CRP(Composite Reuse Principle)

尽量使用对象组合,而不是继承来达到复用的目的。

继承关系是强耦合,组合关系是低耦合。

举例:脸应该是眼睛、鼻子、嘴巴、耳朵的组合,而不是一次的继承;角色和装备也应该是组合,而不是继承。

注意:不能盲目的使用合成复用原则,要在遵循迪米特原则的前提下。

总结

七大原则

单一职责原则:一个类只处理自己应该处理的内容,不应该啥都写在一起。

开闭原则:对拓展开放,对修改关闭。新加功能尽量是加处理而不是改代码

里氏替换原则:任何地方子类都能替代父类,父类容器装子类

依赖倒转原则:不要依赖具体的实现,要依赖抽象(接口)

迪米特原则:一个类要尽量减少对别的类的了解,尽量少用别的类和自己关联

接口隔离原则:一个接口一个行为,不要一个接口n个行为

合成复用原则:除非设计上需要继承,否则尽量用组合复用的形式

如何使用这些原则

在开始做项目之前,整理UML类图时,先按照自己的想法把需要的类整理出来,基于七大原则去优化整理自己的设计。

整体目标是:高内聚,低耦合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1930911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LTSPICE仿真电路:(二十)TVS管简单仿真

1.目的 目的很简单,就是为了更加了解TVS管,以及更加能记住他的特性,加深印象,原本是只打算仿真TVS管,后面做着做着,搞二极管伏安特性曲线的时候,发现稳压二极管和TVS管比较接近,索性…

解决 Vscode不支持c++11的语法

问题: 解决方案: 1、按 CtrlShiftP 调出命令面板,输入 C/C: Edit Configurations (UI) 并选择它。这将打开 C/C 配置界面 2、打开 c_cpp_properties.json 文件 3、编辑 c_cpp_properties.json 4、保存 c_cpp_properties.json 文件。 关闭并…

【HarmonyOS】关于鸿蒙消息推送的心得体会 (一)

【HarmonyOS】关于鸿蒙消息推送的心得体会(一) 前言 这几天调研了鸿蒙消息推送的实现方式,形成了开发设计方案,颇有体会,与各位分享。 虽然没做之前觉得很简单的小功能,貌似只需要和华为服务器通信&…

Java-寻找二叉树两结点最近公共祖先

目录 题目描述: 注意事项: 示例: 示例 1: 示例 2: 示例 3: 解题思路: 解题代码: 题目描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科…

刷题日志——模拟专题(python实现)

模拟往往不需要设计太多的算法,而是要按照题目的要求尽可能用代码表示出题目的旨意。 以下是蓝桥杯官网模拟专题的选题,大多数比较基础,但是十分适合新手入门: 一. 可链接在线OJ题 饮料换购图像模糊螺旋矩阵冰雹数回文日期长草最…

R语言实现神经网络ANN

# 常用激活函数 # 自定义Sigmoid函数 sigmod <- function(x){return(1/(1exp(-x))) } # 绘制Sigmoid曲线 x <- seq(-10,10,length.out 100) plot(x,sigmod(x),type l,col blue,lwd 2,xlab NA,ylab NA,main Sigmoid函数曲线)# 自定义Tanh函数 tanh <- function(…

MYSQL——数据库基础和操作

1.创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 说明&#xff1a; 1.大写的表示关键字 2. []是可选项 3. CHARACT…

读人工智能全传15意向立场

1. 物理立场 1.1. 可以解释一个实体行为 1.2. 在物理立场中&#xff0c;我们使用自然法则(物理、化学等)来预测系统的行为结果 1.3. 虽然物理立场在解释这种行为的时候非常有效&#xff0c;但无法应用于理解或者预测人类行为 1.3.1. …

RocketMQ源码学习笔记:消费者启动流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、前置知识1.1、pull和push型消费者1.2、消息CommitLog到ConsumeQueue1.3、自动创建的重试主题1.4、广播型消费和集群型消费中offset的存储位置 2、消费中的启动流程2.1、Preview2.2、校验&…

主流大数据调度工具DolphinScheduler之数据ETL流程

今天给大家分享主流大数据调度工具DolphinScheduler&#xff0c;以及数据的ETL流程。 一&#xff1a;调度工具DS 主流大数据调度工具DolphinScheduler&#xff0c; 其定位&#xff1a;解决数据处理流程中错综复杂的依赖关系 任务支持类型&#xff1a;支持传统的shell任务&a…

MBR40150FCT-ASEMI无人机专用MBR40150FCT

编辑&#xff1a;ll MBR40150FCT-ASEMI无人机专用MBR40150FCT 型号&#xff1a;MBR40150FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&a…

shell脚本——编程规范与变量

目录 一、shell脚本 1、shell脚本概述 2、shell脚本的应用场景 3、shell脚本的作用——命令解释器 二、Shell 脚本编程规范 1、用户登录Shell 2、shell脚本的构成 3、执行shell脚本 三、重定向与管道操作 1、重定向 1.1、交互式硬件设备 1.2、重定向操作 2、重定向…

php相关

php相关 ​ 借鉴了小迪安全以及各位大佬的博客&#xff0c;如果一切顺利&#xff0c;会不定期更新。 如果感觉不妥&#xff0c;可以私信删除。 默认有php基础。 文章目录 php相关1. php 缺陷函数1. 与2. MD53. intval()4. preg_match() 2. php特性1. php字符串解析特性2. 杂…

数据结构-C语言-排序(3)

代码位置&#xff1a;test-c-2024: 对C语言习题代码的练习 (gitee.com) 一、前言&#xff1a; 1.1-排序定义&#xff1a; 排序就是将一组杂乱无章的数据按照一定的规律&#xff08;升序或降序&#xff09;组织起来。(注&#xff1a;我们这里的排序采用的都为升序) 1.2-排序分…

从汇编层看64位程序运行——栈保护

大纲 栈保护延伸阅读参考资料 在《从汇编层看64位程序运行——ROP攻击以控制程序执行流程》中&#xff0c;我们看到可以通过“微操”栈空间控制程序执行流程。现实中&#xff0c;黑客一般会利用栈溢出改写Next RIP地址&#xff0c;这就会修改连续的栈空间。而编译器针对这种场景…

集合媒体管理、分类、搜索于一体的开源利器:Stash

Stash&#xff1a;强大的媒体管理工具&#xff0c;让您的影音生活井井有条- 精选真开源&#xff0c;释放新价值。 概览 Stash是一个专为个人媒体管理而设计的开源工具&#xff0c;基于 Go 编写&#xff0c;支持自部署。它以用户友好的界面和强大的功能&#xff0c;满足了现代用…

16_网络IPC2-寻址

进程标识 字节序 采用大小模式对数据进行存放的主要区别在于在存放的字节顺序&#xff0c;大端方式将高位存放在低地址&#xff0c;小端方式将高位存放在高地址。 采用大端方式进行数据存放符合人类的正常思维&#xff0c;而采用小端方式进行数据存放利于计算机处理。到目前…

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

系统架构师考点--软件工程(下)

大家好。今天继续总结软件工程的知识点。 一、处理流程设计 业务流程重组BPR BPR是对企业的业务流程进行根本性的再思考和彻底性的再设计&#xff0c;从而获得可以用诸如成本、质量、服务和速度等方面的业绩来衡量的显著性的成就。BPR设计原则、系统规划和步骤如下图所示&am…