为什么要保持软件包依赖项自由循环的五个原因

如果您很不幸不能在一个项目中与我一起工作,那么您将遭受所有软件包依赖项必须无循环的规则的困扰。 我不仅需要这样做 ,而且还将创建一个单元测试,以确保使用Degraph进行测试。 这就是我认为无周期封装结构对项目有益的原因。

  1. 有用的抽象 :如果您在实现内容时没有过多考虑依赖项,则几乎可以肯定会得到循环依赖项。 为了打破这些周期,您通常必须以接口的形式引入新的抽象。 与以前的直接依赖关系相比,这些接口通常可以为应用程序中的操作创建更清晰的抽象,例如考虑两个相互依赖的包SomethingOther 。 正如描述的那样,没有办法说出它们为什么相互依赖。 但是为了打破依赖关系之一,您可能决定引入一个接口。 该接口的名称可能包含有关两者之间关系的有价值的附加信息。 想象一下,该接口最终被命名为SomethingDeletionListener ,位于Somehting中并在Other中实现。 这已经告诉您有关两个软件包之间关系的信息,不是吗?
  2. 干净的正交包结构 :每当您在树状结构中组织某些东西时,您可能都希望在该树中形成正交结构。 这意味着在分支的所有子分支上都是单一分类的元素。 一个很好的例子是CustomerOrderWishlist ,另一个很好的例子是UserInterfacePersistenceDomain 。 这些结构清楚地表明了类所属的位置。 如果将这两种方法混合使用,最终会得到诸如CustomerOrderPersistence之类的东西。 在这样的结构中,完全不清楚用于持久性客户的类在哪里。 结果是一团糟,通常会导致依赖关系中的循环,因为诸如客户应该依赖于持久性之类的问题或其他方法甚至都没有道理。
  3. 启用重用 :是否曾经尝试过重用一个包,甚至是一个不在乎依赖项的项目中的单个类? 我试过了。 在十分之九的案例中,我有两种选择:要么选择整个项目(实际上不是一个选择),要么对类进行一些繁重的重构,然后再进行编译,而无需在项目中包含所有其他内容。 另一方面,在项目中,程序包的依赖关系形成了一个很好的有向无环图,这很清楚该类需要做什么。 人们对重用感兴趣的东西通常靠近图的叶子,可以单独提取,也可以很少依赖。
  4. 允许部分重写 :有时一个曾经被认为很棒的想法变成了一个非常糟糕的想法。 有时情况很糟,您想重做。 非循环依赖性限制了受更改影响的代码量。 由于具有周期性依赖性,整个应用程序通常至少有受到影响的危险。
  5. 独立部署 :另一方面,有时想法实际上是很棒的。 也许如此之大以至于它们被大量使用,以至于您需要对其进行扩展并单独部署在三台其他服务器上,以应对沉重的负载。 祝您好运,将您的应用程序分为两个或两个以上的部分,当程序包之间缠结在一起时,可以将它们分开部署。 使用无循环结构,可以切割的地方应该很明显。

翻译自: https://www.javacodegeeks.com/2014/11/five-reasons-why-you-should-keep-your-package-dependencies-cycle-free.html

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

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

相关文章

Servlet技术

----Servlet是用Java语言编写的应用到Web服务器端的扩展技术,它先于jsp产生,可以方便地对Web应用中的HTTP请求进行处理。在Java Web程序开发中,Servlet主要用于处理各种业务逻辑,他比jsp更具有业务逻辑层的意义。 一。Servlet基础…

Mysql远程登录及常用命令

第一招:mysql服务的启动和停止 启动:net start mysql 停止:net stop mysql 第二招:登陆mysql 语法如下:mysql -u用户名 -p用密码 键入命令mysql -uroot -p,回车后提示你输入密码,输入12345&…

基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID

我最近参与了一个项目,我们需要捕获Websocket请求的http会话ID –原因是要确定使用相同基础HTTP会话的Websocket会话的数量。 这样做的方法基于利用新的spring-session模块的示例,并在此处进行描述。 捕获http会话ID的技巧是理解在浏览器和服务器之间建…

用过的jQuery记录

var list $(input:radio[name"name"]:checked).val();  //选择input中单选name为“name”的并且是选中状态的 index $(document).data(index);  //把参数存入document中保存起来并在下一次中取出再用index 1index $(document).data(index); str.find("input…

windows phone画板程序

前几天想要这样一个程序&#xff0c;没找到&#xff0c;今天上网偶然发现了&#xff0c;转载过来。 <Grid> <InkPresenter x:Name"MyPresenter" HorizontalAlignment"Left" VerticalAlignment"Top" MouseLeftButtonDown"MyP…

文件指针创建失败!File *fp失败

问题记录&#xff1a;项目是在所里边的vs2010上创建的&#xff0c;正常&#xff01;在自己的笔记本上使用vs13和19都一直报错&#xff01;指针一直为空&#xff01; 网上查了好久&#xff0c;试了很多方法都没有用&#xff01;最后发现是权限的问题&#xff0c;c盘下边创建不了…

前端开发:小程序--第一步

