首页 > 其他分享 >SOLID 原则:软件设计的基本原则

SOLID 原则:软件设计的基本原则

时间:2024-04-19 11:57:40浏览次数:20  
标签:依赖 原则 SOLID 接口 软件设计 模块 设计

SOLID 原则:软件设计的基本原则

高质量的软件设计是构建可靠、可维护和可扩展软件系统的关键。SOLID 原则是一组指导软件开发的五个基本设计原则,它们帮助开发者创建更加健壮和灵活的系统。

SOLID 原则是五个设计和编程的基本原则,它们分别是:单一职责原则(Single Responsibility Principle, SRP)、开放封闭原则(Open-Closed Principle, OCP)、里氏替换原则(Liskov Substitution Principle, LSP)、接口隔离原则(Interface Segregation Principle, ISP)和依赖倒置原则(Dependency Inversion Principle, DIP)。

单一职责原则(SRP)

单一职责原则强调每个软件模块应该只有一个引起变化的原因。

SRP 是 SOLID 五大设计原则中最容易被误解的一个。很多程序员根据 SRP 这个名字想当然地认为这个原则是指:一个模块应该只有一个职责或者每个模块都应该只做一件事。虽然也的确有这么一个设计原则,即确保一个函数只完成一个功能,这在我们将大型函数重构成小函数时经常会用到。但这只是一个面向底层实现细节的设计原则,并不是 SRP 的全部。

对 SRP 更准确的描述应该是:任何一个软件模块都应该只对某一类行为者负责。通俗一点讲,就是一个模块应该只给同一类别的使用者使用,或者说这个模块使用者使用这个模块改变系统行为时都是基于相似的原因。

开放封闭原则(OCP)

开放封闭原则原则认为,设计良好的计算机软件应该易于扩展,同时抗拒修改。换句话说,一个设计良好的计算机系统应该在不需要修改的前提下就可以轻易被扩展。这意味着当我们需要添加新功能时,应该尽量通过扩展现有代码来实现,而不是修改现有代码。

OCP 是我们进行系统架构设计的主导原则,其主要目标是让系统易于扩展,同时限制其每次被修改所影响的范围。

OCP 的实现方式是通过将系统划分为一系列组件,并且将这些组件间的依赖关系按层次结构进行组织,使得高阶组件不会因低阶组件被修改而受到影响。

里氏替换原则(LSP)

里氏替换原则简单来说就是如果想用可替换的组件来构建软件系统,那么这些组件就必须遵守同一个约定,以便让这些组件可以相互替换。

早期,大家普遍认为 LSP 不过是指导如何使用继承关系的一种方法,然而随着时间的推移,LSP 逐渐演变成了一种更广泛的、指导接口与其实现方式的设计原则。这里的接口可以有多种形式——可以是类似 Java 的接口,有多个实现类;也可以像 Ruby 一样,几个类共用一样的方法签名,也可以是几个服务响应同一个 REST 接口。这些场景中的用户都依赖于一种接口,并且都期待该接口的不同实现具有可替换性。

接口隔离原则(ISP)

接口隔离原则主要告诫软件设计师应该在设计中避免不必要的依赖。

在一般情况下,任何层次的软件设计如果依赖于不需要的东西,都会是有害的。从源代码层次来说,这样的依赖关系会导致不必要的重新编译和重新部署,对更高层次的软件架构设计来说,问题也是类似的。

依赖倒置原则(DIP)

依赖倒置原则出高层策略性的代码不应该依赖实现底层细节的代码,恰恰相反,那些实现底层细节的代码应该依赖高层策略性的代码。

DIP 主要想告诉我们的是,如果想要设计一个灵活的系统,在源代码层次的依赖关系中就应该多引用抽象类型,而非具体实现。

实际上,严格执行执行这条设计原则是不现实的,因为软件系统在实际构造中不可避免地需要依赖到一些具体实现。只要这些具体实现是稳定的,可能的修改也受到严格的控制,那么直接依赖这些具体实现不会存在太大的问题。

我们主要应该关注的是系统内部那些会经常变动的具体实现模块,这些模块是不停开发的,也就会经常出现变更。如果想要在软件架构设计上追求稳定,就必须多使用稳定的抽象接口,少依赖多变的具体实现。设计师和架构师会花费很大精力来设计接口,以减少未来对其进行改动,争取在不修改接口的情况下为软件增加新的功能。

应用设计原则(DIP)

在实际的软件开发过程中,SOLID 原则可以指导我们进行更合理的设计决策。以下是一些应用 SOLID 原则的策略:

  1. 识别职责:在设计模块时,识别并分离不同的职责,确保每个模块只对一个行为者负责。
  2. 使用抽象:通过定义稳定的抽象层,降低系统对具体实现的依赖,提高系统的可扩展性。
  3. 避免过度设计:遵循开闭原则,避免过早地设计系统可能不需要的功能,减少不必要的复杂性。
  4. 定义清晰的接口:遵循接口隔离原则,为不同的客户端定义不同的接口,避免不必要的依赖。
  5. 反转依赖:通过依赖注入等技术,使高层模块依赖于抽象,而不是低层模块的具体实现。

