深度总结:软件设计七大原则

软件设计七大原则

软件设计原则是设计模式的基石。目的只有一个,降低对象之间的耦合,增加程序的可复用性、可扩展性、可维护性。

开闭原则 OCP

定义:软件实体对扩展开放,对修改关闭。

  • 对扩展开发,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

  • 对修改关闭,意味着类一旦设计完成,就可以独立的工作,而不要对其进行任何的修改。

在面向对象设计中,我们通常通过继承和多态来实现OCP,即封装不变部分。

比如需求要实现2种状态的业务。

  • 如果用if else来判断,那么后面加第三种状态,就还需要在此接口上增加else逻辑,不符合开闭原则。

  • 用策略类实现,则定义策略接口,策略A和策略B为具体实现类,分别对应两种状态。假如下一次需求要实现第三种状态,那么直接定义一个StrategyC实现类就可满足。原有代码不变,符合开闭原则。

详情可点击:策略模式文章

里氏替换原则 LSP

定义:程序中的父类型都可以正确的被子类型替换。

程序中的对象可以在不改变程序正确性的前提下被它的子类所替换,即子类可以替换任何基类能够出现的地方,并且经过替换后,代码还能正确工作。

根据LSP的定义,如果在程序中出现使用instanceof、强制类型转换或者函数覆盖,很可能意味着是对LSP的破坏。

假设定义一个抽象禽类,有一个飞翔方法fly(), 我们就可以自由的继承禽类衍生出各种鸟儿,并调用其飞翔方法。如果鸵鸟加入禽类行列,继承禽类,但不会飞,那么飞翔方法fly()就显得多余。而且在所有禽类出现的地方,无法用鸵鸟替换(此时不满足正确业务逻辑)。违反了里氏替换原则。

经过反思,是设计问题,禽类和飞翔无必然联系,所以禽类不应该定义飞翔方法fly(),把禽类飞翔方法fly()抽离出去单独定义飞翔接口Flyable。

对于有飞翔能力的鸟儿继承禽类并实现飞翔接口。鸵鸟继承禽类,但不实现飞翔接口,是否是鸟儿取决于是否继承自禽类,能不能飞取决于是否实现飞翔接口。所有禽类出现的地方都可以用子类进行替换,所有飞翔接口出现的地方都可以被其替换为实现。

依赖倒置原则 DIP

定义:模块之间交互应该依赖抽象,而非实现。

DIP要求高层模块不应该依赖于底层模块,二者都应该依赖于抽象。抽象不应该依赖细节,细节应该依赖抽象。

比如某个人喂养小动物,如果依赖了具体的实现,则每新增一个动物,需要在Person内加一个对应的方法。违背了开闭原则,也不符合依赖倒置原则。

重新修改后,如下。新增一个Birds抽象类,具体的动物继承自父类Birds,Person中的方法参数依赖于抽象,而不是具体的实现。符合依赖倒置原则。

单一职责原则 SRP

定义:对任何类的修改只能有一个原因。换句话说,一个类只应该负责一项职责。

SRP要求每个软件模块职责要单一,衡量标准是模块是否只有一个被修改的原因。职责越单一,被修改的原因就越少,模块的内聚性就越高,被复用的可能性就越大,也更容易被理解。

举例员工类 Employee,开发工作变了,需要修改Employee类,测试工作变了需要修改Employee类,不符合单一职责原则,类的复杂性也高。

  • 职责多,引起此类变化的原因也多。后续变更的风险就大。

  • 后续需求变更,会造成职责的混乱,类结构的不稳定。

改造后,类的职责单一。开发者的职责就是“写代码”,那么对其进行的修改只有与“写代码”相关的一个原因(画类图也是为了指导代码落地),这样才能确保类职责的单一性原则。

同时,类与类之间虽有着明确的职责划分,但又一起合作完成任务,它们保持着一种“对立且统一”的辩证关系。

  • 以责任链模式为例,每个处理者类职责清晰,只处理与自己职责相关的业务。

  • 以员工类为例,拆分后,各个员工完成相应的职责,共同保障项目上线。

这种清晰的职责范围划分就是单一职责原则的最佳实践。符合单一职责原则的设计能使类具备高内聚性,让单个模块变得简单易懂,如此才能增强代码的可读性和可复用性。并提高系统的易维护性和易测试性。

