设计模式之内功心法 SOLID五大原则

告别代码“腐烂”!程序员进阶必备的SOLID原则,你掌握了吗? 你是否也曾陷入“改一处、崩十处”的代码噩梦?面对日益臃肿、难以维护的“屎山”代码,感觉自己只是个“代码搬运工”?本专栏《告别“屎山”代码》旨在帮你打通软件工程的“任督二脉”。本文作为开篇,将用最通俗易懂的比喻和代码实例,带你彻底征服软件设计的基石——SOLID五大原则。掌握它,是从“能用”到“好用”,从“搬砖”到“架构”的必经之路! 阅读详情

前言

随着计算机行业的不断发展,人们对于可以给予自身快速成长的技术非常的痴迷。就比如今天要聊的设计模式,学过编程的都知道设计模式,而很少有人会知道它的核心思想是什么,只是一味的照着网络上流行的设计模式 二十三式 依葫芦画瓢。仅做到了知其然而不知其所以然。所以今天来聊聊它出现的意义什么

意义

我们知道一个江湖的组成是非常不容易的,在江湖中也会有很多的门派与帮派,而门派一多就会有各式各样的问题,这时就出来了一个叫做设计模式的东西,来处理门派在发展过程中遇到的一般问题的解决方案。其中的话有以下五经可供参考。

五经

设计模式架构中,有常用来指导设计的 5 大原则,俗称:SOLID

  1. 单一原则 (SRP)
  2. 开闭原则 (OCP)
  3. 里氏替换原则 (LSP)
  4. 接口隔离原则 (ISP)
  5. 依赖倒置原则 (DIP)

单一原则

从字面上理解单一的意思可能就代表着你门派业务或者任务的单一等等,比如龙门镖局的创立之初可能就是说押押镖 送送快递之类的。而药仙谷则可能就只是制制药之类的。它们俩之间就不存在什么耦合性关系了。


翻译:一个类只负责完成一个职责或者功能。一个模块应该对一类且仅对一类行为者负责。不要设计大而全的类,要设计粒度小、功能单一的类。单一职责原则是为了实现代码高内聚、低耦合、提高代码的复用性、可读性、可维护性。


判断是否单一:

  1. 类中的代码行数、函数或者属性过多;
  2. 类依赖的其他类过多,或者依赖类的其他类过多;
  3. 私有方法过多;
  4. 比较难起一个合适的名字;
  5. 类中大量的方法都是集中操作类中的某几个属性。

误区: 类与模块的划分不是说划分越细越好的,因为拆分的过细,会降低内聚性,增加维护的成本


建议: 在划分类与模块时,尽量从业务出发。而且划分的过程也可以是跟着业务的发展逐步进行的。

	// 错误的示范 可以看到客户类当中加入了支付的相关逻辑,明显不单一
	class Customer
	{
	    public function getCustomer()
	    {
	        echo '客户信息';
	    }
	
	    public function pay()
	    {
	        echo '支付金额';
	    }
	}

	// 正确示范 将客户的正常信息与支付信息划分开
	class Customer
	{
	    public function getCustomer(){
	
	        echo '客户信息';
	    }
	}
	
	class CustomerPay
	{
	    public function pay()
	    {
	        echo '支付金额';
	    }
	}

开闭原则

随着门派的不断发展,客户量的不断增加,就会有许多扩张方案或者活动之类。就拿龙门镖局为例:周年庆时,门派为了酬谢客户 而举办了一个活动。这个活动由于是新的业务,为了不影响旧的业务的进行,门派就新扩展了一个活动部门专门处理周年庆的事情。


翻译:软件实体(模块、类、方法等)应该对“对扩展开发、对修改关闭”,也可这样理解 那就是添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)


注意点:

  1. 开闭原则并不是完全杜绝修改,而是以最小的代价完成新功能的开发
  2. 在不同角度来看,修改也可能是扩展。粗粒度下可能是修改,细粒度来看可能是扩展。

里式替换

随着活动办的非常成功,门派业务也是突飞猛进,所以门主及长老打算在荆州再开一个分局,但是分局的相关规章制度是一样的。


翻译:子对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏


违反了里式替换:

  • 子类违背父类声明要实现的功能
  • 子类违背父类对输入、输出、异常的约定
  • 子类违背父类注释中所罗列的任何特殊说明

注意点:
1.父类定义了函数的“约定”(或者协议),那么子类可以改变函数的内部实现逻辑,但不能改变原有的“约定”,比如:输入、输出、异常的约定 甚至包括注释。

接口隔离

