我有两个软件包com.myapp.foo
和com.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
?谢谢!
答案 0 :(得分:0)
我可能会使用两个规则。
@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
)。