当我在接到小程序的项目的时候&#xff0c;几乎可以说是一脸懵因为对小程序的概念说实话是不太理解的&#xff0c;或者说理解的不太透彻&#xff0c;但是领导给项目说要完成&#xff0c;那没办法&#xff0c;还是要继续呀。 首先&#xff0c;我就想着先注册一个看看&#xff0…

但这是不可能的,或者无法发现JIT破坏了您的代码。

时不时地查看一些代码&#xff0c;并认为它不可能是错误的。 一旦您排除了简单的程序员搞砸代码/代码中的敌对行为&#xff08;确保您阅读Java Puzzlers或类似内容&#xff09;或并发问题&#xff08;阅读Java Concurrency或继续学习Heniz博士的出色课程 &#xff09;&#xff…

【解决】insert 语句无效果,在查询中正常运行问题

今天碰到一个奇怪的问题&#xff0c;具体见csdn&#xff1a;http://topic.csdn.net/u/20120424/19/0aeacbce-a9d5-4630-8b87-a08d5df1828b.html?seed1347097422&r78358698#r_78358698 解决方法与原因:猜测&#xff0c; 因为数据库是我再vs2010中建立的&#xff0c;数据库版…

最近开始研究和关注的技术

留个草稿&#xff0c;慢慢补充。 Acropolis&#xff0c;基于WPF的应用程序框架&#xff0c;某种角度可以认为是CAB的WPF实现&#xff1b; http://windowsclient.net/acropolis/&#xff0c;Cider似乎还是不完善......不知道VS2008 Release时能不能妥善处理好WPF在设计期的渲染。…

html行级元素和块级元素以及css转换

之前有说过html的标签是有语义的&#xff0c;当然也就有一些默认的样式&#xff0c;比如标题有h1h6&#xff0c;他们的字体由大至小一次递减&#xff0c;字体比一般字体要加粗。 这样也就有了行级元素和块级元素&#xff0c;下面来看看什么是行级元素什么事块级元素&#xff1…

EasyCriteria已演变为uaiCriteria。 新名称和更多功能

你好&#xff01;你好吗&#xff1f; 我很高兴宣布uaiCriteria的发布&#xff0c;EasyCriteria的演进。 确实需要更改框架名称吗&#xff1f; 是的&#xff0c;可悲的是。 我找到了另一个具有相同名称的框架 &#xff0c;这就是为什么我决定更改名称的原因&#xff08;我不希…

ajax方式下载文件

在web项目中需要下载文件&#xff0c;由于传递的参数比较多&#xff08;通过参数在服务器端动态下载指定文件&#xff09;&#xff0c;所以希望使用post方式传递参数。通常&#xff0c;在web前端需要下载文件&#xff0c;都是通过指定<a>标签的href属性&#xff0c;访问服…

了解Spring Web应用程序体系结构:经典方法

每个开发人员必须了解两件事&#xff1a; 架构设计是必要的。 花哨的体系结构图没有描述应用程序的真实体系结构。 真正的体系结构是从开发人员编写的代码中找到的&#xff0c;如果不设计应用程序的体系结构&#xff0c;最终将得到一个具有多个体系结构的应用程序。 这是否…

使用unicode

#include <iostream> class 我的类 { public:我的类(int 我的初始化变量){我的成员变量 我的初始化变量;}~我的类(){}int 我的成员变量;void 打印我的变量(){std::cout<<我的成员变量<<std::endl;}; };int main() {我的类 我的实例(1);我的实例.打印我的变量…

springmvc注解小示例(转)

转自&#xff1a;http://www.blogjava.net/pengo/archive/2010/11/28/339229.html 弃用了struts&#xff0c;用spring mvc框架做了几个项目&#xff0c;感觉都不错&#xff0c;而且使用了注解方式&#xff0c;可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mv…

解决maven项目Cannot change version of project facet Dynamic web module to 3.0

1、打开新建的servlet文件例如&#xff08;hibernate.cfg.xml&#xff09;修改头文件为 <?xml version"1.0" encoding"UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" &quo…

使用Forge插件在现有Java EE项目上启用Arquillian

技术提示&#xff03;34解释了如何创建可测试的Java EE 7应用程序。 如果要启动新的应用程序&#xff0c;这将很有用。 但是&#xff0c;如果您已经有一个应用程序并启用Arquillian怎么办&#xff1f; 这就是Forge和Forge-Arquillian附加组件派上用场的地方。 这就是我在javae…

HDOJ1166 敌兵布阵【线段树】

Problem : 1166 ( 敌兵布阵 ) Judge Status : AcceptedRunId : 5862942 Language : GCC Author : qq1203456195 #include <stdio.h> #define lson l,m,rt<<1 #define rson m1,r,rt<<1|1 #define maxn 55555 int sum[maxn<<2]; void PushUp(i…

欧拉回路

欧拉回路与欧拉路径 欧拉回路 不重复地结果每条边的回路欧拉路径 不重复地几个每条边地路径欧拉图 存在欧拉回路地图半欧拉图 存在欧拉路径地图在数学中为简单的图的一笔画完问题&#xff0c;但在有向图里&#xff0c;可以应用到单词接龙判断 判断是否存在欧拉回路 无向图有向图…