1

我有两个包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? 谢谢!

4

1 回答 1

1

我可能会使用两个规则。

@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)。

于 2019-07-22T11:19:31.507 回答