解耦的艺术_应用架构中的解耦

news2025/2/24 2:39:33

文章目录

  • Pre
  • 解耦的技术演化
  • 应用架构中的解耦
  • 小结

在这里插入图片描述

Pre

解耦的艺术_通过DPI依赖倒置实现解耦

解耦的艺术_通过中间层映射实现解耦


解耦的技术演化

技术的演化史,也是一部解耦的历史。从最初的面向对象编程(OOP)到Spring框架的依赖注入,再到分布式架构中的微服务,技术的每一次进步都伴随着解耦的推进。

  • 原始社会:最初的编程往往是“高耦合”的,创建对象的过程没有解耦机制,每个对象都由开发人员手动管理。

    UserService userService = new UserService(); // 直接依赖UserService
    
  • 工业社会:随着工厂模式(Factory Pattern)的引入,开发人员不再自己创建对象,而是通过工厂来进行管理,帮助我们将对象的创建和使用分离,完成了初步的解耦

    UserServiceFactory factory = new UserServiceFactory();
    UserService userService = factory.createUserService();
    
  • 共产主义社会:随着依赖注入(DI)技术的普及,特别是Spring框架的引入,解耦进一步得到提升。应用不再关心如何创建对象,而是通过依赖注入由框架自动管理对象的生命周期和依赖关系

    @Service
    	public class BusinessService {
    	    @Autowired
    	    private UserService userService;
    	    
    	    // 业务逻辑...
    	}
    
  • 分布式时代:随着分布式系统的崛起,RPC技术解决了系统之间的通信问题,但仍面临着技术依赖的问题。Web Service和RESTful架构的出现,则进一步降低了分布式系统中的耦合度,支持平台无关和语言无关的服务调用。


应用架构中的解耦

Robert C.Martin在其博客文章“The Clean Architecture”中提出的观点:应用架构之道,就是要实现业务逻辑和技术细节的解耦

不管是六边形架构、洋葱圈架构,还是COLA架构,其核心要义都是做核心业务逻辑和技术细节的分离和解耦。

试想,如果业务逻辑和技术细节杂糅在一起,将所有的代码都写在ServiceImpl中,前几行代码负责validation,接下来几行代码负责convert,然后是几行业务逻辑代码,之后我们需要通过RPC或DAO获取更多的数据,拿到数据后,又是几行convert的代码,再接上一段业务逻辑代码,最后还要落库、发消息,等等。按照上面这种写代码的方式,再简单的业务都会变得复杂且难以维护

COLA 1.0

在这里插入图片描述
让领域层(Domain Layer)对基础设施层(Infrastructure Layer)进行直接依赖比较方便,而且似乎也没什么大问题.

然而实际上,这种“偷懒”的行为有悖于框架设计的初衷,因为在设计之初,我们就希望领域层是应用的核心,类似于洋葱圈架构所提倡的——让领域层处于架构的中心位置,即洋葱圈最核心的部分。也就是说,领域层不应该依赖基础设施层,相反地,应该让基础设施层依赖于领域层。

如果让领域层依赖基础设施层,会“污染”领域层的纯粹性,影响其独立性和可测试性。也就是说,层次之间不再是正交的了,基础设施层的任何变动都可能影响到领域层,而这不是我们想看到的。

COLA 2.0

COLA 2.0时,特意使用依赖倒置反转了领域层和基础设施层的依赖关系.

在这里插入图片描述
COLA 2.0的核心变化是领域层不再直接依赖基础设施层,而是通过一个新的抽象Gateway(网关)对领域层和基础设施层进行了解耦,这两个层次不再彼此依赖、彼此耦合,而是都依赖于Gateway .

举个例子,假如某个应用中需要用到类目(Category)这个实体,但是类目又不在本域中,需要通过一个RPC调用才能获取相应的信息。那么这时我们就可以在领域层中定义一个类目网关(CategoryGateway),这是一个纯抽象的概念

public interface CategoryGateway{
	Category getCategoryById(Long categoryId);

}

这个抽象相当于告诉基础设施层:你需要按照这个接口来提供数据。至于这个数据是如何被获取、被组装、被转换的,都是基础设施层需要关心的事情,不再需要领域层去关心.

综上,通过依赖倒置方式,我们倒置了领域层和基础设施层的依赖关系,让两个模块从原来的依赖关系变成了正交关系,两者可以独立地改动和变化,而不会影响到另一方。

例如,要想让类目信息的获取从RPC变成本地数据库调用,那么我们只需要修改基础设施层的代码即可,领域层可以完全不动。同理,如果在领域层有关于类目的业务变化,比如原来需要通过三级类目去判断同类品的逻辑,现在要放宽到二级类目,这种变化也不会影响到基础设施层的代码


