软件架构的23个基本原则

软件设计模式概述和软件设计七大原则 目录 1软件设计模式概述 1.1软件设计模式的产生背景 1.2软件设计模式的概念与意义 1.2.1软件设计模式的概念 1.2.2学习设计模式的意义 1.3软件设计模式的基本要素 1.3.1模式名称 1.3.2 问题 1.3.3解决方案 1.3.4效果 2GoF 的 23 种设计模式的分类和功能 2.1根据目的来分 2.1.1 创建型模式 2.1.2结构型模式 2.1.3行为型模式 2.2GoF的23种设计模式的功能 3 什么才是优秀的软件架构 ... 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:DeepNoMind

f440680144165b2cc2008e427ff229a3.jpeg


软件体系架构基于一组适用于各种软件系统的基本原则,有经验的架构师知道这些原则,并且能够在软件产品的正确位置实现特定的原则。下面我们快速浏览一下架构师日常遵循的基本原则。

1. 依赖倒置(Dependency Inversion)

这一原则表明依赖的方向应该是抽象的,而不是具体实现。如果编译时依赖在运行时执行的方向上流动,就形成了直接依赖。通过依赖倒置,可以反转依赖控制的方向。下面的文章更深入的讨论了这一原则:

https://medium.com/p/de6abf20e423

2. 关注点分离(Separation of Concerns)

这一原则指出,软件系统应该按照所做的工作类型来划分。比方说可以按照业务逻辑、基础设施或用户界面划分为不同的部分。通过将系统划分为基于不同活动区域的不同部分,使得开发/测试/部署更加容易。SoC是软件架构模式(如领域驱动设计、六边形架构、整洁架构)背后的驱动力。

3. 控制反转(Inversion of Control)

该原则类似于依赖倒置原则,但适用于更广泛的背景。IoC反转了由不同的第三方框架(如Spring Framework)管理的控制流。与传统Java EE程序(由开发工程师按程序初始化Beans)不同,Spring控制Bean的配置,这意味着控制倒置。

4. 依赖注入(Dependency Injection)

该原则意味着依赖应该在运行时通过构造函数注入。在下面的例子中,Action Interface通过HumanAction Implementation注入到Human类中,从而决定在运行时实现哪个特定的动作。这种技术提供了控制依赖的灵活性:

package az.alizeynalli.di;

public interface Action {
    void do();
}

public class HumanAction implements Action {
 
    @Override
    public void do() {
        System.out.print("run");
    }
}

public class Human  {
     
    Action action;
     
    public Human(Action action) {
        this.action = action;
    }
 
    @Override
    public void do() {        
        actoin.do();        
    }
}

    public static void main(String[] args) {
        Human human = new Human(new HumanAction);
        human.do();
    }

5. 单一职责(Single Responsibility)

该原则的主要思想是限定软件系统的每个构建块只承担唯一的责任。无论构建块的作用域是什么,是插件、包、类、函数,甚至是变量,应该只有一个职责。这篇文章更深入的讨论了这一原则:

https://medium.com/p/6b886f6d943e

6. DRY(Don’t Repeat Yourself)

该原则旨在通过避免重复代码来消除冗余。如果存在针对某些行为的现有功能,则应该重复使用,而不是在多个实例中拷贝相同的代码片段。

每个知识片段在系统中都必须有单一、明确、权威的表示。

7. 开闭原则(Open-Closed)

软件构件应该对扩展开放,对修改关闭。

这一原理的简单描述首先是由Bertrand Meyer提出的。每次都需要修改的软件系统只会变得一团糟,并且这种混乱的程序很容易在每次修改时出现错误。每个新功能都应该最大限度的增加新代码,最小限度减少旧代码的更改,理想情况下对旧代码的更改为零。

8. 持久化透明(Persistence Ignorance)

持久化透明的理念是,代码应该不受任何数据库或持久性技术的影响。业务逻辑应该与任何技术无关。如果明天,有更好、更有效、更便宜的持久化技术,应该能够以不影响上层抽象的方式改变系统的这一部分。

9. YAGNI

You ain’t gonna need it. 这一原则试图避免软件系统的过早优化。开发人员通常会在系统中过度设计一些东西,以期在将来的某个时候会有帮助,但这一时刻往往不会到来。

10. 童子军规则(Boy Scout Rule)

在离开的时候要让露营地比来的时候更干净。

这里的主要思想是,当开发时遇到反模式,要坚持重构代码。随着时间的推移,这会提高代码质量。

11. 里氏替换原则(Liskov-Subsititution)

如果对于每个类型为S的对象o1,都有一个类型为T的对象o2,这样对于用T定义的所有程序P,当o1取代o2时,P的行为不变,那么S就是T的子类型。

