使用git submodule解决高耦合度问题

引言

在开发我的笔记系统时,我遇到了一个问题。问题是,在api-gate服务中,我需要验证用户的access_code,但是access_code的生成逻辑是在auth2服务中实现的。这个问题从架构设计的层面上看,就是一个高耦合度问题。高耦合度会给代码的扩展代码麻烦,并给未来的系统维护带来隐患。

问题分析和解决

对于这个问题,我想第一个想到的是,将相关的代码抽出为一个模块,然后两边同时引用这个模块。但是评估了一下,这样做稍微麻烦了一些,因为我只想共享代码段,因此,最后我想到了git submodule命令。
在这里插入图片描述
即创建一个新的git仓库,将共享的代码块放在新的git仓库中,例如,上图的notes_redis_helper。然后再回到api-gate和auth2这两个git的本地仓库,通过git submodule add命令,将notes_redis_helper添加到本地仓库中。从而实现了代码段的共享。

git submodule 命令的优势

  • 代码复用:Git Submodule允许将一个Git仓库作为子模块引入到另一个Git仓库中,使得可以在多个项目中共享和复用代码。这样可以避免重复编写相同的代码,提高开发效率。

  • 独立维护:每个子模块都是独立的Git仓库,有独立的版本控制。这意味着可以在子模块中独立进行开发、提交和发布,而不影响主项目的开发和维护。这样可以更好地组织和管理代码,减少耦合性。

  • 版本控制:Git Submodule可以确保子模块和主项目之间的版本控制保持一致。当子模块的代码发生变化时,可以通过更新子模块来更新主项目中引用的代码。这样可以更好地管理和跟踪代码的变化。

  • 逻辑清晰:通过使用Git Submodule,可以将功能相关的代码组织在一起,使得项目的逻辑更加清晰和易于理解。每个子模块都可以专注于特定的功能或模块,有助于减少代码的复杂性和维护成本。

  • 并行开发:使用Git Submodule可以实现并行开发,不同的团队可以独立地开发和维护各自的子模块。这样可以提高团队的协作效率,加快项目的开发速度。
    (这一节内容为AI创作)

操作步骤

  1. 创建一个独立仓库,并将代码重构到这个仓库中,例如:git@gitee.com:hanshu_alan/notes_redis_helper.git。需要注意的是,我们这里实际上是代码段级别的共享,因此这个仓库不需要通过cargo new --lib 来初始化。
  2. 进入api-gate项目的src目录,运行git submodule add等命令。
git submodule add git@gitee.com:hanshu_alan/notes_redis_helper.git
git submodule init
git submodule update
  1. 进入auth2项目的src 目录,重复步骤2的操作。

使用体验

比正常情况要稍微麻烦一点,比如,我在api-gate本地仓库的目录下修改notes_redis_helper,那么操作步骤如下:

cd notes_redis_helper # 进入notes_redis_helper
git commit . -m changes
cd .. # 返回api-gate本地仓库
git commit . -m changes # 提交api-gate仓库的修改,实际上就是提交notes_redis_helper的当前commit id
git push
cd ../../auth2 # 进入auth2 本地仓库
cd src/notes_redis_helper  # 进入notes_redis_helper仓库
git pull
cd ..
git commit . -m # 提交auth2的修改,因为这时notes_redis_helper的最新commit id已经改变
git push

上面的代码来至于我的开源项目https://gitee.com/hanshu_alan
这篇文章收录我的Rust-实战专栏。请关注我,不要错过更新哟。

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

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

相关文章

大数据 - Doris系列《三》- 数据表设计之表的基本概念

目录 🐶3.1 字段类型 🐶3.2 表的基本概念 3.2.1 Row & Column 3.2.2 分区与分桶 🥙3.2.2.1 Partition 1. Range 分区 2. List 分区 进阶:复合分区与单分区的选择 3.2.3 PROPERTIES 🥙3.2.3.1 分片副本数 &#x1f…

《微信小程序开发从入门到实战》学习七十八

6.10 录音API 6.10.2 音频输入源PI 使用wx.getAvaliableAudioSources可获取当前支持的音频输入源,自基础库2.1.0开始支持。示例代码如下: wx.getAvaliableAudioSources({ success(res){ console.log(res.audioSources) } }) res.audioSources是一个数…

windows或mac端口转发

摘要 在内网开发中,由于出于公司安全考虑,部分IP192.168.0.100访问只能针对固定IP192.168.0.200开放,此时我需要通过我的电脑192.168.0.300去访问,由于未对我电脑IP192.168.0.300授权,导致我访问不到,此时…

wget 报错: certificate is not trusted

使用 wget 下载 https 开头的域名时报错,可以加上 --no-check-certificate (不检查证书)选项 wget --no-check-certificate https://pypi.python.org/packages/88/79170963/IPy-0.83.tar.gz[Ref] 解决wget下载https时报错 --no-check-certificate (不检查证书)

