面向对象设计的SOLID原则(哈工大软件构造)

哈工大软件构造复习一 软件构造的多维度视图和质量目标软件的多维度视图编译时视图编译时-时刻-代码级编译时-时间段-代码级编译时-时刻-组件级编译时-时间段-组件级运行时视图运行时-时刻-代码级运行时-时间段-代码级运行时-时刻-组件级运行时-时间段-组件级课程重点视图的转化软件构造质量目标软件构造的五个关键质量目标外部质量因素内部质量因素 软件的多维度视图 按阶段划分:构造时/运行时视图 按动态性划分:时刻/阶段视图 按构造对象的层次划分:代码/构件视图 编译时视图 代码的逻辑组织 代码的物理组织 特定时刻的软件形态 软 阅读详情

  为了使软件有着较高的可维护性以及其他各方面的优质性能,在面向对象的编程过程中,我们需要有着良好的设计方案,在一些基本的编程原则下设计代码。在第五章的学习中,讲到了面向对象编程过程中的五大原则,简称为 SOLID 下面我们依次介绍。

单一责任原则(Single Responsibility Principle, SRP)

  SRP指明了,每一个类的职责要单一,即不能存在多个原因引起这个类的变化。通过职责与类的分离,降低系统的耦合度,提升系统内聚度,在维护过程中,尽可能小范围的修改代码。SRP的设计体现如下,我们将数据传输的功能和连接的功能分离为两个接口,在需要的设计中实现对于的接口即可,如下,我们不能将所有的学生工作委托给一个老师,最好将功能分派给对应的老师,高效处理工作:
SIP的设计体现
  需要注意的是,在面向对象设计的过程中,不需要过于刻意地使用利用单一责任原则,否则会导致类的数量急剧增加,反而难以维护。我们需要权衡利弊,在必要时使用SRP。

开闭原则(Open/Closed Principle, OCP)

  在维护软件的过程中,我们可能会因为扩展新的功能反复修改代码,最终导致的结果就是代码与最初的设计思路背道而驰。因为我们当初的设计是基于当时的需求产生的,面对更多的扩展而反复修改代码,会导致代码的复杂度提高,难以维护。OCP要求我们设计的代码对于扩展开放,对于修改封闭,即面对新的变化时,可以不去修改原有的代码,只需要添加新的代码扩展功能即可。
  实现OCP关键的解决方案在于抽象,即对创建的ADT进行抽象,通过继承和委托,使其面向扩展开放。OCP的设计体现如下,我们通过抽象以及继承的方式设计ADT,利用多态性实现某些方法,以参数多态代替了繁琐的if-else语句:
OCP的设计体现

里氏替换原则(Liskov Substitution Principle, LSP)

  LSP原则在之前的博客中有了详细的介绍,其内容是指,在所有使用父类型的地方都可以透明的使用其子类型,即子类型能够代替父类型的使用。LSP原则是继承复用的基石,也是提高可维护性时需要注意的一点,一般为了做到LSP原则,需要在设计代码时完成以下几点内容:

1. 子类型必须实现父类型中的抽象方法。
2. 子类型可以添加新的方法,但不可以删除父类型中的方法。
3. 子类型中重写父类型的方法时,需要有着更加宽松的前置条件,更加严格的后置条件,并且抛出更少类型的异常。

接口隔离原则(Interface Segregation Principle, ISP)

  ISP要求我们只为客户端提供必要的接口,而不需要使用无用的接口,通过将臃肿的“胖接口”依照其抽象结果分解为多个小颗粒的接口,预防外来变更的扩散,提高系统的灵活性和可维护性,达到高内聚、低耦合的设计目标。也可以防止实现过大接口时需要被迫实现其中的无用方法。
  我们可以感受到,接口隔离原则和单一责任原则有着很大的相似之处,两者能提高类的内聚度,降低耦合度,体现封装的思想,但两者之间也有一定的区别:

1. 单一职责原则注重的是职责,而接口隔离原则注重的是对接口依赖的隔离。
2. 单一职责原则主要是约束类,它针对的是程序中的实现和细节;接口隔离原则主要约束接口,主要针对抽象和程序整体框架的构建。

  下面这个例子就体现了ISP原则,将Worker类中的两个方法封装在两个接口中,实现了接口隔离的目标:
ISP的设计体现

依赖转置原则(Dependency Inversion Principle, DIP)

  即通过面向接口的编程降低类之间的耦合度。我们想象这样一个场景:在很多人共同完成一个大型项目时,复杂底层的同学完成一些方法后,将其提交给负责高层的同学,这样的行为就违反了DIP原则,因为此时在高、底层的关系中,底层设计起了主导作用,两者之间缺少了一定的抽象。DIP原则要求:高层模块不应该依赖于底层模块,两者都应该依赖于抽象,也可以说,抽象不应该依赖于具体,具体应该依赖于抽象。转置在此的含义,即是高、底层之间的转置关系,需要高层提出(抽象出)需求(接口),底层满足(实现)需求。
  下图就体现出了DIP原则,高、底层之间通过抽象接口实现依赖关系,降低了系统的耦合度:
DIP的设计体现

参考博客: 软件设计模式概述
simulink中MIL测试简单理解 输入信号设置如下:选中New Test Case1 ---INPUT。5、新建(选择New,Test from Spreadsheet)6、可以新建也可以导入(Use existing test)Source:Output为自己预测结果。3、右键子系统(Create)打开生成表格,可以自己调试。4、创建测试用例表格。保存路径为模型路径。保存路径在模型路径。8、运行测试设h置。 阅读详情

相关推荐

揭秘cocos-mcp:如何用AI助手提升CocosCreator游戏开发效率

本文深入介绍了cocos-mcp工具,它作为连接AI助手与CocosCreator编辑器的桥梁,遵循MCP协议,能显著提升游戏开发效率。通过自然语言指令,开发者可让AI直接查询场景结构、批量修改属性或生成上下文代码,将重复操作变为智能调度,实现从“手动操作者”到“指令指挥官”的工作流变革。

weixin_29001683的博客 1051

哈工大软件构造-课程知识总结3-软件构造过程与配置管理

软件构造的过程可以分为:代码编程-静态代码分析-动态代码分析-调试与测试-重构 这几个方面。和配置管理作为研发项目中的一项支持类活动,只要目的是通过管理相关活动来建立并维护研发项目中的工作产品的完整信息。软件构造过程与配置管理在软件开发过程中都十分重要,合理的安排自己的构造过程,恰当充分的使用相关的工具,可以大大提高开发速度和质量。

qq_37005405的博客 317

深入解析set_clock_groups:异步时钟约束的最佳实践与陷阱规避

本文深入解析了FPGA/芯片设计中set_clock_groups命令在异步时钟约束中的核心作用与最佳实践。文章对比了同步时钟、异步时钟与不重叠时钟的区别,强调了正确使用set_clock_groups避免时序分析陷阱的重要性,并提供了与set_false_path的优先级差异分析及实战规避方法,帮助设计者确保时序收敛与电路可靠性。

weixin_29232121的博客 376

哈工大软件构造知识点总结(1)

本文根据课程ppt整理而成,仅供参考。

m0_72578076的博客 227

双模音频解码器设计:USB+蓝牙LDAC平衡输出方案

音频解码器是数字音频系统中实现数模转换的核心组件,其性能直接决定音质保真度与系统延迟。基于高集成SoC的解码方案通过统一时钟域与片内DSP处理,有效抑制Jitter并简化硬件拓扑;结合全平衡模拟输出架构,可显著提升共模抑制比(CMRR)与信噪比(SNR)。该技术路径广泛应用于便携式Hi-Res音频设备、USB-C小尾巴DAC及蓝牙高解析耳机放大器等场景。本文围绕ES9038Q2M双模SoC展开,详解其在LDAC协议支持、UAC2.0兼容性及平衡电流型DAC输出方面的工程实现,为高性能、可量产音频硬件开发提供

weixin_42613018的博客 390

Modem2G/3G/4G/5G:RFFE Driver(射频前端驱动):高通平台GRFC配置方法