小结

  • “高内聚、低耦合”是软件设计追求的重要目标之一,组件、模块、层次设计都应该遵循“高内聚、低耦合”的设计原则。
  • 正交的关键在于如何识别耦合性,我们可以通过识别系统需要扩展的地方来识别耦合性。比如,关于配置系统的设计不应该耦合于某一种特定的实现方式,而是应该更灵活一些。
  • 解耦主要有依赖倒置和中间层映射两种方式。
  • 我们要尽可能多地依赖抽象而不是具体,这能使系统更灵活,这种编程方式也叫作面向接口编程。
  • “计算机中的任何问题,都可以通过加一层来解决”,中间层的价值也在于解耦。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Winform(C#) 项目保存页面

上一张我们已经实现了TCP和串口页面的数据展示,和保存控件 我们这一章,实现如何去,控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…

LangChain-基础(prompts、序列化、流式输出、自定义输出)

LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的,它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题,解决这个问题有2种解决方案 基于现有的大模型上进行微调,使得它能适应这些问题(本…

蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级

2月22日,蓝思科技宣布与AI交互领军企业杭州灵伴科技(Rokid)达成深度战略合作,通过整机组装与全产业链整合,为2025年全球AI眼镜出货量爆发式增长(预计达400万-1200万台)提供核心支撑。 双方合作通…

2025前端框架最新组件解析与实战技巧:Vue与React的革新之路

作者:飞天大河豚 引言 2025年的前端开发领域,Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化,两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…

零基础学QT、C++(六)制作桌面摄像头软件

目录 一、前言 二、Python项目包 三、C项目包 四、 项目说明 五、结语 章节汇总 一、前言 上一节,成功导入了OpenCV库 零基础学QT、C(四)QT程序打包-CSDN博客文章浏览阅读1.1k次,点赞29次,收藏23次。QT程序打包。将项…

python-leetcode-回文链表

234. 回文链表 - 力扣(LeetCode) # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def isPalindrome(self, head: Optional[Lis…

虚拟机从零实现机器人控制

1. 系统安装 因Docker不适合需要图形界面的开发,因此使用虚拟机VMware方便可视化界面方式查看效果,相关软件可以从官网下载,这里有一整套免费安装文件百度网盘地址: 2. ROS安装 Ubuntu 22.04:https://docs.ros.org…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言:****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

Unity 聊天气泡根据文本内容适配

第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置:(0,1) 对齐方式:左上对齐 3、设置文本pivot位置和对齐方式,并挂上布局组件 pivot设置和对齐方式和底图一样&#…

Android Studio安装配置及运行

一、下载Android Studio 官网下载:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面,选择同意条款,并点击下载,如图: 二、详细安装 双击下载的文件 三、配置Android Studio …

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…

基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室

开源项目 botgroup.chat 介绍 AI 多人聊天室: 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用,支持多个 AI 角色同时参与对话,提供类似群聊的交互体验。体验地址:https://botgroup.chat 开源仓库&#x…

【电机控制器】ESP32-C3语言模型——豆包

【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…

Flask实现高效日志记录模块

目录 一. 简介&#xff1a; 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建&#xff08;包含日志记录的关键字段&#xff09; 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…

基于python深度学习遥感影像地物分类与目标识别、分割

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

Spring有哪些缺点?

大家好&#xff0c;我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助&#xff1b; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架是一个广泛使用的企业级Java开发框架&#xff0c;提供了丰富的功能和强大的灵…

linux学习【7】Sourc Insight 4.0设置+操作

目录 1.Source Insight是什么&#xff1f;2.需要哪些配置&#xff1f;3.怎么新建项目4.一些问题的解决1.中文乱码问题 5.常规使用1. 在工程中打开文件2. 在文件中查看函数或变量的定义3. 查找函数或变量的引用4. 快捷键 按照这个设置就可以了&#xff0c;下面的设置会标明设置理…

PHP2(WEB)

##解题思路 打开页面什么线索都没有&#xff0c;目录扫描只是扫出来一个index.php&#xff0c;而源代码没有东西&#xff0c;且/robots.txt是不允许访问的 于是一番查询后发现&#xff0c;有个index.phps的文件路径&#xff0c;里头写着一段php的逻辑&#xff0c;对url的id参数…

Halcon 3D加快表面匹配速度

文章目录 gen_box_object_model_3d 创建一个代表盒子的 3D 物体模型write_surface_model — 将表面模型写入文件read_surface_model — 将表面模型读取prepare_object_model_3d - 为某个操作准备三维对象模型select_points_object_model_3d - 对 3D 物体模型的属性应用阈值。se…

Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具

Ollama 本地GUI客户端&#xff1a;为DeepSeek用户量身定制的智能模型管理与交互工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xf…