Barbara Liskov的这个定义可能听起来很混乱,但本质上这个原则简单易懂。如果重述上面的定义,该原则的意思是: 在使用继承时,继承的层次结构应该在功能和业务逻辑方面保持一致。子类应该是可以相互替换的,并且不能改变父类的行为。作为一个简单的例子,可以用“臭名昭著的正方形/矩形”问题。其中正方形不应该是矩形的子类型,因为这两个几何形状的高度和长度的定义是不同的(正方形的高度和长度是相等的,而矩形的高度和长度是不同的)。

12. 封装(Encapsulation)

软件系统的不同构建块应该通过封装来限制外界对其组件的访问,可以通过在类范围内设置组件为私有或在插件范围内设置访问限制来实现(就Java而言),从而隐藏信息。

13. 松耦合(Loose Coupling)

软件架构中最重要的原则之一是松耦合,这一原则表明软件系统的依赖关系应该松散,系统的一部分发生变化,对其他部分的影响应该最小。松耦合可以通过依赖倒置、异步消息中间件、事件源等实现。下面的文章深入探讨了软件工程中不同形式的耦合:

https://medium.com/p/4d5cf2b3e99e

14. 内聚(Cohesion)

内聚是指模块内的元素依赖的程度。某种意义上说,是对类的方法和数据以及该类所服务的某种统一目的或概念之间关系强度的度量。

构建高内聚的类是一种最佳实践,有利于实现单一责任原则、松耦合等。

15. 接口隔离(Interface Segregation)

接口隔离原则指出,不应强迫客户端依赖不使用的方法。

应该明确的是,这个原则主要适用于静态类型的编程语言,如Java、C等。在像Python或Ruby这样的动态类型语言中,这个原则没有太大意义。

可以想象这样一种情况,我们的Income和Expense用例都依赖于支持这两种用例的业务逻辑功能。因此Income用例的很多依赖都和Expense用例相关,而Expense用例的依赖情况也有相同的问题。基于以上讨论,ISP违规情况如下:

package az.alizeynalli.cashflow.core.service;

public interface ConverterService {
    Income convertIncome(Income income);
    Expense convertExpense(Expense expense);
}

@Component
public class ExpenseConverterServiceImpl implements ConverterService {

    @Override
    public Income convertIncome(Income income) {
        throw new UnsupportedOperationException();
    }

    @Override
    public Expense convertExpense(Expense expense) {
        // convert expense here
        return expense;
    }
}

@Component
public class IncomeConverterServiceImpl implements ConverterService {

    @Override
    public Income convertIncome(Income income) {
        // convert income here
        return income;
    }

    @Override
    public Expense convertExpense(Expense expense) {
        
        throw new UnsupportedOperationException();
    }
}

16. 限界上下文(Bounded Context)

限界上下文是领域驱动设计的中心模式。通过将大型应用程序或组织分解为单独的概念模块,提供了一种处理复杂性的方法。每个概念模块代表一个上下文,该上下文与其他上下文分离(因此是有边界的),并且可以独立发展。理想情况下,每个限界上下文应该可以自由的为其中的概念选择自己的名称,并且应该独占的访问自己的持久化存储。

17. 依赖稳定原则(Stable Dependencies)

这一原则指出,软件系统的不同构建块应该只依赖于可靠、稳定的工件。这个原则在Docker镜像术语中更有意义,当我们从docker hub导入不同的依赖时,甚至不知道它们是否可靠/稳定。

18. 多态(Polymorphism)

这实际上属于面向对象编程的4大支柱,鼓励使用可以以多种形式提供的接口,多态性意味着具有多种形式的实体。

19. 模块化(Modularization)

模块化是将软件系统划分为多个独立模块的过程,每个模块独立工作。这一原则是应用于软件系统静态架构的单一职责分离原则的另一种形式。

20. 抽象(Abstraction)

这也属于面向对象编程的四大支柱:

在研究物体或系统时去除物理的、空间的或时间的细节或属性以集中注意力于更重要的部分,本质上与泛化过程相似。

21. KISS(Keep It Simple, Stupid)

按照字面意思理解,这一原则激励工程师保持代码简单和愚蠢(容易理解),避免他人误解。

22. 增量/迭代方法(Incremental/Iterative Approach)

这一原则是敏捷软件开发宣言的基础,基于软件系统应该以增量和迭代的方式开发的思想,每一次迭代都会增加系统功能并保证其运行。

23. 最少知识原则(Least Knowledge)

或者叫信息嫉妒(information envying),是封装或信息隐藏原则的另一个术语,规定软件系统的不同部分应该只拥有需要的知识。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

97bf98486b1c35f26aba2282d477c41c.png

已在知识星球更新源码解析如下:

9837a119bceb2e85ae0114f5e8122110.jpeg

b6b110605952f35cde9b945b6a31c361.jpeg

f93937272dfae8a9291cdfe8bb974d51.jpeg

57fa9371ee130cb4b9f0e1d33d1ee3ef.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
IPD(集成产品开发)管理之道 IPD,是集成产品开发(Integrated Product Development)的缩写,它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系,可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力,最终取得商业成功。IPD的思想最早来源于美国PRTM公司出版的《产品及生命周期优化法》一书中,该书详细描述了IPD模式所包含的各个方面。但IPD在中国的普及,源于IBM和华为的推行使用。IPD作为一套先进的产品研发管理模式,其成功的基础是功能部门和各团队之间的密切配合。 阅读详情

相关推荐

ECharts 实现世界地图

效果图 源代码(仅供参考) <template> <div class="echarts"> <div class="className" id="id" style="width: 100%; height: 450px" ref="myEchart" ></div> </div> </template> <script lang="ts"> imp

EsquireY的博客 4875

软件架构的 23 个基本原则

来源:DeepNoMind软件体系架构基于一组适用于各种软件系统的基本原则,有经验的架构师知道这些原则,并且能够在软件产品的正确位置实现特定的原则。下面我们快速浏览一下架构师日常遵循的基本原则。1. 依赖倒置(Dependency Inversion)这一原则表明依赖的方向应该是抽象的,而不是具体实现。如果编译时依赖在运行时执行的方向上流动,就形成了直接依赖。通过依赖倒置,可以反转依赖控制的方向。...

程序猿DD 423

win2012 r2 + IIS8.5 伪静态设置脚本映射

win2012 r2 + IIS8.5 伪静态设置脚本映射,网站用的.net fromwork 2.0 ,应用程序池设置了32位支持

xueking87的专栏 3241

软件架构的23个基本原则:构建稳健、可扩展的系统

软件架构是任何软件项目成功的关键。在软件工程领域,经过多年的研究和实践,已经总结出了许多宝贵的原则和模式,用以指导软件架构的设计。以下是软件架构的23个基本原则,这些原则涵盖了从设计模式到架构风格,从组件交互到系统集成的方方面面,旨在帮助软件工程师和架构师构建更加稳健、可扩展的系统。当然,每个项目都有其独特的需求和约束,因此在实际应用中,需要根据具体情况灵活运用这些原则,以达到最佳的设计效果。在设计和构建软件系统时,将这些原则作为指南,可以有效地避免常见的架构陷阱,提高系统的整体质量。

心猿意码 793