文 | GentlemanTsao 文章目录前言1.什么是GRFC2.GRFC的配置流程概览3.msm_sig_info的配置与分析msm_sig_info Table位置:msm_sig_info Table示例:Table元素解读:rfc_msm_sig_info_type结构体signal typemsm_gpio |grfc_num:GPIO到GRFC的映射output_typefunction_select4._sig_cfg的配置与分析_sig_cfg table位置:_sig_cfg tabl

GentelmanTsao的博客 7315

2022哈工大软件构造课程总结与经验分享(复习指导)

2022哈工大软件构造课程总结与复习指导,学习笔记与经验分享

weixin_51322795的博客 1024

CMU动作捕捉数据集实战:从AMC文件到Python可视化的完整流程

本文提供了CMU动作捕捉数据集的完整实战指南,详细解析了AMC文件格式,并对比了MATLAB转换、Python原生解析及转换为BVH格式三种数据解析策略。重点介绍了如何构建Python数据处理与可视化管道,包括将数据转换为Pandas DataFrame、绘制时间序列与相关性热力图,以及实现3D骨架动画,帮助开发者高效利用这一经典动作捕获数据集进行运动分析与模型训练。

android的专栏 716

哈尔滨工业大学软件构造心得(五)

本人在学习软件构造这门课程中遇到了一些困难,查阅资料在这里总结了课程中面向复用的软件构造技术和面向可维护性的软件构造技术。

m0_58646407的博客 315

挣脱枷锁:网页禁止复制/F12失效/右键失灵时的破局之道

大家在网上冲浪的否遇到过这种情况?急需网页上的一段关键信息、一段优美的文字、一个重要的代码片段,或者只是想收藏某篇文章,却发现:文本选择被阻止,右键菜单被禁用,开发者工具(F12)被屏蔽,查看源代码(Ctrl+U)失效?本文会有力解决这些封锁。

安德洛夫 2113

Power domain 划分该如何下手

假如PD1比PD3更always on的话,我们只需要插入普通buffer即可,因为PD3 on,PD1也肯定是ON,PD1 off,PD3肯定时off,PD1能cover PD3的电源情况,因此使用普通buffer也可,但是处于省电角度,我们还是使用AO buffer;在我们做多power domain时,在切分power domain时,需要谨慎,稍有不慎,就会出现congestion以及timing问题,那问题来了,我们在切分power domain时有什么考究么,今天小编就和大家一起讨论讨论。

芯冰乐 207

[HITSC]哈工大2020春软件构造复习笔记 (5)

Chapter 5: Maintainability-Oriented Software Construction Approaches5.1 Metrics and Construction Principles for Maintainability1. 可维护性的指标2. 模块化设计原则3. SOLID设计原则单一责任原则(SRP)开放-封闭原则(OCP)替换原则(LSP)依赖转置原则(DIP)接口隔离原则(ISP)5.2 Design Patterns for Maintainability1. F

北言栾生的博客 1574

YOLOv12改进策略【Neck】| 使用CARAFE轻量级通用上采样算子

CARAFE内容感知的特征重新组合。

Limiiiing的博客 664

哈工大软件构造课程知识点总结(五)

#哈工大软件构造课程#哈工大软件构造课程知识点总结(五)

RunTimeException的博客 445

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

哈工大-软件构造-复习

作为软件工程专业的核心课程之一软件构造结束了,不为博客分数,只为能留下点什么,就来复习复习吧。 PS:下面大多都是我个人的理解,用词上可能不太严谨。 1.多维视图 讲述了一个完整的程序的解剖图,不难看出,Code-level是代码逻辑层面,Component-level是代码的物理层面代码本身的文件等等,Moment代表程序在某一时刻的情况,而Period代表程序在生产周期里面相关的事项。Bu...

小明难亡 723

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

哈工大软件构造第10章总结

哈工大软件构造第10章总结

weixin_51365466的博客 420

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

哈工大软件构造课程博客(四)——软件设计原则及设计模式

软件构造式设计原则及设计模式

qq_39470384的博客 221

哈工大软件构造2022期末考点复习笔记

