面向对象设计的原则210907

软件设计原则-面向对象设计七大原则.zip 软件设计原则-面向对象设计七大原则.zip 面向对象和C语言完全不是一种思考问题的方式,面向对象是种哲学思想,只有明白了其核心思想,才能以不变应万变 只有吃透面向对象的七大设计原则,比如:依赖倒置原则,迪米特法则等,把它们烂熟于心,才能作到看什么书都一样的心境 立即下载

软件设计七宗罪

  • Rigidity(僵化)–make it hard to change
  • Fragility(脆弱)–make it easy to break
  • Immobility(固化)–make it hard to reuse
  • Viscosity(黏滞)–make it hard to do the right thing
  • NeedlessComplexity(非必要复杂性)–over design
  • NeedlessRepetition(非必要重复)–error prone
  • Not doing any design

面向对象设计的原则

  • SRP:Single Responsibility Principle 单一职责原则
  • OCP:Open-Closed Principle 开放-封闭原则
  • LSP:Liskov Substitution Principle 里氏替换原则
  • ISP:Interface Segregation Principle 接口分离原则
  • DIP:Dependence Inversion Principle 依赖倒置原则
  • CRP:Composite/Aggregate Reuse Principle 组合/聚合复用原则
  • PLK:Principleof Least Knowledge 最小知识原则
  • SOLID让软件系统更易懂、灵活、易于维护,也可以形成迅捷软件开发的方法论

SRP:Single Responsibility Principle 单一职责原则

Definition

  • 从软件变化的角度来看,就一个类而言,应该仅有一个让他发生变化的原因(即职责)
  • 简单来说就是一个类只做一件事

Description

  • 满足单一职责可以提高内聚性,降低耦合
  • 若耦合过高:
    • 难以复用
    • 改变其中一个职责可能会影响其他,使其在改变时很脆弱
  • 比如手机,有很多功能,就是一个多职责的系统,我们离了它就不行

Example

  • 以一个modem的接口为例,这是一个多职责系统,有负责连接(拨号、挂断)、负责通信(收发信息)的功能
    -
  • 此时我们可以把两种功能分开在这里插入图片描述

Kernel

  • SRP原则的核心是正确的抽象,从实现方面来说,核心就是把代码(职责)移到另一个类中,通过调用来使用它们
  • 在面向过程编程时,我们也有类似的思想,我们通常不会写一个很长的函数,而是写多个函数,再依次调用它们

OCP:Open-Closed Principle 开放-封闭原则

Definition

  • Open For Extension
  • Closed For Modification
  • 软件实体(类、模块、函数等等)应该是可以扩展的,但是不可修改的

Description

  • 实现OPC原则的优点
    • 可以不修改现存代码以增加代码的方式实现现有需求,软件适应性和灵活性更好
    • 已有的代码通常已经经过了测试,不适合改

Implementation

  • 主要依赖抽象、多态、继承关系、接口来实现
  • 接口与抽象类都是相对固定的,但它们的实现可以有很多种不同行为
  • 接口适宜扩展,因为它可以有多种实现,但是不适合修改,因为修改后会影响到实现

Example

  • 举个例子,我要在图形编辑器类中判断图形的形状来调用不同的绘制方法
  • 如果我要加一个图形,就要修改GraphicEditor类在这里插入图片描述
  • 我们可以通过多态对其进行修改,对一个抽象方法有多种实现在这里插入图片描述

Kernel

  • OCP原则很难完全被满足,设计者需要预判软件系统可能的变化,将其实现到一个较为合适的程度即可
  • OCP是面向对象设计的核心,抽象是OCP原则的核心
  • 设计方式
    • 传统方式是不要给系统添加新的需求,OCP的方式是在不重新设计的前提下系统支持什么样的变化
  • 不必过度考虑,也不可能完全满足

LSP:Liskov Substitution Principle 里氏替换原则

Definition

  • 任何基类可以出现的地方,子类一定可以出现
  • 当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有is-A关系
  • 也就是说,只有子类的实例替换任何其他父类的实例时,程序运行结果没有改变,才说它们是is-A的关系

Example