上面的例子是类职责单一,那么微服务划分也同理,采用单一职责原则,每个服务负责一块业务。同一类业务的变更落在单个服务内变更

接口隔离原则 ISP

定义:客户端对类的依赖基于最小接口,而不依赖不需要的接口。

接口隔离原则认为不能强迫用户去依赖那些他们不使用的接口。换句话说,使用多个专门的接口比使用单一的总接口要好。做接口拆分时,也要尽量满足单一职责原则。将外部依赖减到最少,降低模块间的耦合。

比如类A只需要使用方法1、方法3,类B只需要使用方法2、方法4,但在源代码层次上与所有方法形成依赖关系。这种依赖意味着我们对接口I的方法2修改,即使不会影响A所依赖的方法1、方法3的功能,也会导致它需要重新部署和编译。

改造后,类A不需要用到方法2、方法4,就可以选择不依赖它们。代码更加清晰,接口职责更加明确。

迪米特法则 LOD

定义:一个类对于其它类知道的越少越好。

迪米特法则也被称为最少知识原则,它提出一个模块对其他模块应该知之甚少,或者说模块之间应该彼此保持陌生,甚至意识不到对方的存在,以此最小化、简单化模块间的通信,并达到松耦合的目的。

反之,模块之间若存在过多的关联,那么一个很小的变动则可能会引发蝴蝶效应般的连锁反应,最终会波及大范围的系统变动。我们说,缺乏良好封装性的系统模块是违反迪米特法则的,牵一发动全身的设计使系统的扩展与维护变的举步维艰。

门面模式和中介者模式迪米特法则极好的范例。 Tomcat中 RequestFacade类就使用了外观模式。RequestFacade是对Request类封装,屏蔽内部属性和方法,避免暴露。

合成复用原则 CRP

定义:优先使用合成/聚合,而不是类继承。

比如对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其它更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

合成(组合)和聚合都是关联的特殊种类。

  • 聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;

  • 合成则是一种强大的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。

合成/聚合复用原则好处:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模。

举例:手机软件划分可分为QQ、微信等,按品牌划分可分为华为、小米等。如果同时考虑这两种分类,其组合就很多。往下继续扩展软件、手机品牌,都会新增许多子类。违背了开闭原则,也限制了复用性。

用聚合关系实现的类图:后面新增软件,手机品牌类不用变更代码。继承的层次也少了。

参考资料

  1. 刘韬:《秒懂设计模式》

  2. 张建飞:《代码精进之路:从码农到工匠》

  3. Robert C. Martin:《架构整洁之道》

  4. 程杰:《大话设计模式》

关注公众号,后台回复【笔记】获取技术笔记PDF。

 

