使用structure101分析软件包的依赖关系

稳定应用程序的一个关键是结构良好的代码库。 我们知道我们应该建立尽可能多的黑匣子,因为一旦完成一个黑匣子,我们就不必再考虑它的内部了。 您只需要使用您或其他团队成员通过明确定义的界面编写的代码即可。 这使您可以专注于要添加的下一个功能。

当我们想到黑匣子时,我们经常会想到类或整个jar包。 当然,课程应该是黑匣子,对此不做任何讨论。 jar包也是如此。 但是在类和jar包之间有另一层结构,通常不能直接将其视为黑匣子:包。

一揽子计划通常是二等公民,对其相互关系的分析不够深入。 但是有一个很好的工具可以进行这种分析: Structure101 。 通常,它可以通过组织良好的图表来帮助您监视和验证项目的依赖关系结构和复杂性。

因此,让我们从一个示例项目开始。 为此,我采取了自己的项目之一: japicmp是一种工具,用于根据更改的方法和类来计算两个jar存档的API之间的差异。 structure101有一个很棒的组合视图,它向您显示了项目包之间的依赖关系。 这是查找japicmp当前版本的方式:

结构101_之前

显然,我们可以看到例如cli软件包,它负责命令行解析,它使用异常以及config软件包,并且由main()方法所在的主软件包本身使用。 使用cli软件包,一切似乎都可以。 但是,三个软件包cmp,util和model呢? 类和方法(即业务逻辑)之间的差异计算位于程序包cmp中。 因此,它应该使用模型以及util包。 但是,这两个软件包不应具有任何向后依赖性。 此问题也显示在矩阵视图中:

structure101_before0_matrix

当我们仔细查看这三个程序包之间的纠缠时,我们发现util程序包中使用了cmp程序包中的类AccessModifier:

结构101_before2

除此之外,该类还用于模型中。 这清楚地表明,该类应该像在cmp包中那样留在模型包中。 这似乎很有意义,因为类或方法的访问修饰符是jar存档模型的一部分,并且不属于业务逻辑。 如果将此类移至模型包,则会得到以下结果:

structure101_after

看起来好多了。 包装结构内没有任何缠结。 精美的布局还清楚地表明,整个应用程序取决于模型,因为程序包位于图的底部。 驻留在cmp中的业务逻辑从主程序包中调用,并按需使用util,config和model。 对于cli和xml输出的实现所在的输出包,情况也是如此。 计算后,此软件包将使用配置以及模型。

结论

软件包不应是二等公民,而是可以帮助您构建应用程序的结构,以便轻松查看代码和单独的功能。 诸如structure101之类的工具可帮助您分析软件包之间的依赖关系,因此使软件包成为一侧的jar和另一侧的类之间的重要层次。

参考:在Martin's Developer World博客上,我们的JCG合作伙伴 Martin Mois 使用structure101分析了软件包的依赖关系 。

翻译自: https://www.javacodegeeks.com/2013/11/analyze-package-dependencies-with-structure101.html

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

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

相关文章

excel高级筛选怎么用_神!Excel高级筛选原来如此好用

转自EXCE不加班这两天的宏教程都提到了高级筛选这个功能,不过只是用到最基本的用法。高级筛选其实是一个很好用的功能,今天卢子来全面讲解。1.按关键词筛选高级筛选最重要的就是条件区域,资产名称四门书柜,日期2017/1/1&#xff0…

iis7.5配置php环境,iis7.5安装配置php环境 - iis

前言iis7.5是安装在win7、win8里的web服务器,win2003、win2000的web服务器使用的是iis6.0,由于win7、win8系统相比win2003、win2000有了改新革面的不同,因此对于iis7.5的配置也必需捣鼓一翻才能熟悉。不过...前言iis7.5是安装在win7、win8里的…

微信小程序 网络请求之设置合法域名

设置域名 登录微信公众号后台小程序中 设置→开发设置→服务器设置 必须设置域名,微信小程序才能进行网络通讯,不然会报错 如果设置好了合法域名,开发工具还提示不在合法域名列表中,因为在微信会有一段时间的缓存,等…

money (dp)

牛客网暑假训练第二场D题: 链接:https://www.nowcoder.com/acm/contest/140/D来源:牛客网 题目描述 White Cloud has built n stores numbered from 1 to n. White Rabbit wants to visit these stores in the order from 1 to n. The store …

php gps 坐标,php 计算gps坐标 距离

在计算机或GPS上经纬度经常用度、分、秒和度.度、分.分、秒.秒的混合方式进行表示,度、分、秒间的进 制是60进制,度.度、分.分、秒.秒的进制是100进制,换算时一定要注意。可以近似地认为每个纬度之间的距离是不变的111KM,每分间 1.85KM&#…

博客园如何使用MarkDown

如何使用博客园下的markdown:https://www.cnblogs.com/ulrica/p/8933549.html 博客园的 MarkDown 代码样式如何设置https://www.cnblogs.com/zhongxia/p/26b4b061f2a47518681bcdd4ff89c344.html 博客园 Markdown 编辑器指南http://www.cnblogs.com/qiaogaojian/p/61…

