利用依赖结构矩阵管理架构债务

news2024/12/23 8:54:39

本文讨论了如何利用依赖结构矩阵(DSM,Dependency Structure Matrix)管理和识别架构债务,并通过示例应用展示了这一过程。原文: Managing Architecture Debt with Dependency Structure Matrix

Vlado Paunovic @Unsplash
Vlado Paunovic @Unsplash

技术债务(Technical Debt)是软件开发的热门话题,随着时间推移,源代码逐渐增多,技术债务也变得越来越复杂。有很多分析技术债务的工具,基本上都专注于代码质量。架构债务是技术债务的一部分,但由于没有像技术债务那样的自动化工具,因此并不容易确定。

在确定架构债务时,应研究与源代码耦合的"架构反模式"。以下是需要确定和消除的常见架构反模式:

  • 不稳定接口:这些接口通常是系统的应用程序接口或入口点,有许多依赖组件,接口的微小改动都会让所有依赖组件头疼不已。
  • 违反模块化原则:软件系统应采用模块化架构。这意味着可变更组件应架构在同一模块中,以避免模块间的依赖。如果一个模块的变化对其他模块产生了巨大影响,就应该研究这一不稳定的根本原因。
  • 不健康的继承:当超类依赖于子类或调用者类依赖于超类和子类实例时,就会出现这种情况。
  • 循环依赖:例如,当组件 A 依赖于组件 B,而组件 B 又依赖于组件 C,组件 C 又依赖于组件 A,就产生了循环依赖。这种情况应通过"依赖倒置原则(Dependency Inversion Principle)"加以避免。
  • 软件包循环:多个软件包或插件混乱的相互依赖,而不是形成等级依赖关系。
  • 交叉:依赖于多个其他类的上帝类,另一方面,众多不同的类又依赖于这个特定的类。

为了避免这些架构反模式,软件架构师应考虑实施 S.O.L.I.D.原则、GoF 设计模式、耦合原则/组件原则。

下面是示例性现金流 Spring Boot 应用的 UML,可以在 git 仓库[1]中查看源代码。如你所见,该项目由三个基础包构成:apicoredatabase,采用分层模式。api负责向外部调用者公开restful API,core包含内部所有与业务相关的代码,而database则专注于数据库层。

现金流应用程序的 UML 图
现金流应用程序的 UML 图

在研究了现金流应用程序的 UML 图之后,我们来生成系统的依赖结构矩阵(Dependency Structure Matrix)。我通过 Jarchitect 工具生成矩阵,但此外还有很多替代方法:如 Intellij 或 Ndepend 的 DSM 支持。列和行代表 Spring Boot 应用程序 src 文件夹中的 Java 类,它们的结构是对称的。第 8 列是 IncomeService,与第 8 行对应的是相同的类/接口。单元格中的数字表示类之间的静态依赖导入。例如第 12 列(ConverterServiceImpl.java)在第4/5/10行中标了1,表示该类实现了 ConverterServiceExpenseConverterServiceService.

现金流应用的依赖结构矩阵
现金流应用的依赖结构矩阵

为了通过 DSM 找到架构债务,人们应该寻找:

  • 循环调用:A 类调用 B 类,B 类调用 A 类
  • 交叉:数字大的单元格意味着依赖关系多
  • 数字应围绕对角线分配:意味着类具有很强的内凝性
  • 矩阵中的数字越混乱,意味着依赖结构越不安全
  • 评估 S.O.L.I.D 原则,研究持有接口的列数

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

参考资料
[1]

SOLID Principles Sample: https://github.com/alizeynalli90/solid-principles

本文由 mdnice 多平台发布

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

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

相关文章

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节: 1、SD卡分区 提示:我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况,NXP官方给的镜像布局结构如下所示: 可以看到&#xff0c…

simulink基础学习笔记

写在前面 这个笔记是看B站UP 快乐的宇航boy 所出的simulink基础教程系列视频过程中记下来的,写的很粗糙不完整,也不会补。视频教程很细跟着做就行。 lesson1-7节的笔记up有,可以加up的群,里面大佬挺活跃的。 lesson8 for循环 For …

【项目管理知识】项目质量管理措施

1、持续改进(PDCA) 戴明循环或称PDCA循环、PDSA循环。戴明循环的研究起源于20世纪20年代,先是有着“统计质量控制之父”之称的著名的统计学家沃特阿曼德休哈特(Walter A. Shewhart)在当时引入了“计划-执行-检查&…

统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…

服装连锁店收银系统需要具备的五大功能

当今服装连锁店在市场竞争中需要拥有高效的收银系统来提升业务效率和顾客满意度。以下是服装连锁店收银系统需要具备的五大功能: 首先,完善的商品管理功能是至关重要的。这包括商品信息的录入、管理、更新和查询。收银系统应该能够快速而准确地识别商品&…

