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

本文讨论了如何利用依赖结构矩阵(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.mzph.cn/web/19644.shtml

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

相关文章

Java学习18——集合

目录 一.集合 1.集合的优点: 2.集合的框架体系: (1)单列集合: (2)双列集合(key,value): 3.Collection接口和常用方法: 4.迭代器遍…

计算机图形学入门05:投影变换

1.投影变换 上一章已经介绍了投影变换,就是将三维图像投影到二维平面上,而投影变换又分为正交投影(Orthographic Projection)和透视投影(Perspective Projection)。如下图: 正交投影 没有近大远小的现象,无论图形与视点距离是远是…

977. 有序数组的平方 - 力扣

1. 题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 2. 示例 3. 分析 我们当然可以遍历数组平方元素,然后再使用sort排序,但这里时间复杂度就为 O(logN) 了。 我…

c语言基础:数组的运用以及在内存中的地址的理解

目录 目录: 1.数组作为函数参数 2.数组在内存中的存储 2.1数组名是什么? 2.2下面我们来探讨二维数组的各个名字表示什么 二维数组的首元素地址是什么呢? *arr表示的是什么呢 ?(arr是二维数组) 1.数组作…

【小白专用24.5.30已验证】Composer安装php框架thinkPHP6的安装教程

一、框架介绍 1、框架简介和版本选择 Thinkphp是一种基于php的开源web应用程序开发框架ThinkPHP框架,是免费开源的、轻量级的、简单快速且敏捷的php框架。你可以免费使用TP框架,甚至可以将你的项目商用; ThinkPHP8.0 是目前框架正式版的最新版…

全球高端奢侈瑜伽服市场霸主Lululemon在美股的股价还有巨大的上涨空间

来源:猛兽财经 作者:猛兽财经 一、Lululemon公司介绍 1.1、创立与起源: Lululemon(LULU)由Chip Wilson于1998年在加拿大温哥华创立。1.2、产品与市场定位: Lululemon起初以瑜伽裤起家,现已发展成为涵盖瑜伽、跑步、训…

越来越多企业选择开源批发订货系统

在当今竞争激烈的市场环境中,越来越多的企业选择开源批发订货系统来提高运营效率、降低成本并实现业务的数字化转型。以下是开源批发订货系统的四大优势及其重要功能: 首先,开源批发订货系统具有高度的灵活性和定制性。由于其源代码开放&…

打造高效上传体验:基于Kotlin的Android快速上传框架

1. 引言 在Android开发中,文件上传操作常常面临各种挑战,为此我开源了一个高效、易用的快速上传框架,助力开发者轻松实现文件上传功能。 GitHub项目地址: 点我 2. 框架特点概述 纯Kotlin编写:简洁、现代的编程语言。MVVM架构&a…

提升船舶安全性与效率:隔离驱动芯片的应用

随着科技的不断发展,船舶行业也在不断迎来新的技术革新,其中隔离驱动芯片作为一种关键的电子元件,在船舶领域发挥着重要作用。本文将深入探讨隔离驱动芯片在船舶领域的应用及其技术特点。 隔离驱动芯片提升船舶系统安全性 船舶作为大型交通工…

C盘文件被格式化了,要怎么恢复?

C盘通常是操作系统(如Windows)的默认安装目录。它包含了操作系统的核心文件、驱动程序及系统所需的各种支持文件。这些文件对于计算机的正常运行至关重要。但在使用的过程中,有时可能会因为各种原因导致C盘被格式化,从而丢失了这些重要文件。这无疑是一个…

模型构建器之迭代器

上一篇我们介绍了模型构建器的基础,将一个工作流串联起来,然后做成模型工具。今天我们介绍模型构建器的第二个重要功能——迭代,也就是程序中的循环。 先来看一个例子。要给数据库中所有要素类添加一个相同的字段,该怎么做&#…

语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(二)音频数据预处理及去噪算法+Python源码应用

前言 深度学习技术在当今技术市场上面尚有余力和开发空间的,主流落地领域主要有:视觉,听觉,AIGC这三大板块。 目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相…

2024年5月架构试题

2024年5月份架构师考试真题完整版 截至2024-5-28 19:24:14已全部收录完成 共75道选择题,5道案例题,4道论文题。题目顺序不分先后。 全网最全的2024年5月份架构师考试真题回忆版,包含答案和解析。 选择题 计算机基础 操作系统调度算法 选先来先…

【Linux基础】Linux了解、安装centos虚拟机

【Linux基础】Linux了解、安装centos虚拟机 文章目录 【Linux基础】Linux了解、安装centos虚拟机1、什么是Linux2、Linux安装2.1、使用VMware安装Linux centos72.2、启动虚拟机安装 1、什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较…

vscode 远程连接出现问题

终端太小了, 因为终端中有换行符,如果 终端太小会出现问题

Amis源码 embed渲染方法解析(json结构渲染原理):

js sdk中的渲染函数embed使用方式如下: const amis amisRequire("amis/embed"); const amisScoped amis.embed( self.$refs["mnode"],amisJSON, {}, amisEnv); //env会有默认值,默认值与传来的参数进行合并({默认值…

TiDB-从0到1-部署篇

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇 一、TiUP TiUP是TiDB4.0版本引入的集群运维工具,通过TiUP可以进行TiDB的日常运维工作,包括部署、启动、关闭、销毁、弹性扩缩容…

23种软件设计模式——工厂模式

工厂模式 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。 通过使…

身份认证与口令攻击

身份认证与口令攻击 身份认证身份认证的五种方式口令认证静态口令动态口令(一次性口令)动态口令分类 密码学认证一次性口令认证S/KEY协议改进的S/KEY协议 其于共享密钥的认证 口令行为规律和口令猜测口令规律口令猜测 口令破解操作系统口令破解Windows密码存储机制Windows密码破…

2024新版二开微信发卡小程序源码卡密系统流支持量主

2024新版二开微信发卡小程序源码卡密系统流支持量主。裂变扩展多种领取模式二次开发的发卡小程序源码,其后台采用PHP编写,支持用户通过付费购卡或者观看视频广告领取卡密,该小程序还支持流量主,因为功能需要,我就进行了…