ArchUnit 规则阻止访问派生 类?
ArchUnit Rule to prevent access to derived classes?
一位同事进行了一些重构,并将一个方法移至 superclass,以便能够从另一个子 class 重用它。 IDE 处理得很快,没有任何抱怨。
然而,该方法在内部引用了一个常量,该常量 not 随该方法移动,即父 class 因此现在在其子 [=] 之一中引用常量19=]es 这当然是不行的!
我如何表述 ArchUnit 规则以防止父级对 members/methods/local classes 和 enums/etc 进行此类引用。在 child-classes 中(或者一般来说:classes 中的任何东西在层次结构的下方)?
对于直接依赖,可以使用下面的自定义ArchCondition
:
@ArchTest
ArchRule rule = noClasses().should(new ArchCondition<JavaClass>("depend on their children") {
@Override
public void check(JavaClass parentClass, ConditionEvents events) {
parentClass.getDirectDependenciesFromSelf().stream()
.filter(dependency -> dependency.getTargetClass() != parentClass
&& dependency.getTargetClass().isAssignableTo(parentClass.getName()))
.forEach(dependency -> events.add(satisfied(dependency, dependency.getDescription())));
}
});
它可以很容易地适应也捕获传递依赖,例如在这个例子中:
class Parent {
Friend friend;
}
class Friend {
Child child;
}
class Child extends Parent {
}
基本可以替换getDirectDependenciesFromSelf
with getTransitiveDependenciesFromSelf
:
@ArchTest
ArchRule rule = noClasses().should(new ArchCondition<JavaClass>("depend on their children") {
@Override
public void check(JavaClass parentClass, ConditionEvents events) {
parentClass.getTransitiveDependenciesFromSelf().stream()
.filter(dependency -> dependency.getTargetClass() != parentClass
&& dependency.getTargetClass().isAssignableTo(parentClass.getName()))
.forEach(dependency -> events.add(satisfied(dependency, parentClass.getName()
+ " (transitively) depends on its child: " + dependency.getDescription())));
}
});
仅供参考:我正在使用以下静态导入:
import static com.tngtech.archunit.lang.SimpleConditionEvent.satisfied;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;
一位同事进行了一些重构,并将一个方法移至 superclass,以便能够从另一个子 class 重用它。 IDE 处理得很快,没有任何抱怨。 然而,该方法在内部引用了一个常量,该常量 not 随该方法移动,即父 class 因此现在在其子 [=] 之一中引用常量19=]es 这当然是不行的!
我如何表述 ArchUnit 规则以防止父级对 members/methods/local classes 和 enums/etc 进行此类引用。在 child-classes 中(或者一般来说:classes 中的任何东西在层次结构的下方)?
对于直接依赖,可以使用下面的自定义ArchCondition
:
@ArchTest
ArchRule rule = noClasses().should(new ArchCondition<JavaClass>("depend on their children") {
@Override
public void check(JavaClass parentClass, ConditionEvents events) {
parentClass.getDirectDependenciesFromSelf().stream()
.filter(dependency -> dependency.getTargetClass() != parentClass
&& dependency.getTargetClass().isAssignableTo(parentClass.getName()))
.forEach(dependency -> events.add(satisfied(dependency, dependency.getDescription())));
}
});
它可以很容易地适应也捕获传递依赖,例如在这个例子中:
class Parent {
Friend friend;
}
class Friend {
Child child;
}
class Child extends Parent {
}
基本可以替换getDirectDependenciesFromSelf
with getTransitiveDependenciesFromSelf
:
@ArchTest
ArchRule rule = noClasses().should(new ArchCondition<JavaClass>("depend on their children") {
@Override
public void check(JavaClass parentClass, ConditionEvents events) {
parentClass.getTransitiveDependenciesFromSelf().stream()
.filter(dependency -> dependency.getTargetClass() != parentClass
&& dependency.getTargetClass().isAssignableTo(parentClass.getName()))
.forEach(dependency -> events.add(satisfied(dependency, parentClass.getName()
+ " (transitively) depends on its child: " + dependency.getDescription())));
}
});
仅供参考:我正在使用以下静态导入:
import static com.tngtech.archunit.lang.SimpleConditionEvent.satisfied;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClasses;