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

u3d ab包 循环依赖

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

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

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

u3d ab包 循环依赖

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

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

相关文章

linux设置基础软件仓库时,安装centos系统时设置基础软件仓库出错

安装centos系统时设置基础软件仓库出错,公钥,命令,视频教程,器上,提示安装centos系统时设置基础软件仓库出错易采站长站,站长之家为您整理了安装centos系统时设置基础软件仓库出错的相关内容。1、首先登录CentOS服务器,连接上服务器之后我们使用yum remo…

C 11实现的100行线程池

【导读】:C 线程池一直都是各位程序员们造轮子的首选项目之一。今天,小编带大家一起来看看这个轻量的线程池,本线程池是header-only的,并且整个文件只有100行,其中C 的高级用法有很多,很值得我们学习&#…

tensorflow2 目标检测_基于光流的视频目标检测系列文章解读

作者:平凡的外卖小哥全文5747字,预计阅读时间15分钟1 简介目前针对于图片的目标检测的方法大致分为两类:faster R-CNN/R-FCN一类:此类方法在进行bbox回归和分类之前,必须通过region proposal network(RPN)得到RoI&…

sts集成jboss_如何为JBoss Developer Studio 8设置集成和SOA工具

sts集成jboss最新的JBoss Developer Studio(JBDS)的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中,我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进行…

linux wifi 配置 编程,linux 无线手动配置

摆脱网线,用wifi无线连接通过网线登陆SSH后,可以设置wifi连接,摆脱网线。以下所以命令如提示权限不够时,请在命令前加“sudo”查看无线网卡的设备名:$ iw dev[备注]:其中显示“Interface wlan0”&#xff0…

C 多线程的互斥锁应用RAII机制

什么是RAII机制RAII是Resource Acquisition Is Initialization(翻译成 “资源获取即初始化”)的简称,是C 语言的一种管理资源、避免资源泄漏的惯用法,该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象&…

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

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

c iostream.源码_通达信《K线上画趋势线预警》精选指标(附源码)

通达信《K线上画趋势线预警》精选指标K线上画趋势线预警源码:N:5;MA5:EMA(C,5)COLORWHITE;MA13:EMA(C,13)COLORCYAN;MA21:EMA(C,21)COLORMAGENTA;MA34:EMA(C,34)COLORYELLOW;MA55:EMA(C,55)COLORRED;{画线}A1:REF(H,N)HHV(H,2*N1);B1:FILTER(A1,N);C1:BACKSET(B1,N1…

linux module原理,NodeJS的模块原理

最近一直在使用Node JS,在网上看到了一段代码我觉得完美的诠释了Node JS模块加载的原理,其实深究下去,它还诠释了许多东西:Js模块化编程、闭包的真正强大之处等等。闲话不说,先看看这段代码:// - hello.jsv…

C 20 协程初探

【导读】:C 20 终于引入了协程特性,给库作者提供了一个实现协程的机制,让用户方便使用协程来编写异步逻辑,降低了异步并发编程的难度。结合我最近协程的学习,在这里记录一下相关内容。以下是正文使用场景协程和普通函数…

如何写一个简单的node.js C 扩展

node 是由 c 编写的,核心的 node 模块也都是由 c 代码来实现,所以同样 node 也开放了让使用者编写 c 扩展来实现一些操作的窗口。如果大家对于 require 函数的描述还有印象的话,就会记得如果不写文件后缀,它是有一个特定的匹配规则…

在线画 有穷状态自动机 的软件_怎么画思维导图?不用下载软件,在线就能操作...

怎么画思维导图?在工作中,除了流程图,脑图也是很重要的一个存在:流程图帮助我们快速完成任务,而脑图告诉我们任务本质。画思维导图是一个积累的过程,急不来,对于新手来说还是有一定难度的。由于…

Spring Boot Actuator:在其顶部具有MVC层的自定义端点

Spring Boot Actuator端点允许您监视应用程序并与之交互。 Spring Boot包含许多内置端点,您也可以添加自己的端点。 添加自定义端点就像创建一个从org.springframework.boot.actuate.endpoint.AbstractEndpoint扩展的类一样容易。 但是Spring Boot Actuator也提供了…

422器件与lvds接收器的区别_SPI、I2C、UART三种串行总线的原理、区别

SPI、I2C、串口、我相信如果你是从事的是嵌入式开发,一定会用到这三种通信协议,串口的话因为和波特率有关,所以一般的CPU或者MCU只会配有两个或者三个串口,而数据的传输,的话SPI和I2C用得会比较多区别:1、U…

C 的 6 种内存顺序,你都知道吗?

原子操作的内存顺序有六个内存顺序选项可应用于对原子类型的操作:1. memory_order_relaxed2. memory_order_consume3. memory_order_acquire4. memory_order_release5. memory_order_acq_rel6. memory_order_seq_cst。除非你为特定的操作指定一个顺序选项&#xff0…

java面试解决项目难题_Java转换难题者,不适合工作(或面试)

java面试解决项目难题一个非常艰苦的面试问题可能是这样的: int i Integer.MAX_VALUE; i 0.0f; int j i; System.out.println(j Integer.MAX_VALUE); // true为什么打印出正确的文字? 乍一看,答案似乎很明显,直到您意识到如…

易语言 网页用什么编码_通常提到的编码器是干什么用的

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者成为码盘,后者称码尺.按照读出方式编码器可以分…

如何优雅地实现 C 编译期静态反射

部门请来了软件专家袁英杰咨询师指导我们软件开发,从中我也学到了很多姿势,在此记录下来宝贵的经验。苹果的 mbp 品控真是差劲,写这个东西把 LShift 键 按坏了,真是难受。反射能做什么最近和大师聊软件设计,其中一个点…

香草 jboss 工具_如何为JBoss Developer Studio 8设置BPM和规则工具

香草 jboss 工具最新的JBoss Developer Studio(JBDS)的发布带来了有关如何开始使用尚未安装的各种JBoss Integration和BPM产品工具集的问题。 在本系列文章中,我们将为您概述如何安装每套工具并说明它们支持哪些产品。 这将有助于您在着手进…

在c语言中 函数的作用是什么,C语言程序中函数的定义

C语言程序中函数的定义C语言的函数问题是困扰很多学者的问题的,c程序中什么是函数呢?下面啦小编为大家精心推荐的c程序中函数的定义,希望能够对您有所帮助。C语言读书笔记--函数先来看看函数的一般形式,尝试写一个加法的函数:思路…