在这里插入图片描述
在这里插入图片描述

  • 这里如果说正方形是长方形,那么计算面积时就有冲突了,就不合理了
  • 可以让正方形和长方形都实现一个四边形的接口在这里插入图片描述

Solution

  • 由以上内容我们知道了子类重写父类的方法其实违背了LSP原则
  • 一种方式是把A、B代码的公共部分放进一个抽象类C,把它们要实现的方法放进一个接口IC,然后让C实现IC在这里插入图片描述
  • 另一种方法是不用继承而是聚合,即人要像车一样跑得快,不需要继承车变成汽车人,只需要拥有一辆车在这里插入图片描述

Conclusion

  • 在设计继承关系时我们一定要仔细考虑LSP原则
  • 只有在有充足的理由时才可以打破这个规则,具体如何以后会说

ISP:Interface Sepregation Principle 接口分离原则

Definition

  • 两个类之间的依赖程度取决于最小的接口
  • 接口要内聚,尽量只把相关程度高的方法放进一个接口,而不是把所有放进一个接口
  • 节省接口数量不能减少代码量,而是会污染接口
  • 有时候接口里没有方法也是有其合理性的
    • 用作指示,Cloneable,Serializable,Remote

Example

在这里插入图片描述

  • 应该改成在这里插入图片描述

Kernel

  • ISP是SRP的接口版本

DIP:Dependence Inversion Principle 依赖倒置原则

  • 也叫Hollywood Principle在这里插入图片描述

Definition

  • A类的某个方法中,使用了B类,那么就说A类依赖于B类
  • 高层模块不应该依赖于低层模决,二者都应该依赖于抽象。进一步的,抽象不应该依赖于细节,细节应该依赖于抽象
  • 如果B类出现漏洞,A也会受到影响

Description

  • 增加灵活性,减少耦合

Implementation

  • 高层模块依赖于接口,底层模块实现接口
  • 人拥有一辆奔驰,如果奔驰出问题了,人就跑不快了,不如直接给人一辆车,具体是什么车人不必知道,如果奔驰坏了,可以换别的车在这里插入图片描述

Example

  • 实例一,一个模块的实现
    在这里插入图片描述
    在这里插入图片描述
  • 实例二,开关与灯
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Rules

  • 任何变量存储的引用都不能指向实体类,只能指向接口或抽象类
  • 任何类都不能从实体类继承
  • 任何方法都不能重写其基类实现的方法
  • DIP的规则有点过度严格了

Kernel

  • DIP可以解耦,从而为实现OCP提供基础
  • DIP总是针对接口编程,不针对实现编程
  • 当类经常有可能变化时使用DIP,除非是一些工具类和静态类
  • 共同的代码应该放在抽象层,私有的数据之类的要放在实现在这里插入图片描述

关于耦合

  • 三种耦合
    • NilCoupling(零耦合:两个类丝毫不依赖于对方。但只使用零耦合却无法创建出一个有意义的OO系统,因为所有的类都是独立、不相关的,相互之间没有消息的传递,这样最多只能创建出一个类库。)
    • Concrete Coupling
    • Abstract Coupling
  • Abstract Coupling更灵活,也更复杂
  • 当类比较稳定时(即不怎么变化)Concrete Coupling更合适

Conclusion

  • 接口不是万能的,不是银子弹,不稳定的接口可能打破抽象与实现间的隔离
  • 接口应该由使用者的需求定义
  • DIP是面向对象设计的基础与关键

CRP:Composite/Aggregate Reuse Principle 组合/聚合复用原则

Definition

  • 多用组合,少用继承。
  • 组合/聚合复用原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。

Description

  • 聚合与组合
    • 聚合是HAS-A的关系
    • 组合是整体与部分的关系
  • 面向对象初学者会过度使用继承,最后会产生巨大的僵化的继承关系,CRP原则是为了提醒我们,可以通过更灵活的聚合和组合来实现复用的目的

Example

  • JDK容器类,栈没继承Vector,而是有一个Vector在这里插入图片描述
  • 老古董例子,如果Worker要升值,可能比较困难,需要先移植记忆到新的Manager躯体再人道处理(销毁)
    在这里插入图片描述
  • 这样就方便了,至少我还是我在这里插入图片描述

