gpt4 book ai didi

java - ArchUnit:检查包是否相互依赖的最优雅的方法

转载 作者:行者123 更新时间:2023-11-30 05:43:14 25 4
gpt4 key购买 nike

我有两个包com.myapp.foocom.myapp.bar,我想知道显式检查这两个包(和只有那些,因为还有一些 com.myapp.XX) 彼此不依赖。

这就是我现在所拥有的(工作出色):

    SliceAssignment packagesFooAndBar = new SliceAssignment() {
@Override
public String getDescription() {
return "foo and bar";
}

@Override
public SliceIdentifier getIdentifierOf(JavaClass javaClass) {
if (javaClass.getPackageName().startsWith("com.myapp.foo")) {
return SliceIdentifier.of("foo");
}
if (javaClass.getPackageName().startsWith("com.myapp.bar")) {
return SliceIdentifier.of("bar");
}
return SliceIdentifier.ignore();
}
};
@ArchTest
final ArchRule packagesFooAndBarNotDependOnEachOther = SlicesRuleDefinition
.slices()
.assignedFrom(packagesFooAndBar)
.should()
.notDependOnEachOther();

是否有更优雅的方法,也许不使用 SliceAssignment?谢谢!

最佳答案

我可能会使用两条规则。

@ArchTest
final ArchRule fooShouldNotDependOnBar = ArchRuleDefinition
.classes()
.that().resideInAnyPackage("com.myapp.foo")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("com.myapp.bar");

@ArchTest
final ArchRule barShouldNotDependOnFoo = ArchRuleDefinition
.classes()
.that().resideInAnyPackage("com.myapp.bar")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("com.myapp.foo");

如果您想在单个规则中编写相同的内容而不使用自定义类,则以下内容应该可行。我不确定我是否会称其为“优雅”,因为它看起来有点复杂。可能有更好的方法将其编写在单个规则中。

@ArchTest
final ArchRule packagesFooAndBarNotDependOnEachOther = SlicesRuleDefinition
.slices()
.matching("com.myapp.(*)")
.should()
.notDependOnEachOther()
.ignoreDependency(
JavaClass.Predicates.resideOutsideOfPackages("com.myapp.foo", "com.myapp.bar"),
DescribedPredicate.alwaysTrue())
.ignoreDependency(
DescribedPredicate.alwaysTrue(),
JavaClass.Predicates.resideOutsideOfPackages("com.myapp.foo", "com.myapp.bar"))
);

该规则首先匹配com.myapp的所有直接子包。第一个 ignoreDependency 然后排除给定包之外的类的所有依赖项(以允许例如 com.myapp.xx 访问 com.myapp.foo)。第二个 ignoreDependency 排除给定包对任何外部包的所有依赖项(以允许例如 com.myapp.foo 访问 com.myapp.xx) >).

关于java - ArchUnit:检查包是否相互依赖的最优雅的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301032/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com