Build-time, moment, code-level 代码如何在逻辑上被组织为基本的程序块,例如函数、类、方法、接口等,以及其之间的依赖关系。Build-time, period, code-level 代码在时间尺度上的变化,例如代码行的增删改。Build-time, moment, component-level 源代码被组织为文件,文件被组织进目录;文件被包含在包中,在逻辑上也被包含在容器和子系统中;可复用的模块被组织为库。Build-time, period, component-level

zyhzmy的博客 625

软件构造课程知识整理汇总

哈工大2022年春季学期软件构造课程总结:期末复习版本

z2984348的博客 2257

哈工大软件构造课程笔记

哈工大软件构造课程笔记 转自学长 文章目录 软件构造总结笔记2020考试题型考试大纲:一、软件构造基础1.1 软件构造的多维度视图1.2 软件构造的阶段划分、各阶段的构造活动构造阶段 Build-...

何以牵尘的博客 557

哈工大软件构造学习心得4

文章目录1 单一责任原则2 开放/封闭原则3 Liskov替换原则4 接口隔离原则5 依赖转置原则6 联系 本文主要讲述OO设计原则:SOLID。    1 单一责任原则   通俗的来说,单一责任原则,就是一个类实现的功能应该尽可能少。   如果一个类承担的职责越多,,会引入额外的包,占据过多的资源,也会导致频繁的重新配置和部署,被复用的可能性也就越少。而且类中的职责相互耦合,当其中一个职责变化时,可能影响到其他职责的运作。 优点:   每个类复杂性降低,实现简单;   可复用性强,每个类实现的功能单一,可

Noctis_tel的博客 209

哈工大 软件构造 学习心得4

一、 可复用性两类软件复用:1. 面向复用编程:开发出可复用的软件;2. 基于复用编程:利用已有的可复用软件搭建应用系统。两类源码级别的复用:1. 白盒复用:源代码可见,可修改和扩展。2. 黑盒复用:源代码不可见,不能修改;只能通过API接口来使用。Liskov替换原则(LSP):更强的不变量、更弱的前置条件、更强的后置条件。协变:父类到子类越来越具体;返回值类型不变或更具体;异常的类型不变或更具体。逆变:父类到子类越来越具体;参数类型不变或越来越抽象。Java不支持逆变;去掉@Override将视为重载。

YuzuComz的博客 343

哈工大软件构造-课程知识总结6-面向可维护性的构造技术

维护是软件开发中最困难的工作之一,它包括处理来自用户报告的故障或问题、满足新增的软件需求等。软件工程的主要目的就是提高软件的可维护性、减少软件维护所需要的工作量、降低软件系统的总成本。本文将介绍一些关于面向可维护性软件构造的准则和方法。

qq_37005405的博客 170

哈工大软件构造u6

Chapter 6: Maintainability-Oriented Software Construction Approaches 面向可维护性的软件构造方法 本章面向另一个质量指标:可维护性——软件发生变化时,是否可以以很小的代价适应变化? 本节是宏观介绍: (1)什么是软件维护; (2)可维护性如何度量; (3)实现高可维护性的设计原则 后面两节介绍具体的面向可维护性的构造技术 6.1 ...

天才_hhh的博客 268

哈工大软件构造第十章总结

本章讲解面向可维护性的编程概念,通过合理的设计来让软件能够以较小的代价完成更新来适应新的需求。

qq_52507260的博客 206

软件构造小记(2)哈工大软件构造2021年期末考试重点概要

1. 考核重点概要 2. 第一,三讲 2.1软件构造的多维度视图 按阶段划分:构造时/运行时视图 按动态性划分:时刻/阶段视图 按构造对象划分:代码/组件视图 2.2软件构造的阶段划分、各阶段的构造活动 2.2.1 Build - time views Code-level view:代码的逻辑组织(functions,classes,methods,interface)考虑类似多少个类,类中有什么结构等问题 Component-level view:代码的物理组织(

weixin_50150363的博客 653
上一篇: 面向可维护性的设计模式(哈工大软件构造)
下一篇: 抽象数据类型及其表示不变量RI、抽象函数AF简介(哈工大软件构造)
Hey_BlingBling
博客等级 码龄7年 5粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值