净资产的结构

Netty的包装结构很棒。

每个程序员都应该研究它。 每个系统都应该模仿它; 每个项目经理都应将其打印出来,拍在墙上,然后对开发人员说:“那样。”

Netty是一个“……用于快速开发可维护的高性能协议服务器和客户端的异步事件驱动的网络应用程序框架”,但是在这里并不重要,因为我们没有对其行为进行分析。 相反,请看图1。

图1:Netty的包装结构历时7年。

图1展示了Netty不断发展的软件包结构的spoiklin图(圆圈是包;直线是页面下的依赖关系;曲线是页面上的依赖关系),如果您不能立即看到它的结构如何,是,然后浏览Junit , Struts或Ant 。

“情人眼中的优良结构”也不是唯一的情况。 结构性混乱可以客观地衡量程序的结构性:结构性混乱程度越低,结构越好。 Netty的疾病远低于其他疾病,请参见表1。

程序 包装结构紊乱
蚂蚁 81%
朱尼特 76%
Struts 74%
Lucene 73%
FitNesse 61%
弹簧 35%
净额 26%

表1:本系列中所有程序的结构紊乱。

图2进一步显示了这种最终的结构异常并非偶然。 Netty在整个七年的生命周期中一直处于低水平。

图2:通过11个发布发布的Netty的结构混乱(与其他发布者进行比较)。

那么:为什么这个包结构这么好?

给定如图1所示的图,我们可以提出两个快速问题来大致评估所描述结构的优点。

在商业软件开发中,“良好的结构”仅表示“便宜的更新”。 此外,有证据 表明 ,每个了解涟漪效应的程序员都知道什么:X依赖的事物越多,涟漪效应的影响就越大,因此X的成本就越高。

因此,选择一个严重依赖其他程序包的问题(A)我们是否可以轻松地确定依赖程序包,以及(B)这些依赖程序包的整体子集有多小?

结构不良的程序会掩盖这些依赖关系,仔细检查通常会发现几乎整个系统都存在依赖关系。 但是,结构合理的程序显然会提供依赖的程序包,而且数量很少。

让我们先问一个结构不好的程序的两个问题。

图3显示了Jenkins的噩梦般的90%结构混乱,然后显示了来自五个软件包(工具提示)中最依赖其他软件包的突出的传递依赖。

图3:詹金斯,哦,詹金斯。

显然,在Jenkins中跟踪依赖关系是一个挑战,许多软件包依赖于系统其余部分的75%以上。

图4重复了该实验,但是显示了五个Netty软件包的传递依赖关系,这五个软件包最依赖其他软件包: epoll,spdy,websocketx,httpnio

图4:以蓝色突出显示Netty中最差的传递依赖项。

与詹金斯形成鲜明对比的是,我们可以看到Netty软件包所依赖的数量以及数量。 Netty有55个软件包,但其他任何人所依赖的最大软件包只有12个,仅占系统的22%。

Netty的包装结构是否完美? 当然不是。 特别是内部并发之间的循环依赖关系在该核心内部/并发/通道/缓冲区/使用程序包群集中创建了令人遗憾的强耦合。

从表面上看,Netty的类结构确实不好。 Netty的设计师在建造班级时显然放弃了一些出色的结构原理。 丢人现眼。

但是看看那个包装的结构……哇。

最后,没有分析Netty的关键版本,而是提出了自己的架构观察。 Netty的架构师似乎已经决定了一个相当出色的部署策略。 下载Netty既可以得到一个多合一的jar文件,也可以得到13个jar文件,其中包含系统的各个部分。 大概您可以加载所有Netty或仅加载所需的部分。

一个jar文件,即“公共” jar,包含内部/并行/通道/缓冲区/ util程序包集群,而其他文件则包含“ codec”,“ tcnactive”,“ transport”等,提示后者jar是普通jar的客户,但不是彼此的客户,因此彼此之间没有依赖关系。 因此,在他们的部署中,Netty的设计师可能已经将子系统的分离和封装包含在内,从而导致了这种行业领先的封装结构。

剩下的唯一问题是:为什么没有更多的项目跟随Netty的领导? 为什么詹金斯有90%的结构异常? Jenkins的设计者为什么不适当地划分他们的系统以减少包装间的耦合? 为什么软件开发领域如此愿意接受这些不良结构所产生的成本?

我们不是比这个更好吗?

摘要

如果每年获得当今使用的最佳Java程序包结构奖,Netty将会连续七年获得该奖项。

翻译自: https://www.javacodegeeks.com/2017/01/the-structure-of-netty.html

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

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

相关文章

常用的HTTP响应头

响应头 说明 示例 状态 Access-Control-Allow-Origin 指定哪些网站可以跨域源资源共享 Access-Control-Allow-Origin: * 临时 Accept-Patch 指定服务器所支持的文档补丁格式 Accept-Patch: text/example;charsetutf-8 固定 Accept-Ranges 服务器所支持的内容范围 …

iframe嵌入页面白屏_封闭在家学网页制作!为页面嵌入PDF文件——零基础自学网页制作

在页面中嵌入PDF文件在上一篇《在html页面中嵌入其他页面的方法——零基础自学网页制作》(结尾见目录)中我们学习了如何在页面中嵌入其他页面的操作。今天我们来嵌入一个pdf文件。其实使用示例代码如下:页面效果如下:考虑到pdf的版权问题就不给大家上传云…

ITK读取RGB图像像素值

