小编Ell*_*iot的帖子

为什么所有领先的开源Java库在它们的包中都有循环依赖?

在过去的几周里,我一直在研究Java包结构和依赖模式.关于该主题的着作中的一个共同点是包依赖应该形成有向无环图(DAG)的简单规则.作者罗伯特马丁甚至正式确定了非循环依赖原则(ADP),该原则指出

包之间的依赖关系结构必须是有向无环图(DAG).也就是说,依赖结构中必须没有循环.

一些Java库确实遵循这个简单的规则.即Spring Framework库(spring-core,spring-web等)和Google Guava.

但令我惊讶的是,大多数领先的开源Java项目都没有!

以下开源项目在包之间具有循环依赖关系:

  • Netflix Hystrix(每个包都是一个循环的一部分!)
  • AWS开发SDK
  • 下议院郎
  • 共享的集合
  • 匕首
  • 谷歌Gson
  • 谷歌Guice
  • Hibernate ORM
  • Hibernate Validator
  • 杰克逊核心
  • 乔达时间
  • 玩框架
  • Junit的
  • 的logback
  • 码头
  • AspectJ的
  • 网状
  • java.util中
  • java.lang中

我误解了软件工程原理吗?或者开发商是否对此包装组织技术打折?

参考文献:

java spring dependencies circular-dependency package

8
推荐指数
1
解决办法
501
查看次数

如何在 C++ 中将匹配谓词的元素从一个向量转移到另一个向量?

给定两个可复制元素的向量和对这些项目的谓词,什么是有效且惯用的方法:

  1. 从第一个向量中删除匹配项
  2. 将匹配项附加到第二个向量

以下代码段反映了我目前的想法,但它确实需要两次遍历源向量。

vector<int> source{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
vector<int> target;

auto predicate = [](int n) { return n % 2 == 0; };

std::for_each(source.begin(), source.end(), [&predicate, &target](int n) {
    if (predicate(n)) {
        target.push_back(n);
    }
});

auto it = std::remove_if(source.begin(), source.end(), predicate);
source.erase(it, source.end());
Run Code Online (Sandbox Code Playgroud)

c++ algorithm stl vector std

2
推荐指数
1
解决办法
89
查看次数

标签 统计

algorithm ×1

c++ ×1

circular-dependency ×1

dependencies ×1

java ×1

package ×1

spring ×1

std ×1

stl ×1

vector ×1