设计原则 --- SOLID
引言
SOLID是五个常见的面向对象设计原则的缩写,其目的是帮助开发者设计易于维护和扩展的软件系统
其中包含单一职责原则(SRP),开闭原则(OCP),里氏替换原则(LSP),接口隔离原则(ISP),依赖反转原则(DIP)。
除SOLID之外,后续又增加了迪米特法则。
单一职责原则
单一职责原则(Single Responsibility Principle,SRP),这个原则指出一个类应该只有一个职责。也就是说,一个类应该只有一种修改的原因。如果一个类负责多个不同的职责,那么对其中一个职责的修改可能会影响到其他职责,从而导致系统的不稳定性。
开闭原则
开闭原则(Open-Closed Principle,OCP),这个原则指出一个类应该对扩展开放,对修改关闭。也就是说,系统中的类应该能够方便地进行扩展,但是对于已经存在的类,尽量避免进行修改。这样可以减少代码的复杂性,提高系统的稳定性。
:::tip{title="提示"}
开闭原则需要避免过度设计,即在不必要的情况下进行扩展。同时,应该避免使用复杂的继承结构,而应该优先使用组合和接口实现扩展。
:::
里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP),这个原则指出,如果一个子类不能完全替代它的父类,那么这个子类就不应该存在。换句话说,子类应该能够在不影响父类的前提下,完全替代父类的功能。这样才能保证系统的正确性和稳定性。
:::tip{title="提示"}
里氏替换原则需要注意继承关系的正确性。子类必须要遵循父类的约束,否则就会破坏LSP的原则。同时,在使用多态时需要注意类型的转换和类型检查的正确性。
:::
接口隔离原则
接口隔离原则(Interface Segregation Principle,ISP),这个原则指出一个类不应该强制依赖它不需要的接口。如果一个类依赖了一个过于庞大的接口,那么当这个接口发生变化时,这个类也需要相应地进行修改。因此,一个类应该尽量只依赖于它需要的接口,避免不必要的依赖。
:::tip{title="提示"}
接口隔离原则需要避免接口的冗余和重复。接口应该根据不同的职责进行分离,避免一个接口承担过多的职责。同时,应该避免使用过于具体的接口,而应该优先使用更抽象的接口
:::
依赖反转原则
依赖反转原则(Dependency Inversion Principle,DIP),这个原则指出,高层模块不应该依赖于低层模块,两者都应该依赖于抽象。同时,抽象不应该依赖于具体实现,具体实现应该依赖于抽象。这样可以减少系统的耦合度,提高系统的可扩展性和可维护性。
:::tip{title="提示"}
依赖反转原则需要注意依赖注入的方式和依赖倒置的层次。依赖注入应该使用构造函数注入、属性注入或方法注入,避免使用硬编码的依赖。同时,在依赖倒置时需要注意依赖的层次,避免高层模块依赖过于低层的模块。
:::
迪米特法则
迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP)。
迪米特法则要求一个对象应该只与其直接的朋友通信,而不是跟朋友的朋友或者更远的对象通信。对象之间的耦合度越低,系统的灵活性、可维护性、可扩展性就越好,同时也降低了代码的复杂度和风险。
:::tip{title="提示"}
迪米特法则需要注意:
- 将方法中的参数尽量缩小,尽量不引入不需要的对象。
- 在类的设计中,尽量降低对其他类的依赖。
- 将依赖其他类的操作放到一个中介类中,由中介类负责和其他类的通信。
:::
结论
SOLID原则是一种很好的软件设计指导原则,能够帮助开发者设计出易于维护和扩展的软件系统。但是,这些原则并不是银弹,需要根据具体的情况进行灵活运用。同时,在应用这些原则时需要注意细节和实现细节,才能真正达到SOLID原则的设计目标。
设计原则 --- SOLID的更多相关文章
- 经典设计原则 - SOLID
SOLID 设计原则包含以下 5 种原则: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open Closed Principle, OCP) ...
- 面向对象设计原则-SOLID
SOLID的意思是: Single responsibility principle 单一职责原则 Open/close principle 开放/封闭原则 Liskov substitution p ...
- [设计模式]面向对象五大设计原则:SOLID
SOLID (面向对象设计) 单一功能原则(Single responsibility principle) 每个类都应该有一个单一的功能,并且该功能应该由这个类完全封装起来 所有它的(这个类的)服务 ...
- 【面像对象编程OOP】五种设计原则 Solid
"面向对象设计五大原则"和良性依赖原则在应付变化方面的作用. SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转) 单一职责原则(Single-Resposibilit ...
- 工作那么久,才知道的 SOLID 设计原则
认识 SOLID 原则 无论是软件系统设计,还是代码实现,遵循有效和明确的设计原则,都利于系统软件灵活可靠,安全快速的落地,更重要的是能灵活地应对需求,简化系统扩展和维护,避免无效的加班.本文主要讨论 ...
- .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记
目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...
- JavaScript设计原则与编程技巧
1 设计原则概述 <UNIX/LINUX设计哲学>设计准则 ① 小既是美. ② 每个程序只做一件事情. ③ 快速建立原型. ④ 舍弃高效率而取可移植性. ⑤ 避免强制性的图形化界面交互. ...
- 聊聊OOP中的设计原则以及访问者模式
一 设计原则 (SOLID) 1. S - 单一职责原则(Single Responsibllity Principle) 1.1 定义 一个类或者模块只负责完成一个职责(或功能), 认为&qu ...
- 软件设计原则(Principles)
设计模式的从许多优秀的软件中总结出来的 , 使用设计模式能够实现可复用.可维护.开发人员之间方便沟通设计和理解代码. Tips 对于模式的使用 , 不能拘泥于格式 , 事实上根据需要模式是可以演化的 ...
- SOLID 设计原则
SOLID 原则基本概念: 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象 ...
随机推荐
- 解决VS选择运行“在证书存储区中找不到清单签名证书”
转:https://www.cnblogs.com/190196539/archive/2011/12/03/2272861.html 解决"在证书存储区中找不到清单签名证书" ...
- C++ LibCurl实现Web隐藏目录扫描
LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP.FTP.SMTP.POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发 ...
- 4.5 Windows驱动开发:内核中实现进程数据转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导 ...
- How to 充分利用你的服务器
服务器高性能计算指南 本文处于preview阶段,内容并不完全严谨,如有错误敬请原谅,适当参考. 目录 服务器高性能计算指南 什么样的计算适合当前服务器? 从CPU架构入手 两个CPU带来的影响 那么 ...
- 硬件、OS、数据库各种兼容性傻傻分不清?
服务器硬件型号.OS操作系统版本.Oracle数据库版本.. 各种型号各种版本,排列组合的话也是N多种组合,如何确认这些可以兼容并且得到官方认证呢? 其实很简单,各司其职,各自去确认各自的. 我们知道 ...
- Power BI 13 DAY
分组依据 在PQ下对维度进行汇总,并对其他字段进行不同的计算方式,就需要使用分组依据 将下表中已"店名"为维度对重复店名作排重处理,对"单号"字段进行计数计算, ...
- logging --- Python 的日志记录工具
logging --- Python 的日志记录工具 源代码: Lib/logging/__init__.py Important 此页面仅包含 API 参考信息.教程信息和更多高级用法的讨论,请参阅 ...
- NVME(学习笔记七)—Atomicity Operation
5.21.1.10 Write Atomicity Normal 这个特性控制AWUN和NAWUN参数的操作.设置的属性值在set Feature命令的Dword 11中表明. 如果提交Get Fea ...
- 端口碰撞Port Knocking和单数据包授权SPA
端口碰撞技术 Port knocking 从网络安全的角度,服务器开启的端口越多就越不安全,因此系统安全加固服务中最常用的方式,就是先关闭无用端口,再对提供服务的端口做访问控制.而作为远程管理与维护的 ...
- springboot+vue+elementui实现文件上传下载删除DEMO
说明 前面搜索了几个关于springboot+vue+elementui上传下载的文章,感觉写的都不尽如人意.要么是功能不完善,不好用.再者就是源码提供的实在差劲,都不完整.一气之下,自己搞了一个实用 ...