阿飞技术
关注 关注
  • 16
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发七大原则
chouxunge3627的博客
04-24 916
单一职责原则(Single Responsibility Principle) 每一个类应该专注于做一件事情 里氏替换原则(Liskov Substitution Principle) 超类存在的地方,子类是可以替换的 依赖倒置原则(Dependence In...
软件设计原则
qq_18541923的博客
05-09 1967
软件设计原则是指在编写程序时可引导程序员遵循的一些原则和准则。若程序员能够遵循这些准则,在组织代码、保证代码质量等方面会更有信心,代码也会更易于维护、升级和扩展。以下是五个常见的软件设计原则
七大软件设计原则
leaves_2018的博客
04-02 210
七大设计原则初体验
软件设计七大原则
weixin_34203426的博客
06-01 441
软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。我来依次来总结这 7 条原则。 这 7 种设计原则软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同。其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭;里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要...
软件设计的五大原则
weixin_37644979的博客
11-21 5870
一.UML的组合和聚合 1.组合:生命周期相同.如蜜蜂和其尾针的关系 2.聚合 :整体与局部的关系,两者都有其各自的生命周期。如鸟和鸟群的关系。 二.软件架构设计的目的都是为了达到强内聚低耦合 三.五大原则 1.开闭原则-OCP:对修改关闭,对拓展开放。 开闭原则提倡应该针对接口编程,而不是针对实现编程。因为针对实现编程,如果以后再添加一个新的功能模块就可能导致整体的功能都要修改。如下...
工业软件行业深度报告:深度剖析工业软件.pdf
09-05
工业软件行业深度报告:深度剖析工业软件.pdf,是非常全非常深度的报告,干货满满,非常值得学习与研究,推荐相关人员深入学习。
MES深度报告:工业软件“灵魂”-综合文档
05-22
MES深度报告:工业软件“灵魂”
汽车行业深度报告:软件定义汽车,AI芯片黄金赛道.pdf
07-02
汽车行业深度报告:软件定义汽车,AI芯片黄金赛道.pdf
毕业设计:Python基于深度学习的红枣识别算法的设计与实现(源码 + 数据库 + 说明文档)
最新发布
06-10
毕业设计:Python基于深度学习的红枣识别算法的设计与实现(源码 + 数据库 + 说明文档) 第二章 红枣识别技术研究 4 2.1 红枣的特征和分类 4 2.2 红枣识别的基本流程 4 2.3 红枣识别的关键技术 5 2.4 常用的红枣识别...
深度学习:为核心素养立魂.pdf
08-19
深度学习:为核心素养立魂.pdf
设计模式】一、设计模式七大原则
qwertyuiopasdfghjklzxcvbnm
08-30 486
一、开闭原则 含义 当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 作用 开闭原则是面向对象程序设计的终极目标,它使软件实体拥有一定的适应性和灵活性的同时具备稳定性和延续性。具体来说,其作用如下。 对软件测试的影响 软件遵守开闭原则的话,软件测试时只需要对扩展的代码进行测试就可以了,因为原有的测试代码仍然能够正常运行。 可以提高代码的可...
软件设计7大原则
hollp_to的博客
08-27 180
原则1、开闭原则2、依赖倒置原则3、单一职责4、接口隔离原则5、迪米特原则6、里氏替换原则7、合成复用原则 1、开闭原则 定义:一个软件实体如类、模块函数应该对扩展开放,对修改关闭。强调的是用抽象构建框架,用实现扩展细节。以提高软件系统的可复用性及可维护性帮助我们实现稳定灵活的系统架构。实现开闭原则的核心思想是面向抽象编程。 2、依赖倒置原则 定义: 高层模块不应该依赖低层模块,两者都应该依赖其抽象 抽象不应该依赖细节 细节应该依赖抽象 每一个逻辑的实现都是由原子逻辑组成的,不可分割的原子逻辑就是低层模块(
浅谈软件设计六大原则
weixin_62079735的博客
03-30 715
软件设计软件开发中非常重要的一个环节,而软件设计六大原则则是软件设计的基石,帮助程序员编写更加优秀的代码。这六大原则分别是单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则和迪米特法则。下面,我们将详细介绍这六大原则以及如何在实际编程中应用它们。
软件设计应该遵循的基本原则有哪些?
热门推荐
魏波
08-26 2万+
1.1)高内聚、低耦合   一个软件系统要有一个稳定的架构,不会随着需要的改变在发生巨大的变动。因此,高内聚、低耦合是一个软件系统设计中必须遵循的基本原则。   所谓高内聚,是指一个软件模块内各个元素彼此结合的紧密程度要高,即一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。   所谓低耦合,是指一个软件系统内不同模块之间的互连程度要低。不同模块之间的联系越紧密......
软件设计是怎样炼成的(4)——软件设计的“大道理”
weixin_34278190的博客
01-27 192
摘要:十几年前刚毕业不久,我从事第一份软件开发的工作,要完成一个项目,但没有任何软件设计的思路,于是请教我的老板。我的老板给了我两种思路:1)先假设软件已经做出来了,想好软件的外在表现,由此倒推软件的实现方法;2)思考程序的数据结构,先设计数据库,然后再搭建软件的上层建筑。老板给了我很大的启发,随着工作的开展,后来我又发现了第3种设计的思路。本文将为你分享三种软件设计的思路:...
软件设计七大原则
lixg88888888的博客
12-29 7131
软件设计中,怎样提高系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。面向对象设计原则是实现可维护性和可复用性的基础,每一个原则都蕴含了面向对象设计的思想,可从不同的视角提升一个软件结构的设计水平。这些原则蕴含着很多设计模式中,也是我们用于评价一个设计模式使用效果的重要指标之一。   1, 开放封闭原则 就是对扩展开放,而对修改封闭。其是所有面向对象原则的核心。软件设计追求的是易
《如何做好软件设计》:设计原则
yangwqonly的博客
02-06 561
前言 软件设计是一门关注长期变化的学问,日常开发中需求不断变化,那我们该怎么编写出可以支撑长期变化的代码呢?大多数人都认同的解决方案是利用设计模式,这里就有一个问题:怎么融汇贯通的将设计模式应用到实际项目中呢?这就是我们本篇文章的主题:设计原则。 个人认为设计原则软件设计的基石之一,所有语言都可以利用设计原则开发出可扩展性、可维护性、可读性高的项目,学好设计原则,就等于我们拥有了指南针,不会迷失在各个设计模式的场景中。 郑晔老师的《软件设计之美》指出:设计模式是在特定问题上应用设计原则的解决方案。我们可以
一句话总结软件设计七大原则
i_am_ququ的博客
04-29 144
结合前几节的内容,我们一共介绍了 7 种设计原则,它们分别为开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则和合成复用原则。 这 7 种设计原则软件设计模式必须尽量遵循的原则,是设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,而是要综合考虑人力、时间、成本、质量,不刻意追求完美,要在适当的场景遵循设计原则。这体现的是一种平衡取舍,可以帮助我们设计出更加优雅的代码结构。 各种原则要求的侧重点不同,下面我们分别用一句话归纳总结软件设计模式的七大原则.
深度:嵌入式系统的软件架构设计 csdn
06-06
嵌入式系统是指运行在专用或是定制化硬件平台...总之,深度嵌入式系统的软件架构设计是一个综合性的工程,它需要设计者综合考虑实时性、可扩展性、可维护性和可测试性等多个方面,以确保嵌入式系统能够长期稳定地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • git版本回退操作 61563
  • Spring Boot 中 Java8 LocalDateTime 序列化问题 20820
  • PHP环境安装教程 13581
  • 深度总结:软件设计七大原则 10542
  • kkFileview 支持https 8997

