重修设计模式-设计原则

news/2024/9/20 23:27:32/

重修设计模式-设计原则

设计原则

设计原则是软件编码时所遵循的规则,旨在帮助开发者创建出既满足功能需求又易于维护、可扩展且美观的设计,理解设计原则可以提升代码质量、减少错误以及促进团队协作,但对设计原则的理解要灵活,不要拿原则当真理,生搬硬套会适得其反。

SOLID原则:

  • S单一职责原则(Single Responsibility Principle, SRP)

    A class or module should have a single responsibility.

    一个类或者模块只负责完成一个职责。

    这有助于降低系统的复杂性,提高代码的可读性和可维护性。当需求变更时,只需要修改负责该职责的类或模块即可。

  • O开闭原则(Open-Closed Principle, OCP)

    software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification.

    软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭。

    意味着软件应该通过添加新的代码来扩展,而不是通过修改现有的代码来实现,有助于保持系统的稳定性和可维护性。

  • L里式替换原则(Liskov Substitution Principle, LSP)

    Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it.

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

    里式替换和多态有点类似,但它们关注的角度不一样:多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法,是一种代码实现的思路。而里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。

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

    Clients should not be forced to depend upon interfaces that they do not use.

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

    一个类对另一个类的依赖应该建立在最小的接口上。有助于减少接口的污染和不必要的依赖,提高系统的灵活性和可维护性。

  • D依赖倒置原则(Dependency Inversion Principle, DIP)

    High-level modules shouldn’t depend on low-level modules. Both modules should depend on abstractions. In addition, abstractions shouldn’t depend on details. Details depend on abstractions.

    高层模块不要依赖低层模块,两者都应该依赖其抽象。

    抽象不应该依赖细节。

    细节应该依赖抽象。

    有助于减少模块间的耦合度,提高系统的灵活性和可维护性。

    在 Java 中的表现是:

    • 模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;

    • 接口或抽象类不依赖于实现类;

    • 实现类依赖接口或抽象类。

    举例,不符合依赖导致原则的类依赖关系:
    在这里插入图片描述
    符合后:

迪米特法则(Law of Demeter, LoD)

Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Or: Each unit should only talk to its friends; Don’t talk to strangers.

每个模块只应该了解那些与它关系密切的模块的有限知识。或者说,每个模块只和自己的朋友“说话”,不和陌生人“说话”。

迪米特法则也叫最小知识原则:The Least Knowledge Principle。

不该有直接依赖关系的类之间,不要有依赖。有依赖关系的类之间,尽量只依赖必要的接口。迪米特法则希望减少类之间的耦合,让类越独立越好,缩小功能改动导致的代码改动范围,有助于代码“高内聚,低耦合”。

  • 高内聚:相近的功能应该放到同一个类中。

  • 低耦合:类与类之间的依赖关系简单清晰,即使两个类有依赖关系,一个类的代码改动也不会或者很少导致依赖类的代码改动

KISS原则

Keep It Simple and Stupid.

尽量保持简单。

强调设计应该保持简单,避免过度复杂。简单的设计更容易理解、维护和扩展。

YAGNI 原则

You Ain’t Gonna Need It.

你不会需要它。

在软件开发中,不要去设计当前用不到的功能;不要去编写当前用不到的代码。实际上,这条原则的核心思想就是:不要做过度设计。

DRY原则

Don’t Repeat Yourself.

不要重复你自己。

重复包括以下几种情况:

  1. 代码实现重复:两个方法中大部分代码相同,只有小部分差异。

    看是否能抽出通用方法,但也要注意“单一职责原则”和“接口隔离原则”。

  2. 功能语义重复:两个方法的实现不同,但方法名语义相同。

  3. 执行重复:代码执行时,某一代码块执行冗余。


http://www.ppmy.cn/news/1528127.html

相关文章

敏感个人信息识别指南正式版发布,个人信息保护合规要求更明确

9月14日,全国网络安全标准化技术委员会秘书处发布《网络安全标准实践指南——敏感个人信息识别指南》。 2020 年发布的国标文件 GB/T 35273《信息安全技术 个人信息安全规范》中提到关于敏感个人信息的示例,本次公开的《敏感个人信息识别指南》详细规定了…

【homebrew安装】踩坑爬坑教程

homebrew官网,有安装教程提示,但是在实际安装时,由于待下载的包的尺寸过大,本地git缓存尺寸、超时时间的限制,会报如下错误: error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly&#xf…

SpringCloud系列之一---搭建高可用的Eureka注册中心

前言 本篇文章主要介绍的是SpringCloud相关知识、微服务架构以及搭建服务注册与发现的服务模块(Eureka)以及Eureka集群。 GitHub源码链接位于文章底部。 什么是SpringCloud Spring Cloud 是一系列框架的有序集合。 它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设…

【数据结构】什么是二叉搜索(排序)树?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌二叉搜索(排序)树的概念 📌二叉搜索(排序)树的操作 🎏二叉搜索树的查找 🎏二叉搜索树的插入 🎏二叉搜索树的…

MYSQL面试知识点手册

第一部分:MySQL 基础知识 1.1 MySQL 简介 MySQL 是世界上最流行的开源关系型数据库管理系统之一,它以性能卓越、稳定可靠和易用性而闻名。MySQL 主要应用在 Web 开发、大型互联网公司、企业级应用等场景,且广泛用于构建高并发、高可用的数据…

SDL 2.0视频数据渲染到窗口上播放流程

在 SDL 2.0 中,将视频数据渲染到窗口上涉及几个步骤,包括创建窗口和渲染器、加载视频帧数据、将其绘制到纹理上以及更新显示。以下是一个基本的示例,演示了如何使用 SDL 2.0 渲染视频帧到窗口: 基本步骤 初始化 SDL:…

【结构型】树形结构的应用王者,组合模式

目录 一、组合模式1、组合模式是什么?2、组合模式的主要参与者: 二、优化案例:文件系统1、不使用组合模式2、通过组合模式优化上面代码优化点: 三、使用组合模式有哪些优势1、统一接口,简化客户端代码2、递归结构处理方…

【大模型入门】零基础入门AI大模型应用开发,你需要一个系统的入门路径!

随着大模型技术的飞速发展,我们正站在一个全新的技术前沿,探索着如何将这些强大的工具应用于实际问题的解决。如果你对AI大模型应用开发充满热情,那么你可以读一下这篇文章——一个系统全面的入门指南,专为渴望深入AI世界的你设计…