Coup de Grace

关于演进式架构的lint

又是来自大型外包公司TW的概念.

虽然概念没什么特别的,但是周边产品跟方法论Checkist我很喜欢.

那么有关演进式架构

可以看这个Slide

实际说人话的话大概就是:

那本书我没买,我预感内容时效性太强.

今天要说的是架构检查框架

ArchUnit

一个跑在单元测试里的架构Lint工具

大部分的功能你可以用切面跟反射做到

不过这工具的抽象很好,语义化的api用起来也很舒服.


用法

模式都如下:

classes that ${PREDICATE} should ${CONDITION} because ${REASON}

大部分用法可以参照上面的文档初步使用.

下面列举一下用测试用例迅速榨干这个工具有用的部分.

其他的importOption啊 slice之类的就不表了,同理.

值得说一下的是自定义的部分,可以参考这里

那么我们简单做一个扫描 带有@MyData注解的类 都应该具有一个名叫toMyString()的方法Rule.

哦忘了说,这边单侧的执行粒度是Rule. 由上面的expression组合而成.

DescribedPredicate

public static final DescribedPredicate<JavaClass> areMyData =
    new DescribedPredicate<JavaClass>("是MyData类") {
        @Override
        public boolean apply(JavaClass input) {
            return input.isAnnotatedWith(MyData.class);
        }
    };

ArchCondition

public static final ArchCondition<JavaClass> havaAMethodNamedToMyString =
    new ArchCondition<JavaClass>("有一个叫toMyString()的方法") {
        @Override
        public void check(JavaClass item, ConditionEvents events) {
            String message = "MyData " + item.getName();
            if (item.getMethods().stream().noneMatch(
                        mtd -> StringUtils.equals("toMyString", mtd.getName()))) {
                events.add(SimpleConditionEvent.violated(item,
                    message + "没有方法名称为toMyString()"));
            }
        }
    };

ArchRule

@ArchTest
public static final ArchRule myRule = classes()
    .that(areMyData)
    .should(havaAMethodNamedToMyString)
    .because("just sample");

ok,你得到了.