在实际的软件设计过程中,我们需要根据项目的具体需求和团队的实际情况来灵活运用这些原则。虽然这些原则并不是银弹,但它们确实为我们提供了一种有效的思维方式和方法论,帮助我们设计出更加健壮、可维护、可扩展的软件系统。这些原则不仅帮助我们避免了一些常见的设计错误和陷阱,还提高了代码的质量和可重用性。因此,在软件设计和开发过程中,我们应该深入理解并灵活运用这些原则。

标签:依赖,原则,SOLID,接口,软件设计,模块,设计
From: https://www.cnblogs.com/kitsum/p/18145508

相关文章

  • 软件测试的原则
    软件测试中大多数重要的问题都是心理学问题。我们可以归纳出一系列重要的测试指导原则。这些原则看上去大多都是显而易见的,但常常总是被我们忽视掉。软件测试的重要原则测试用例中一个必需部分是对预期输出或结果进行定义。程序员应当避免测试自己编写的程序。编写软件的组织......
  • 微服务架构下如何通过弱依赖原则保障系统高可用
    前言当我初次接触高可用这个概念的时候,对高可用的【少依赖原则】和【弱依赖原则】的边界感模糊,甚至有些“傻傻分不清楚”。这两个原则都关注降低模块之间的依赖关系,但它们之间的确存在某些差异。那么,「少依赖原则」和「弱依赖原则」它们之间本质的区别究竟是啥?少依赖原则和弱......
  • 敏捷WIDETOM原则:精益是减少浪费的艺术
    敏捷WIDETOM原则大前提,精益是减少浪费的艺术小前提,敏捷是精益的一部分结论,敏捷需要减少浪费既然要减少浪费,那么我们是不是应该去识别浪费呢?WIDETOM原则就总结了浪费的几种形式。【W】-等待(已经准备好,但迟迟未进入加工环节。如代码开完完成了,等待被测试的时间。)【I】-库存(浪费,......
  • 七大设计原则(三)
    合成复用原则合成复用原则的定义如下:合成复用原则(CompositeReusePrinciple,CRP):尽量使用对象组合,而不是继承来达到复用的目的。合成复用原则强调,如果一个功能可以同时通过继承与组合实现,应该首先考虑使用组合。首先,相对于继承来说,组合能让代码变化的修改范围变得更小。一个父......
  • 软件设计师考试大纲
    软件设计师(中级)考试大纲[1]考试时间分布各级别考试均分2个半天进行。高级资格综合知识科目考试时间为2.5小时,案例分析科目考试时间为1.5小时、论文科目考试时间为2小时。初级和中级资格各科目考试时间均为2.5小时。计算机专业技术资格(水平)考试原则上每年组织两次,在每年第二......
  • 黑盒测试用例设计技术-语法测试原则及案例
    语法测试用例设计原则选项导出原则:当语法规则强制选择时,为该选择的每个备选方案导出一个测试用例(“选项”)。最小与最大重复次数原则:当语法规则强制执行最小重复次数时,应为此导出至少两个测试用例:一个满足最小重复次数,另一个不满足(小于最小重复次数)。当语法规则允许最大重复......
  • 七大设计原则(二)
    三、里氏替换原则里氏代换原则由2008年图灵奖得主、美国第一位计算机科学女博士BarbaraLiskov教授和卡内基·梅隆大学JeannetteWing教授于1994年提出。其严格表述如下:如果对每个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换o2时,程序P的行为......
  • mysql 索引设计原则
    适合添加索引的情况1.字段的数值有唯一性的限制索引本身可以起到约束的作用,比如唯一索引、主键索引都可以起到唯一性约束的,因此我们在创建数据表时,如果某个字段时唯一的,就可以直接创建唯一性索引或主键索引。不要以为唯一索引影响了insert的速度,这个速度损耗可以忽略不计,单体......
  • SOLIDWORKS模板批量修改工具 慧德敏学
    SOLIDWORKS批量修改模板插件-SolidKits.BOMs工具可实现工程图模板的批量替换,单位系统的批量修改,批量定义模型材质等功能。操作简单快捷,只需要提前打开SOLIDWORKS软件,执行后程序会自动完成所有替换操作。使用SOLIDWORKS绘制工程图之前,必须要选择工程图模板,模板中我们会定义好图幅......
  • 法规 - 医疗器械软件注册审查指导原则
    医疗器械软件注册审查指导原则(2022年修订版) 本指导原则旨在指导注册申请人规范医疗器械软件生存周期过程和准备医疗器械软件注册申报资料,同时规范医疗器械软件的技术审评要求,为医疗器械软件、质量管理软件的体系核查提供参考。本指导原则是对医疗器械软件的一般要求,注册申请......