STM32CubeMX Nucleo F767ZI 教程(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod

fafuwxm 2029

添加odbc数据源时的一些问题和解决办法

pl/sql

Mr_Syh的博客 9644

Java23种设计模式和六大设计原则(附视频)

1、设计模式的六大原则 ☛开闭原则 对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 ☛里氏代换原则 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的...

weixin_30414635的博客 123

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 443

Android架构进阶(二)—— 面向对象设计原则与23种设计模式

面向对象设计原则与23种设计模式——Android架构进阶(二) 文章目录面向对象设计原则与23种设计模式——Android架构进阶(二)面向对象7个基本原则23种设计模式创建型模式结构型模式行为型模式 近期在封装架构的时候,总觉得有些东西直接用显得不够高端,所以纵向适度封装一下,这个时候我就想到了使用设计模式去封装,但是总觉得怕自己掌握的设计模式不够精髓,所以重新学习一下 面向对象7个基本原...

AndroidDeveloperHoly的博客 284

在 SAP S/4HANA 本地部署和私有云里预览 RAP Travel App:为什么 ADT 发不出去,以及如何用 /IWFND/V4_ADMIN 正确发布 OData V4 Service

在SAP S/4HANA On-Premise/Private Cloud环境中,通过ADT直接发布RAP服务的本地端点常会失效。这是因为系统治理策略要求必须通过SAP Gateway Foundation(事务码/IWFND/V4_ADMIN)发布Service Group,而非开发者本机测试模式。本文详解了该流程的必要性:Service Group是OData V4服务的发布单元,涉及后端登记(/IWBEP/V4_ADMIN)和前端发布(/IWFND/V4_ADMIN)两个环节。提供了从ADT跳转SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 269

Ubuntu22.04安装ros(一键搞定)

然后发现可以一键安装,话不多说,直接终端输入如下指令。回车之后系统会自动安装ros。

m0_47313541的博客 7413

一篇学懂23种设计模式

设计模式是在软件设计过程中针对一般问题的可重用解决方案。它们是经过验证的、可适应的、可重用的解决方案,而不是可以转换为代码的具体设计。

懵萌长颈鹿的博客 741

AI大模型探索之路-实战篇4:深入DB-GPT数据应用开发框架调研

在当今的人工智能时代,大模型技术的迅猛发展为各行各业带来了前所未有的变革。这些大模型,以其强大的语言理解和生成能力,正在逐步成为智能化应用的核心。然而,如何高效地利用这些大模型,构建出满足各种需求的应用,仍然是一个具有挑战性的问题。DB-GPT,作为一个开源的AI原生数据应用开发框架,应运而生,旨在简化大模型应用的开发过程,让构建智能化应用变得触手可及。本文将深入介绍DB-GPT的核心功能、关键特性,并通过实战操作,展示如何利用DB-GPT进行数据应用开发。DB-GPT是一个开源的AI原生数据应用开发框架。

寻道AI,探索AI无限可能! 1万+

设计模式-01-模糊理解

  一、概念:      设计模式,别人都说它们就像是一个个的模型胚子,不管你们是多么的杂乱无章,只要经过它们的改造,表现出来的就都会是工工整整,标标准准的。而我觉得更确切的比喻应该是像一个制砖块儿的模具,虽然我们不知道为什么砖块儿,不仅要结实,也要外表光滑才能称为一块儿好砖头。但是我却知道只有砖块儿 的模具首先光滑了,才行。所以我们必须拥有制砖模具,而且种类也要多,虽然网上说 的是23种,但...

atphumengwen的专栏 180

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

软件设计模式

设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。1977 年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。

qq_56751933的博客 238

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

软件架构的30条原则

基本原则 原则 1: KISS (Keep it simple, stupid)  “指设计时要坚持简约原则,避免不必要的复杂化。” 其思想是使用最简单的解决方案来完成这项工作。   原则 2: YAGNI (You aren’t gonna need it) — 在确定需要之前不要构建它。   原则 3: Crawl, walk, run. 换句话说,先让它工作,然后再让它变得更好,最...

家园 623

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

软件架构设计的六大原则

1. 单一职责原则(Single Responsibility Principle - SRP) 原文:There should never be more than one reason for a class to change. 译文:永远不应该有多于一个原因来改变某个类。 理解:对于一个类而言,应该仅有一个引起它变化的原因。说白了就是,不同的类具备不同的职责,各施其责。这就好比一个团队,大家分工协作,互不影响,各做各的事情。 应用:当我们做系统设计时,如果发现有一个类拥有了两种的职责,那就问

bcsj1199的博客 443

软件架构设计的五大原则简析

软件架构设计的六大原则简析 在软件以及系统的设计中,有人简单的认为,我编程很厉害,所以架构设计我没问题,但实际操作的过程中,常常会一团乱麻,而实际的架构设计工作中还是遵循 六大原则,有时候也会有原则会相互冲突。下面简单的说说六大设计原则,以及延升的原则,如果面试问道,先说六大原则,如果还想扩展,那就自己实际开发过程理解。 1. 单一职责原则(Single Responsibility Principle - SRP) 原文:There should never be more than one re

liuyong0507的博客 1454

软件架构原则

软件架构设计原则 基本原则 原则1: KISS (Keep it simple,sutpid) 和保持每件事情都尽可能的简单,用最简单的解决方案来解决问题。 原则2: YAGNI(你不需要它)原则 ,只在需要时构建 原则3: 先学会爬,然后再学会走,最后学会跑。换句话说,先保证能够正常运行,然后优化它使其更好,最后逐渐让它变得完美。使用迭代开发,采用敏捷开发模式。为每个功能制定一个...

博学而笃志,切问而近思 670

软件架构设计的6大原则

云潇洒 少说话 多做事 软件架构设计学习总结(23):软件架构设计的6大原则 1. 单一职责原则(Single Responsibility Principle - SRP) 原文:There should never be more than one reason for a class to change. 译文:永远不应该有多于一个原因来改变某个类。 理解:对于一个类而言...

Sunshine 302

《C++23模块化编程革命零开销原则下的现代软件架构重构》

例如,模板实例化仅在需要时触发,并与模块的导入范围严格关联,避免全局展开带来的运行时开销。- 模块化微服务:将独立功能封装为子模块(如`Networking`、`UI`),实现组件化开发,符合现代微服务架构对独立部署与热更新的需求。- 降低构建系统的复杂度:传统的`include`路径管理被模块命名空间替代,CMake等工具可直接操作模块,减少构建依赖的推测性分析。- 模块元编程的支持:模块作为编译时“符号容器”,可结合C++23的`consteval`函数,推动更强大的编译期计算。

PemGvDdt的博客 365
上一篇: 浅谈分布式存储之 Raft
下一篇: 瞧瞧人家写的API接口代码,那叫一个优雅!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值