Kernel

  • 组合/聚合比继承要好
  • 从复用来说
    • 组合/聚合是黑盒复用
    • 继承是白盒复用
  • 从多态来说
    • 组合/聚合是更灵活的多态
    • 继承比较固定
  • 组合/聚合在运行时可修改,继承不能修改

PLK:Principle of Least Knowledge(Law of Demeter) 最小知识原则

  • 因为美国东北大学的德米特里项目出名的

Definition

  • 每个模块只知道自己最近的模块的知识
  • 就是不和陌生人说话

Description

  • 不要让太多类耦合在一起,否则会脆弱且难懂

Advantages

  • 易维护,适应性好

Disadvantage

  • 需要增加许多包装类
  • 某些情况下,会增加时间和空间开销
YOLO26算法保龄球馆保龄球目标检测+训练好的模型+743张数据集+pyqt可视化界面.zip 数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ... 立即下载

相关推荐

goose 是一款在您的设备上运行的通用型 AI 代理

一款开源、可扩展的AI代理,功能远超代码建议——支持安装、执行、编辑以及与任何大型语言模型(LLM)进行测试。

面向对象程序设计核心思想-面向对象的六大原则剖析

1.优化代码的第一步---------单一职责原则(Single Responsibility Principle - SRP) 就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。单一职责的划分界限并不是总那么清晰,很多时...

chenheli1872的博客 673

MATLAB中天线阵列的自适应波束形成仿真,包括干扰抑制和时变信号跟踪.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计

面向对象设计原则和思想

一 单一职责原则 1.1 单一职责原则概念 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。这个原则的英文描述是这样的:A class or module should have a single responsibility。如果我们把它翻译成中文,那就是:一个类或者模块只负责完成一个职责(或者功能)。 一个类只负责完成一个职责或者功能。也就是说,不要设计大而全的类,要设计粒度小、功能单一的类。换个角度来讲就是,一个类...

javaTalk 1452

面向对象设计原则

在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我们将在下面依次来介绍这 7 条原则。 一、单一职责原则 1、单一职责原则的定义 单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一

qq_35784669的博客 382

面向对象设计模式的几个基本原则及其核心思想简介

<br />面向对象设计模式的几个基本原则及其核心思想简介<br />              Author: Macower<br />在讲述设计模式的原则之前,我们必须要了解面向对象的几个基本目标。<br />面向对象,将世界归纳为一句话:万事万物皆对象。<br />在没有面向对象之前,软件的可维护性是相当的烂,主要原因有四个:<br />l       过于僵硬<br />l       过于脆弱<br />l       复用率低<br />l       黏度过高<br />在软件设计过程当中无

macower 技术专栏 5343

PaddleOCRApi面向 Windows 与 Linux 的轻量级 OCR 与YOLO目标检测 HTTP 服务

PaddleOCR 与YOLO目标检测 HTTP 服务。 项目通过 PaddleOCROnnx 原生库集成 OnnxRuntime加速能力,围绕 ONNX 模型部署, 以统一接口提供图像文字识别、YOLO 目标检测和 Tensor 数据输出。 功能概览 文字识别:支持图片 Base64、multipart/form-data 上传,以及文本和 JSON 结果。 目标检测:支持 YOLO 图片检测,返回检测框 JSON 或原始 Tensor。 浏览器演示:访问服务根地址,上传图片并切换 OCR、YOLO 模式。 健康检查:通过 /health 查看服务及 OCR、YOLO 引擎初始化状态。 并发处理:通过 OCR 引擎实例池处理并发请求,可调整实例数量。 体验与调用 启动后访问: 入口 地址 浏览器演示 http://localhost:5000/ 健康检查 http://localhost:5000/health 原生依赖 Windows:优先从 runtimes/win-x64/native/ 加载原生 DLL;该目录没有 PaddleOCROnnx.dll 时,尝试从可执行文件所在目录加载。主 DLL 与对应后端依赖应放在同一原生目录中,不要将同一组依赖分散到多个目录。 Linux:原生运行时位于 runtimes/linux-x64/native/,程序使用相对于可执行文件的运行时搜索路径查找随包部署的依赖。 后端选择:CoreOCROnnx 支持 ONNX Runtime、OpenVINO、TensorRT 后端。请使用与平台、进程架构、硬件和后端匹配的一整套运行时,不要混用不同后端或版本的依赖。