深入理解linux文件系统与日志分析

深入理解linux文件系统与日志分析 linux文件系统: 文件是存储在硬盘上的,硬盘上的最小存储单位是扇区,每个扇区的大小是512字节。 inode:元信息(文件的属性 权限,创建者,创建日期等等) block…

【产品经理】电商支付模块

在电商类的产品中,支付功能是非常重要的模块。那么,这个模块包含哪些功能呢? 电商平台上的支付模块作为整个购物流程中至关重要的一环,远哥聊聊如何解决用户在购物过程中面临的种种挑战,包括支付方式的选择&#xff0c…

Java实现数据结构---数组

文章目录 概念存储原理数组的操作完整代码 概念 数组是(Array)是有限个相同类型的变量所组成的有序集合,数组中的每一个变量为称为元素。数组是最简单、最常用的数据结构。 数组下标从零开始。 存储原理 数组用一组连续的内存空间来存储一…

HTTP --tcp

TCP TCP连接 tcp/ip是全球计算机以及网络设备都在使用的一种常见的分组交换网络分层协议集,客户端可以打开一条tcp/ip连接,连接到可能运行在世界各地的服务器应用程序,一旦连接建立起来了,在客户端和服务器的计算机之间交换的报…

Token的使用(JWT)

客户端用户登录生成token,然后返回给客户端后被存储,然后需要使用时客户端会发送到服务器进行验证。 package com.example.springblog;import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.Jwts; import io.jsonw…

软件测试可发现所有bug吗?有什么样的原则和目的?

在今天的高度数字化时代,软件测试的重要性不可忽视。这是一种系统性的过程,通过对软件系统进行评估和验证,以确定其是否满足预期要求。在软件开发的各个阶段,软件测试都扮演着至关重要的角色。它涉及到软件功能、性能、安全性等多…

HackTheBox-Machines--Cronos

文章目录 0x01 信息收集0x02 命令注入漏洞0x03 权限提升 Cronos 测试过程 0x01 信息收集 1.端口扫描 发现 SSH(22)、DNS(53)、HTTP(80)端口 nmap -sC -sV 10.129.227.2112.53端口开启,进行DNS…

Mysql基础教程(12):JOIN

MySQL JOIN 在 MySQL 中,JOIN 语句用于将数据库中的两个表或者多个表组合起来。 比如在一个学校系统中,有一个学生信息表和一个学生成绩表。这两个表通过学生 ID 字段关联起来。当我们要查询学生的成绩的时候,就需要连接两个表以查询学生信…

姚班带队OpenCSG,超越Devin,创造大模型编程领域新纪录

摘要 来自中国大模型初创公司OpenCSG推出的StarShip CodeGen Agent,以23.67%的成绩刷新了普林斯顿SWEBench(大模型真实独立编程评测)排行榜,取得了全球第二名的成绩,同时创造了非GPT-4o基模的最高纪录(SOTA)。 SWEBen…

案例|开发一个美业小程序,都有什么功能

随着移动互联网的迅猛发展,美业连锁机构纷纷寻求数字化转型,以小程序为载体,提升服务效率,增强客户体验。 线下店现在面临的困境: 客户到店排队时间过长,体验感受差 新客引流难,老用户回头客…

2024ciscn初赛——easycms

什么是CMS? CMS是“Content Management System”的缩写,意为“内容管理系统”。网站的开发者为了方便,制作了不同种类的CMS,可以加快网站开发的速度和减少开发的成本。 常见的CMS: php类cms系统:dedecms、…

【计算Nei遗传距离】

报错 Warning message: In adegenet::df2genind(t(x), sep sep, ...) : Markers with no scored alleles have been removed 原因: 直接用plink转换为VCF,丢失了等位基因分型(REF ALT) (plink编码的规则&…

【Pytorch 】Dataset 和Dataloader制作数据集

文章目录 Dataset 和 Dataloader定义Dataset定义Dataloader综合案例1 导入两个列表到Dataset综合案例2 导入 excel 到Dataset综合案例3 导入图片到Dataset导入官方数据集Dataset 和 Dataloader Dataset指定了数据集包含了什么,可以是自定义数据集,也可以是以及官方数据集Data…

R语言绘图 --- 饼状图(Biorplot 开发日志 --- 2)

「写在前面」 在科研数据分析中我们会重复地绘制一些图形,如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包(Biorplot),用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…

基于深度学习的模糊认知图方法

1 文章信息 文章题目为“Deep Fuzzy Cognitive Maps for Interpretable Multivariate Time Series Prediction”,该文于2019年发表于“IEEE TRANSACTIONS ON FUZZY SYSTEMS”。文章提出了深度模糊认知图(FCM)用于多变量时间序列预测&#xff…