您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

软件架构的23个基本原则

时间:2022-12-13 11:45:18  来源:  作者: IT架构师联盟

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

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 {@Overridepublic void do() {System.out.print("run");}}
public class Human {Action action;public Human(Action action) {this.action = action;}@Overridepublic 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/ target=_blank class=infotextkey>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);}
@Componentpublic class ExpenseConverterServiceImpl implements ConverterService {
@Overridepublic Income convertIncome(Income income) {throw new UnsupportedOperationException();}
@Overridepublic Expense convertExpense(Expense expense) {// convert expense herereturn expense;}}
@Componentpublic class IncomeConverterServiceImpl implements ConverterService {
@Overridepublic Income convertIncome(Income income) {// convert income herereturn income;}
@Overridepublic 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),是封装或信息隐藏原则的另一个术语,规定软件系统的不同部分应该只拥有需要的知识。



Tags:架构   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
美团外卖宣布新一轮组织架构调整:提拔多位年轻管理者,年轻化、扁平化成主基调
新浪科技讯 4月11日上午消息,继2月下旬、3月下旬两轮人员调整后,美团到店到家的组织架构调整仍在继续。近日,美团外卖以内部邮件的方式宣布了新一轮的组织调整:外卖事业部下成立...【详细内容】
2024-04-11  Search: 架构  点击:(4)  评论:(0)  加入收藏
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  Search: 架构  点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27  Search: 架构  点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  Search: 架构  点击:(10)  评论:(0)  加入收藏
京东小程序数据中心架构设计与最佳实践
一、京东小程序是什么京东小程序平台能够提供开放、安全的产品,成为品牌开发者链接京东内部核心产品的桥梁,致力于服务每一个信任我们的外部开发者,为不同开发能力的品牌商家提...【详细内容】
2024-03-27  Search: 架构  点击:(13)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: 架构  点击:(25)  评论:(0)  加入收藏
全程回顾黄仁勋GTC演讲:Blackwell架构B200芯片登场
北京时间3月19日4时-6时,英伟达创始人黄仁勋在美国加州圣何塞SAP中心登台,发表GTC 2024的主题演讲《见证AI的变革时刻》。鉴于过去一年多时间里AI带来的生产力变革,以及英伟达...【详细内容】
2024-03-19  Search: 架构  点击:(17)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13  Search: 架构  点击:(6)  评论:(0)  加入收藏
有了LLM,所有程序员都将转变为架构师?
编译 | 言征 出品 | 51CTO技术栈(微信号:blog51cto)生成式人工智能是否会取代人类程序员?可能不会。但使用生成式人工智能的人类可能会,可惜的是,现在还不是时候。目前,我们正在见...【详细内容】
2024-03-07  Search: 架构  点击:(19)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  Search: 架构  点击:(36)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(12)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(19)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(119)  评论:(0)  加入收藏
站内最新
站内热门
站内头条