丧尸枪战_1.0

丧尸枪战1.0这是一款我自己做的游戏2d版本的这个游戏我以后会更新

【风场景生成与削减】【m-ISODATA、kmean、HAC】无监督聚类算法,用于捕获电力系统中风场景生成与削减研究(Matlab代码实现)

内容概要:本文聚焦于电力系统中风场景的生成与削减问题,系统性地应用m-ISODATA、k-means和HAC三种无监督聚类算法对大规模风力发电数据进行处理,旨在降低风电不确定性带来的计算负担并保留关键时序特征。研究基于Matlab平台实现了完整的数据预处理、聚类建模与结果可视化流程,深入探讨了各算法在确定聚类簇数、划分数据结构及构建层次关系方面的机理差异,并通过实验对比验证了其在场景削减效果、计算效率与鲁棒性方面的性能表现。该方法为含高比例风电的电力系统提供了高效、可靠的典型场景集构建手段,支撑后续的随机优化、风险评估与调度决策。; 适合人群:具备电力系统分析基础、熟悉Matlab编程的研究生、科研人员以及从事新能源并网、电力系统规划与运行优化的工程技术人员。; 使用场景及目标:①应对风电出力强随机性与波动性,为随机规划、鲁棒优化等高级应用提供精简且具代表性的输入场景;②深入比较m-ISODATA(自适应确定簇数)、k-means(高效快速划分)与HAC(构建层次化场景结构)三类算法的技术特点与适用边界,指导实际项目中算法选型;③通过代码实践掌握从原始风速/功率数据清洗、特征提取、距离度量选择、聚类有效性评估到最终场景概率赋值的全流程技术栈。; 阅读建议:学习者应结合提供的Matlab代码进行动手实践,重点理解数据标准化、欧式距离与动态时间规整(DTW)等相似性度量的选择依据、聚类数目评估指标(如肘部法则、轮廓系数)的应用,以及如何通过削减前后场景的概率分布和典型性来检验结果质量,并可进一步将此方法迁移至光伏发电、负荷等其他不确定性场景的建模与简化研究中。

优胜大厅无线排队叫号系统方案Word(25页).doc

智慧方案依托物联网、大数据、人工智能等新一代信息技术,面向智慧城市、智慧园区、智能制造、智慧教育、智慧工程等多个垂直领域,从业务痛点出发搭建全链路数据驱动的智能管理体系,打破传统模式下信息孤岛、资源浪费、决策滞后等核心问题,覆盖需求调研、方案设计、落地实施、运维优化全流程,既能为IT从业者提供标书撰写、项目申报的专业参考框架,也能帮助政企单位快速理清数字化转型的实施路径,大幅降低方案的试错成本与沟通成本,是技术人员排查问题、业务人员梳理逻辑、管理人员评估项目的实用工具,如果你需要海量细分赛道的成熟参考案例,欢迎进入找方案知识星球,获取覆盖数十个行业的专属智慧方案库,快速提升方案产出效率与专业度。

flink(Java)

「flink(Java)」是开源项目(Java)。项目简介:Apache Flink源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。

Retro-Telemetry-Dashboard-Acceptance-Scorecard-v1.0-原创源码与文档.zip

原创 JavaScript 离线工具,包含完整源码、README、MIT LICENSE、原创与授权声明、自动化测试、示例数据、真实运行截图及离线报告。解压后运行 npm test 验证,再用 node src/cli.js examples/sample.json 生成报告;不依赖外部服务。

2026 年高教社杯全国大学生数学建模竞赛A题–药材的烘干问题(数学建模,代码,论文免费分享)