POSTGRESQL中ON CONFLICT的使用

在 PostgreSQL 中,ON CONFLICT 子句是用在 INSERT 语句中的一种机制,它可以帮助你处理当插入操作遇到违反唯一性约束(比如唯一索引或主键约束)时的情况。使用 ON CONFLICT 子句,你可以指定当违反唯一性约束时应该采取的…

正则表达式、文件访问(Python实现)

一、主要目的: 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…

【小白专用】C# 连接 MySQL 数据库

C# – Mysql 数据库连接 1. 配置环境 #前提:电脑已安装Mysql服务; Visual Studio 安装Mysql依赖库: 工具 -> NuGet 包管理器 -> 管理解决方案的 NuGet程序包 —> 搜索, 安装Mysql.Data (Oracle); (安装成功后&…

常用的网站

PIXEL MOTION 注册-YesPMP平台 模型下载 - Ourblender - 专业的三维素材库 Vega AI 创作平台 夏沫的AI小站 Tripo AI B站视频下载工具 | 极简纯净

【vba】获取所在单元格,将所有sheet对应的单元格的值相加,并输入该单元格

统一计算当前单元格的所有sheet相加的值,因为导出每堂课的点名名单,对每堂课被点名的学生的分数进行一个求和,两种方式单个、多个。 单个单元格处理 Sub SumValuesAcrossSheets()Dim currentCell As RangeDim total As DoubleDim ws As Work…

视频监控录像服务器(中心录像服务器)功能详细介绍

目 录 一、概述 (一)定义 (二)视频监控中心录像服务器 二、存储策略服务 (一)存储策略配置 1、 录入页面 2、 选择需要进行录像的视频 3、批量选择多个通道号 4、其他关键参数…

js_BOMDomAjax

总结 讲解自定义对象 在ES5中没有像Java中一样专门的class关键字定义类(ES6中可以用class定义类),所以在ES5中创建类其实和创建函数是一样的语法: function 对象名/类名/方法名(){ }一种语法代表了多重含义,在JavaScript中若想…

rime中州韵小狼毫 敏感词脱敏滤镜

快速录入,是任何一个输入法,以及输入人员(无论是否专业)的追求目标之一。现实中,由于各种输入法在录入文本时,都无法完全避免重码的问题,所以在输入过程中都或多或少的需要进行选字/选词操作。这…

Redis不同环境缓存同一条数据,数据内部值不同

背景 现实中,本地环境(dev)和开发环境(feature)会共同使用相同的中间件(本篇拿Redis举例),对于不同环境中的,图片、视频、语音等资源类型的预览地址url,需要配…

【C#】使用 LINQ 中的 Skip() 和 Take()进行分页,为什么要分页,分页作用是什么

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是是《C#》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握…

Java gson反序列化时,Json字符串中含有浮点类型(0.000001)时,在反序列化转换成Map时,会变成科学记数法

1、背景 已运行的大型项目中,字符串转Map使用Gson工具类进行转换,不敢贸然使用其它工具类(如FastJson),这是前提。 如果你是学习或者小型项目,Gson使用出现浮点转换科学记数法的问题,可以换成F…

mysql定时备份shell脚本和还原

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言数据库备份分类mysqldump命令备份计划1.每日备份,保留30天备份文件2.每月1号备份,保留12个月备份文件 定时调度还原总结 前言 数据库备…

(实战)静默dbca安装创建数据库 --参数说明+举例

--静默安装创建pdb数据库 dbca help dbca -silent help dbca -silent -createDatabase help --实测语句: 1.pdb dbca -silent -createDatabase -templateName General_Purpose.dbc \ -responseFile NO_VALUE \ -gdbname orcl -sid orcl \ -createAsContainerDatabase true \ -…

springboot(ssm宠物商城网站 在线电商系统 Java系统

springboot(ssm宠物商城网站 在线电商系统 Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0) 数据库…

创建并美化Github主页(内含组件)

目录 1、创建仓库 2、美化 1、包含多种 2、活动统计图 3、资料奖杯 4、文字的打字特效 5、中文网站卡片 6、贪吃蛇贡献图 7、可参考的页面 最近有想要写开源的打算了,计划了好久好久好久,不知道写啥(目前仍然不知道)…… 俗话说人活一张脸&#xff0…

Linux安装RabbitMq明白纸(无图)

Linux安装RabbitMq步骤 安装环境Erlang和RabbitMQ版本对照安装包下载地址登录Linux服务器创建安装目录将之前下载的两个rpm文件上传到这个目录下,并解压安装Erlang安装完成后,查看Erlang版本安装socat(RabbitMq安装需要这个)解压并…