jQuery -- 光阴似箭(五):AJAX 方法

jQuery -- 知识点回顾篇&#xff08;五&#xff09;&#xff1a;AJAX 方法 1. $.ajax 方法&#xff1a;用于执行 AJAX&#xff08;异步 HTTP&#xff09;请求。 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"t…

ggplot2设置坐标轴范围_R语言数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()...

【R语言】高维数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()姐妹花​mp.weixin.qq.comfacet_grid()形成由行和列面化变量定义的面板矩阵。当有两个离散变量&#xff0c;并且这些变量的所有组合存在于数据中时&#xff0c;它是最有用的。如果只有一个具有多个…

php resque 计划任务,PHP-RESQUE - 实现重试

因为PHP-Resque 的重试部分需要自己写&#xff0c;网上又没啥轮子&#xff0c;而且resque也已经很久不更新了&#xff0c;所以自己研究下resque的源码&#xff0c;然后也借鉴了Laravel的队列重试机制&#xff0c;实现了PHP-Resque的重试机制。Resque地址设计思路1.这里需要阅读…

RabbitMQ集群、镜像部署配置

1 RABBITMQ简介及安装 RabbitMQ是一个开源的AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;支持多种客户端&#xff0c;如&#xff1a;Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等&#xff0c;支持AJAX。用于在分布式系统中存储转发消息…

C语言、c++实现超好玩植物大战僵尸(完整版附源码)

实现这个游戏需要Easy_X main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏 //4实现工具栏里面的游戏卡牌 #define WIN_WIDTH 900 #define WIN_HEIGHT 600 //定义植物类型 enum { WAN_DOU, XIANG_RI_KUI, ZHI_WU_COUNT }; #include<stdio.…

【代码笔记】Web-HTML-颜色

一&#xff0c;效果图。 二&#xff0c;代码。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>html 颜色</title> </head> <body> <!--html 颜色--> <p style"">> 通过十六…

java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?...

作者&#xff1a;MacroZheng链接&#xff1a;https://juejin.im/post/5eef217d51882565d74fb4eb来源&#xff1a;掘金SpringBoot实战电商项目mall&#xff08;35kstar&#xff09;地址&#xff1a;http://github.com/macrozheng/…摘要ELK日志收集系统进阶使用&#xff0c;本文…

GitHub的10,000个最受欢迎的Java项目-以下是它们使用的顶级库

随着Java开发人员正在使用既成熟又高度发展的语言来工作&#xff0c;无论何时编写新代码&#xff0c;我们都将面临一个持续的难题–使用大家都在谈论的热门新技术&#xff0c;或者坚持使用久经考验的库&#xff1f; 由于Java应用程序的很大一部分是商业性质的&#xff0c;因此…

Java防止Xss注入json_每日一题(java篇) 如何防止xss注入

1、XssAndSqlHttpServletRequestWrapper 类&#xff1a;import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class XssAndSqlHttpServletRequestWrapper extends HttpServletReques…

【工具相关】web-HTML/CSS/JS Prettify的使用

一&#xff0c;打开Sublime Text,代码如下面所示。 二&#xff0c;鼠标右键--->HTML/CSS/JS Prettify--->Prettify Code.代码如图所示&#xff0c;明显的代码变得整齐了。 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

MS SQL 分页存储过程

最近换了家新公司&#xff0c;但是新公司没有使用分页的存储过程。那我就自个写一个往项目上套 &#xff08;效率怎么样就不怎么清楚没有详细的测试过&#xff09; CREATE PROCEDURE [dbo].[pro_common_pageList](tab NVARCHAR(MAX) ,---表名PrimaryKey VARCHAR(100) , --主键I…

STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

参考资料&#xff1a;1、ST HAL库官网资料 2、https://blog.csdn.net/u014470361/article/details/79206352#comments 一、STM32CubeMX配置外部时钟 注意在进行外部时钟配置时&#xff0c;即“High Speed Clock”和“Low Speed Clock”需配置成“Crytal/Ceramic Resonator&…

pyqt5 qlabel无法显示图片_实战PyQt5: 011-单选框控件QRadioButton

单选框QRadioButton简介QRadioButton为单选按钮&#xff0c; 可以选中(打开)或者取消选中(关闭)。在一组单选按钮中&#xff0c;一次只能选中其中的一个按钮。选中或者取消选中QRadioButton&#xff0c; 都会发出toggled()信号。使用isChecked()可以查看是否选择了某个QRadioBu…

matlab数据游标不能使用,启用数据游标模式

文本解释器&#xff0c;指定为下列值之一&#xff1a;tex - 使用 TeX 标记子集解释字符。latex - 使用 LaTeX 标记解释字符。none - 显示字面字符。TeX 标记默认情况下&#xff0c;MATLAB 支持一部分 TeX 标记。使用 TeX 标记可添加下标和上标&#xff0c;修改字体类型和颜色&a…