内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛A题“药材的烘干问题”,提供了一套完整的数学建模解决方案,涵盖问题分析、模型构建、算法求解与结果验证全过程。文中详细探讨了药材烘干过程中温度、湿度、风速等关键参数对干燥效率与品质的影响,建立了基于传热传质理论的动态数学模型,并结合实际约束条件,采用优化算法对烘干工艺进行参数调优。此外,资源包内还包含配套的MATLAB代码与论文撰写模板,实现了从理论建模到编程实现再到成果输出的一体化支持,具有较强的实践指导意义。; 适合人群:全国大学生数学建模竞赛参赛学生,尤其是具备一定数学建模基础、编程能力(如MATLAB)和优化理论知识的本科高年级学生或研究生;也可供从事农业工程、中药加工、干燥技术等领域研究的技术人员参考。; 使用场景及目标:①应用于数学建模竞赛中对实际工程问题的建模与求解训练;②掌握传热传质模型在农产品干燥中的应用方法;③学习如何将物理过程转化为数学模型并利用优化算法求解;④获取可复用的代码框架与论文写作范式,提升竞赛备赛效率。; 阅读建议:建议读者结合所提供的代码与数据同步运行、调试模型,深入理解各模块的设计逻辑;在学习过程中重点关注模型假设的合理性、参数敏感性分析及结果可视化表达技巧,以全面提升建模综合能力。

华为路由器交换机仿真软件HW-RouteSim3.0(含实验)

源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 华为模拟器_Route sim3.0 RouteSim是在借鉴国外同类软件研究成果后研发的中文路由模拟软件,其显著特征在于界面设计清晰、操作流程简便、辅助说明完备且易于掌握。该软件特别适用于初学者以及在校大学生在进行网络互联课程实验教学的实践环节。可以预见,对于备考网络工程师认证的朋友以及准备CCNP、CCNA认证的朋友们来说,这款软件应当不会感到陌生。

2026年最新合肥市公交、地铁线路及站点矢量数据.zip

数据格式:shp 数据坐标:GCJ02 数据更新时间:2026年9月 公交线路来源:8684网站 https://8684.com.cn/ 站点数据来源:高德API接口 数据打开方式:QGIS或Arcgis 站点数据字段:名称、序号、对应线路、几何信息 线路数据字段:名称、类型、起点、终点、开始时间、结束时间、起步价、全价、长度、公司、几何信息

2026 年高教社杯全国大学生数学建模竞赛C 题 微网与外部电网电力调控策略(数学建模,代码,论文免费分享)

内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛C题“微网与外部电网电力调控策略”展开,系统研究了微电网内部源-荷-储的协同优化调度及其与主电网的能量交互机制。内容涵盖电力系统建模、不确定性因素(如风光出力波动、负荷变化)的处理方法,重点引入鲁棒优化、两阶段优化等先进建模技术以提升策略的稳定性与实用性。研究不仅构建了完整的数学模型,还配套提供了Matlab代码实现、仿真结果分析及论文撰写框架,帮助使用者从理论到实践全面掌握问题求解路径。此外,资源包中包含了详细的运行结果展示、参考文献支持以及可复现的完整资料下载链接,极大提升了学习与参赛效率。; 适合人群:全国大学生数学建模竞赛参赛学生,尤其是具备一定数学建模基础、Matlab编程能力及电力系统相关知识的本科生与研究生;同时也适用于从事微电网优化、能源调度、智能电网等领域研究的科研人员和技术开发者。; 使用场景及目标:①用于备赛训练,快速掌握C题核心建模思路与求解流程,提升竞赛实战能力;②学习微电网在不确定性环境下的优化调度方法,深入理解鲁棒优化、场景削减、多目标协调等关键技术在能源系统中的实际应用;③通过提供的代码与论文模板进行修改与拓展,完成高质量的建模作品或科研原型。; 其他说明:该资源为免费分享内容,包含题目解析、完整代码、仿真结果与论文框架,可通过指定公众号“荔枝科研社”或百度网盘链接获取全套资料。建议使用者结合实际数据进行模型调参与结果验证,以增强模型的适应性与创新性,同时鼓励在原有基础上开展延伸研究,提升学术与应用价值。

2026网信玄盾珠峰网络安全技能大赛决赛竞赛手册.docx

2026网信玄盾珠峰网络安全技能大赛决赛竞赛手册.docx

上一篇: 用例图、类图与时序图的皮毛210907
下一篇: 王爽《汇编语言》第二章 寄存器(CPU工作原理)210908
炸酱面泡汤
博客等级 码龄8年 7粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值