在门派创立之初,发布了一个入门申请的规范,只要满足实现了规范上写的就可以龙门镖局了。可是有一天掌门想添加一条关于清退不合格人员,但是如果在入门那个规范里面写就不太好了 所以重新发了一份清退规范。


翻译:客户端不应该强迫依赖它不需要的接口,其中的“客户端”可以理解为接口的调用者或者使用者


接口定义:

  1. 一组API接口集合
  2. 单个API接口或函数
  3. OOP中的接口概念

注意点:

  1. 接口需要单一,不该让接口的实现类和调用者,依赖不需要的接口函数。

依赖倒置

在第三方招人机构没有发展之前,门派的招人都是自主招人发工资的,而这时候门派与员工必须强耦合了,而这时候第三方人力公司搞出来个劳务派遣,雇主把钱给到人力公司,人力公司去招人 并发工资给员工,通过这样的方式,雇佣双方把对方的直接控制,反转到了让对方来依赖一个标准的派遣模型的接口——人力公司。


翻译:高层模块不要依赖底层模块,高层模块和低层模块应该通过抽象来互相依赖。除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。

ps:在调用链上,调用者属于高层,被调用者属于低层。
面向对象编程中著名的 SOLID 原则 这五大原则是一个相互支撑的整体。单一职责是基础,开放封闭是核心目标,里氏替换保证了继承的正确性,接口隔离和依赖倒置则提供了实现解耦和扩展的具体手段。在实际开发中,它们常常需要结合使用。 阅读详情

相关推荐

避坑指南:Spring3集成OpenAPI时泛型响应失效的3种解决方案

本文深入探讨了Spring3集成OpenAPI时泛型响应失效的问题,提供了三种实用解决方案:移除@Schema注解、使用@ArraySchema包装泛型以及自定义Schema处理器。针对不同项目规模,详细分析了各方案的适用场景、优缺点及性能影响,帮助开发者高效生成准确的接口文档,提升前后端协作效率。

weixin_30839881的博客 95

2024年Java设计模式实战指南:从SOLID原则到Spring源码剖析

设计模式是面向对象编程中解决常见问题的经典方案,其核心在于提升代码的可复用性、可扩展性和可维护性。从原理层面看,设计模式基于SOLID等核心设计原则,通过封装变化、降低耦合来实现软件设计的灵活性。在技术价值上,掌握设计模式能帮助开发者深入理解主流框架底层机制,提升系统架构能力。尤其在微服务、云原生等现代架构中,设计模式的应用更为关键。本文以Spring框架为例,剖析了工厂模式在IoC容器、观察者模式在事件驱动、模板方法模式在JdbcTemplate中的具体实现,并结合电商支付、订单处理等实战场景,展示了策略

weixin_34082695的博客 410

基于FME—三调篇—尖锐角及小缝隙处理

1 问题分析: 该功能实现在FME较为简单,相对ARCGIS模型构建器以及ARCGIS ENGINE,FME更适合无代码基础的人群。在三调内业数据处理要求中,尖锐角是不允许存在的。本文基于FME实现了对尖锐角的自动查询与消除以及自动处理在消除尖锐角过程中产生的缝隙,并进行了拓扑检查,实现自动化批量处理尖锐角的功能,提高工作效率。 2 总体思路: 2.1 实现功能分析: 1.找出小于指定角度的尖锐角...

qq_33315579的博客 9160

设计原则之 SOLID 原则

在最初开始学设计模式的时候,总觉的要学的是那23种经典的设计模式。通过一段的学习,才突然领悟,设计原则才是王道,才是真正的内功心法。 在这里总结下常用的几种设计原则:SOLID、KISS、YAGNI、DRY、LOD SOLID 原则 SOLID 原则的对应五种设计原则,每个首字母对应一种 S:单一职责原则 O:开闭原则 L:里氏替换原则 I:接口隔离原则 D:依赖反转原则 SRP 单一职责原则 单一职责原则(Single Responsibility Principle):一个类或者模块只负责完成一个职

minghai 812

Win11系统重装全记录:从备份Office激活到搞定RAID阵列,我的微星笔记本复活记

本文详细记录了Win11系统重装的完整过程,从数据备份到RAID阵列配置,特别针对微星笔记本的特殊硬件驱动问题提供了解决方案。文章涵盖了Office激活状态备份、BIOS设置、驱动安装顺序等关键步骤,帮助用户顺利完成系统重装并优化性能。

weixin_31421613的博客 301

量化交易新手入门:从零开始搭建你的第一个Python交易策略(附完整代码)