分类专栏

  • 数据库 3篇
  • JDK源码 5篇
  • spring源码 3篇
  • redis 1篇
  • Seata源码解析 3篇
  • 知识点 8篇
  • linux 部署 4篇

最新评论

  • UML14种图

    Littlefean: 在UML类图的6种箭头线里面,聚合应该是虚线还是实线?为什么我在其他很多地方看的都是实线+空心菱形,是画错了还是两种都可以呢?

  • Spring Boot WebService 实战解析

    阿飞技术: [code=java] http://localhost:8080/ws/countries.wsdl [/code] 这个路径错了,请忽略,参考截图中的连接

  • PHP环境安装教程

    ss1134: 不够呀大佬表情包

  • PHP环境安装教程

    阿飞技术: 兄弟,不够详细吗表情包

  • PHP环境安装教程

    ss1134: 能出视频吗

大家在看

  • 详细解释Informer模型的各部分 725
  • 毕业设计课题:房源管理系统,基于java+SSM+mysql
  • 借助Aspose.Email,使用 C# .NET 创建 PST 文件并填充内容
  • 太好用了!免费且无限换脸,还支持数字人的神奇工具(附安装包)
  • 远程访问及控制

最新文章

  • Spring Boot WebService 实战解析
  • 实时通讯技术实现
  • JDK多版本集成 Jacoco 配置指南
2024年2篇
2023年11篇
2022年18篇
2021年13篇
2019年7篇
2018年2篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码天门外贸网站建设哪家好喀什百度网站优化排名哪家好大丰百度网站优化排名价格梧州网站排名优化推荐金华SEO按效果付费推荐泉州优化报价青岛网站关键词优化布吉百度竞价包年推广多少钱商丘建站哪家好新余百度竞价包年推广推荐昌吉网站推广方案哪家好淮北模板推广多少钱保山网站搭建推荐黔南企业网站制作海北外贸网站建设推荐东莞seo推荐贵港网站制作设计多少钱青岛网站定制襄阳网站seo优化公司商丘百度seo襄樊百度seo推荐大芬企业网站建设公司南京seo优化宝鸡模板制作价格阳江SEO按天扣费报价张北阿里店铺托管价格三明网站推广系统价格鸡西网站优化按天收费哪家好白城如何制作网站报价江门外贸网站设计歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化