外贸行业网站建设/搜索网站关键词

外贸行业网站建设,搜索网站关键词,展厅效果图网站,福建省网站建设方案书文章目录 Pre解耦的技术演化应用架构中的解耦小结 Pre 解耦的艺术_通过DPI依赖倒置实现解耦 解耦的艺术_通过中间层映射实现解耦 解耦的技术演化 技术的演化史,也是一部解耦的历史。从最初的面向对象编程(OOP)到Spring框架的依赖注入&…

文章目录

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

在这里插入图片描述

Pre

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

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


解耦的技术演化

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

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

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

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

    @Servicepublic class BusinessService {@Autowiredprivate 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.mzph.cn/pingmian/70450.shtml

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

相关文章

机器学习实战(5):决策树与随机森林——直观的分类与回归方法

第5集:决策树与随机森林——直观的分类与回归方法 在机器学习中,决策树(Decision Tree) 和 随机森林(Random Forest) 是两种直观且强大的算法,广泛应用于分类和回归任务。决策树通过一系列规则…

网站中内嵌腾讯元宝用deepseek

网站中内嵌元宝deepseek <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>BING搜</title> <meta name="description" content="不用学习就G搜索高级语法,即选即用…

draw.io:开源款白板/图表绘制利器

在工作和学习中&#xff0c;我们常常需要绘制各种图表&#xff0c;例如流程图、思维导图、网络拓扑图等等。一款功能强大且易于上手的图表绘制工具可以极大地提高我们的效率。今天&#xff0c;我要向大家推荐一款开源免费的图表绘制工具—— draw.io&#xff0c;并手把手教你如…

基于eBPF的全栈可观测性系统:重新定义云原生环境诊断范式

引言&#xff1a;突破传统APM的性能桎梏 某头部电商平台采用eBPF重构可观测体系后&#xff0c;生产环境指标采集性能提升327倍&#xff1a;百万QPS场景下传统代理模式CPU占用达63%&#xff0c;而eBPF直采方案仅消耗0.9%内核资源。核心业务的全链路追踪时延从900μs降至18μs&a…

图解MySQL【日志】——Binlog

Binlog&#xff08;Binary Log&#xff0c;归档日志&#xff09; 为什么需要 Binlog&#xff1f; Binlog 是 MySQL 中的二进制日志&#xff0c;用于记录数据库的所有写操作&#xff08;INSERT、UPDATE、DELETE 等&#xff09; 1. 主从复制 作用&#xff1a;是 MySQL 主从复…

进程的介绍--进程状态/切换

1.冯 • 诺依曼体系结构 1.1 体系结构 冯•诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯•诺依曼提出了计算机制造的三个基本原则&#xff0c;即采用二进制逻辑、程序存储执行以及计算机由五个部分组成&#x…

Python开源项目月排行 2025年1月

#2025年1月2025年2月2日1DeepSeek-R1当红炸子鸡&#xff0c;国人之骄傲&#xff01;项目于 2025 年 1 月 20 日正式发布。早期的预览版&#xff08;如 DeepSeek-R1-Lite-Preview&#xff09;则在 2024 年 11 月 20 日亮相。 用途&#xff1a;DeepSeek-R1 是一个开源的推理模型&…

yolov8改进:efficientViT替换YOLOV8主干网络结构

6.1 efficientViT替换YOLOV8主干网络结构 6.1.1 effivientvit EfficientViT 的架构特点 EfficientViT 是一种结合了 Transformer 和卷积网络优点的轻量级模型&#xff0c;它的设计目标是高效地提取图像特征&#xff0c;同时减少计算量。以下是它的关键组成部分&#xff1a; …

Android Studio安装配置及运行

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

OpenHarmony分布式数据管理子系统

OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化&#xff0c;以及跨设备之间数据的同步、…

智能算法如何优化数字内容体验的个性化推荐效果

内容概要 在数字内容体验的优化过程中&#xff0c;个性化推荐系统的核心价值在于通过数据驱动的技术手段&#xff0c;将用户需求与内容资源进行高效匹配。系统首先基于用户行为轨迹分析&#xff0c;捕捉包括点击频次、停留时长、交互路径等关键指标&#xff0c;形成对用户兴趣…

超简单理解KMP算法(最长公共前后缀next数组、合并主子串、子串偏移法)

KMP算法理解 最长公共前后缀next合并主子串子串偏移 参考b站&#xff1a;子串偏移、合并主子串 最长公共前后缀next 这个概念是一个trick&#xff0c;帮助我们记录遍历了一遍的数组的相似特性&#xff0c;想出来确实很nb&#xff0c;我也不理解逻辑是怎么想出来的。 字符串的…

github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新

1.github上新建一个repository 设置为private tips删除在这 点setting 然后往下拖动 会有个这里是用来删项目的 2.另外 一台电脑拉取这个repository的时候 需要配置 一个ssh key 这个key的内容生成参考本地电脑的生成 然后在这配置 2.1 生成 SSH 密钥&#xff08;如果还没有…

LangChain 技术入门指南:探索语言模型的无限可能

在当今的技术领域&#xff0c;LangChain 正逐渐崭露头角&#xff0c;成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术&#xff0c;那么就跟随本文一起开启 LangChain 的入门之旅吧&#xff01; (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…

小米手环7屏幕脱胶维修

前言 本文仅用于记录维修过程&#xff0c;如有不对请指出&#xff0c;非常感谢&#xff01; 参考视频 https://www.bilibili.com/video/BV1wV4y1H71N/?vd_sourcec887ed704029330114b8b207d8164686 胶水链接 常见的T-8000胶水&#xff0c;随便挑了一个送皮筋的 https://d…

自注意力机制和CNN的区别

CNN&#xff1a;一种只能在固定感受野范围内进行关注的自注意力机制。​CNN是自注意力的简化版本。自注意力&#xff1a;具有可学习感受野的CNN。自注意力是CNN的复杂形态&#xff0c;是更灵活的CNN&#xff0c;经过某些设计就可以变为CNN。 越灵活、越大的模型&#xff0c;需要…

上帝之眼——nmap

nmap介绍 Nmap&#xff08;网络映射器&#xff09;是一款广受欢迎的网络探测和安全评估工具&#xff0c;被誉为“上帝之眼”。它以其强大的扫描功能和广泛的应用场景&#xff0c;成为系统管理员和安全专家手中的得力助手。本文将对Nmap进行详细介绍&#xff0c;包括其优点、基本…

Spring Boot 整合 log4j2 日志配置教程

文章目录 前言一、常用日志框架二、配置参数介绍 1. 日志级别2. 输出形式3. 日志格式 3.1 PatternLayout 自定义日志布局 三、Log4j2 配置详解 1. 根节点 Configuration2. Appenders 节点 2.1 Console 节点2.2 File 节点2.3 RollingFile 节点 2.3.1 ThresholdFilter 节点2.3.…

MySQL八股学习笔记

文章目录 一、MySQL结构1.宏观结构1.1.Server层1.2.存储引擎层 2.建立链接-连接器3.查询缓存4.解析SQL-解析器&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析 5.执行SQL5.1.预处理器 prepare5.2.优化器 optimize5.3.执行器 execute&#xff08;1&#xf…

leetcode876.链表的中间结点

目录 问题描述示例提示 具体思路思路一 代码实现 问题描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 题目链接&#xff1a;链表的中间结点 示例 提示 链表的结点数范围是 [1, 100]   1 &…