本文为量化交易新手提供从零开始搭建Python双均线策略的完整指南,涵盖环境配置、数据获取、策略实现及风险管理等关键步骤。通过详细的代码示例和实践建议,帮助读者快速掌握量化交易的核心技术,并避免常见陷阱。文章特别强调Python在量化交易中的技术革新优势,适合希望进入金融科技领域的初学者。

weixin_26905487的博客 433

Java 设计模式心法之第2篇 - 内功:精解 SOLID 原则,筑牢高质量代码基石

子类可以在父类的基础上进行扩展(增加新行为),但绝不能改变、违反或“缩小”父类已经承诺的行为。

码觉客的博客 1017

STM32 AFIO时钟开启时机与复用功能解析

在嵌入式系统开发中,GPIO复用是微控制器外设配置的核心技术之一。通过复用功能,单个物理引脚可以动态切换不同功能模式,如USART通信或普通IO。其实现原理依赖于芯片内部的时钟树架构和寄存器配置机制。AFIO(Alternate Function I/O)模块作为STM32的特色设计,专门处理引脚重映射、外部中断配置等高级功能。正确理解复用功能与AFIO时钟的关系,能显著提升嵌入式开发效率,避免资源浪费。本文以STM32为例,结合引脚重映射和USART配置等典型场景,详解AFIO时钟的实际应用规范与优化实践

weixin_42389113的博客 574

想写好前端,先练好内功

前言 封不平听在耳里,暗叫:“到这地步,我再能隐藏甚么?”仰天一声清啸,斜行而前,长剑横削直击,迅捷无比,未到五六招,剑势中已发出隐隐风声。他出剑越来越快,风声也是渐响,剑锋上所发出的一股劲气渐渐扩展,旁观众人只觉寒气逼人,脸上、手上被疾风刮得隐隐生疼,不由自主的后退,围在相斗两人身周的圈子渐渐扩大,竟有四五丈方圆。泰山派的一个道士在旁说道:“气宗的徒儿剑法高,剑宗的师叔内力强,这到底怎么搞的?华山派的气宗、剑宗,这可不是颠倒来玩了么? 《笑傲江湖》中的“剑宗余孽”封不平本想仗着有嵩山派撑腰,一举夺

ass_ace 236

波克 上海 Unity开发笔试题 2024

主要分为四部分,如果没有准备好,不要点击笔试链接,进入就会自动开始。

z2014z的博客 3380

Unity游戏开发客户端面经——网络(初级)

Unity游戏开发客户端面经 之 网络 篇

Sea3752的博客 1万+

[鉴赏]摇身一变鼓吹软件工程-01-Allen Holub

之前对软件工程无知的情况下贬低软件工程,如今摇身一变,大谈AI时代的软件工程。让人产生错觉,似乎他历来支持软件工程。

rolt的专栏 671

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1848

业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践

在过去十年的软件工程演进中,几乎成了所有中大型技术团队的必经之路。拆分带来的收益显而易见:业务线边界明晰、团队独立迭代发布、技术栈按需选型、局部弹性伸缩能力大幅增强。然而,许多团队在完成初期的“物理拆分”后,很快便发现自己陷入了更严峻的微服务架构绝不是把一个工程强行切成十几个子模块那么简单,其核心精髓在于。本文将系统拆解企业级微服务的六大核心设计模式,并提供自包含可落地的自适应弹性编排实战。

zzu123zsw的专栏 366

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

设计模式与生活③:你的早晨,是一套模板

周一早上,闹钟响的时候,天还没亮透。归拢成大类,其实是五步:起床、洗漱、早餐、通勤、打卡——骑车和地铁,都算通勤那一步里的事。一步都不能乱。不洗脸出门,地铁上自己难受;不骑车,赶不上那班车;早饭不吃,上午十点手就抖。这套流程他跑了两年,顺序一次没变过。眼睛还没睁开,锅已经热了有意思的是,同组的小李流程一模一样,做法全不一样。小李的早饭是路过便利店顺手买的饭团,不骑车,开车直接到公司楼下。——把流程的骨架定死,把每一步怎么做,留给别人填。系列第三篇。

工一木子 149

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【智能体】Loop 的四种设计模式之:Verification Loop(2026 最新版)

智能体四种设计模式之:Verification Loop

商务合作 | 面试培训 | 职场规划 ==>主页扫码 348

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++特殊类设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

qq_73640809的博客 433
上一篇: 记一次mongodb碎片的处理
下一篇: 设计模式之职责链模式
学习上的Monkey
博客等级 码龄11年 24粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值