/*这个程序接收输入参数作为文件路径, 读取指定的图片数据(RGB), 并显示指定位置的像素值。(这里是[0,0]位置) */ #include "itkImage.h" #include "itkRGBPixel.h" #include "…

微小宝公众号排行榜_排行榜 | 山西省高校、高职中专微信公众号周数据排行榜...

戳上面的蓝字关注我们哦!《山西教育》杂志社公众号“山西教育杂志”微信号shanxi_jiaoyu山西教育杂志社山西教育山西省高校微信公众号2020年周数据分析11月22日至11月28日WCI指数 通过微信公众号推送文章的传播度、覆盖度及公号的成熟度和影响力,来反映微…

二阶段冲刺第七天

站立会议时间:5.15 站立会议地点: 站立会议内容: 王建宁: 昨天把管理员界面上的listview添加了点击事件,点击进去可以填写维修信息,也可以对维修信息进行更改 今天制作管理员界面,长按对反馈信息…

垃圾收集算法,垃圾收集器_为什么我不能关闭垃圾收集器?

垃圾收集算法,垃圾收集器让我们开始快速回顾一下我作为Java开发人员的职业生涯的早期。 我想消除正在进行的测试中的垃圾回收(GC)暂停。 瞧,当我发现无法完成时,我很生气。 那时,我把问题留在了“设计错误”中&#xf…

串口 驱动 热敏打印机_热敏纸标签打印不出来文字 是因为……

点击↑箭头处“蓝色字”,关注我们哦!!Hello,各位纸友们好呀!我是小冠~随着生活的需要,热敏纸标签在生活中也成了必不可少一个部分!那么,为什么有的热敏纸标签有的时候会打印不出来文…

四级英语day14

1. instance /ˈɪnstəns/ n.例子 vt.举…为例2. formal /ˈfɔːməl/ a.①形式上的②正式的3. casual /ˈkʒuəl/ a.①漫不经心的②非正式的③临时的4. cause /kɔːz/ n.①原因②理由③事业 vt.引起5. foundation /faunˈdeɪʃən/ n.①地基②建立③根据6. generous…

JDK 9已完成功能!

今天的马克莱因霍尔德 ( Mark Reinhold)消息JDK 9已完成功能完善-现在该降级了 , 它宣布JDK 9的“总体功能集已冻结”。 甲骨文Java平台小组的首席架构师Reinhold补充说:“极不可能将任何进一步的JEP定向到该发行版。” 与该消息类…

登录样式:log4j 2,上下文,自动清理…全部不附带任何字符串!

日志记录-保持操作的时间跟踪-对于任何关键任务系统,无论大小,都至关重要。 我们的Project-X框架也是如此 ,这就是为什么我们希望从一开始就正确地做到这一点。 基于我们在传奇的UltraESB上的登录经验, 上下文日志记录&#xff0…

java date加一天_Java日期时间API系列15-----Jdk8中API类,java日期计算2,年月日时分秒的加减等...

通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, TemporalAdjuster, ChronoLocalDate等,有非常丰富的方法。例如:LocalDateTime&#xff1…

霍夫变换(Hough Transform)

一、直线检测相关算法   1.1 霍夫变换(Hough Transform)  霍夫变换(Hough Transform)换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,是图像处理中从图像中检测几何形…

JDK 9是某些功能的终结

几天前宣布JDK 9是Feature Complete! 进行剪切的许多“功能”都是添加项,但有些是删除项。 这篇文章介绍了从OpenJDK和/或Oracle的JDK Java 9中删除的一些项目。 JEP 220 (“模块化运行时图像”)的一部分是删除了Java认可标准覆盖…

一种table超出高度自动出滚动条的解决方案

参考链接: http://www.cnblogs.com/xiaoafei1991/archive/2015/09/30/4781592.html转载于:https://www.cnblogs.com/ziyoublog/p/10870048.html

最近邻插值、双线性插值、双三次插值

1.最近邻插值 越是简单的模型越适合用来举例子,我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素,宽也是3个象素的图像,每个象素的取值可以是 0-255,代表该像素的亮度,25…

java map转json字符串_Java-Gso-json字符串解析-php后台返回字段类型可能为字符串(/空字符串)或者对象的情况...

其实本来android前端定义的对象类型是对象,如果后台没有值的情况下,理论上给null,如果是数组给[]或者null都可以的。这样Gson再解析转换的时候就不会出问题!但是最近重构发现后台如果没有字段值给的是""空字符串&#x…

oracle中时间加减一年的写法

select add_months(date2019-5-15,-12) from dual; -- 2018-5-15 通过add_months(x,y)函数,在给定的时间x固定的月份y select date2019-5-15 interval -1 year from dual; --2018-5-15 通过interval函数,这个用来表示一段时间间隔,有固定的格式,这里用来加一年&a…

'fopen' This function or variable may be unsafe

1>...error C4996: fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> 正在生成代码... 生成: 成功 0 个,失败 1 个,最…

python3捕获异常_python中异常捕获方法详解

在Python中处理异常使用的是try-except代码块,try-except代码块放入让python执行的操作,同时告诉python程序如果发生了异常该怎么办,try-except这个功能其实很多入门书籍中都放到了高级篇幅里,在入门的时候一般不会讲这个使用&…

自定义java线程池_我的Java自定义线程池执行器

自定义java线程池ThreadPoolExecutor是Java并发api添加的一项功能,可以有效地维护和重用线程,因此我们的程序不必担心创建和销毁线程,也不必关注核心功能。 我创建了一个自定义线程池执行程序,以更好地了解线程池执行程序的工作方…