如何区分 jQAssistant 中的 "Direct" 和 "Indirect" 依赖关系

How to differentiate between "Direct" and "Indirect" dependencies in jQAssistant

为了说明我的问题,我创建了 a minimal, fictional example project,它由三个 类、ServiceTransactionProduct 组成。 P

package org.example;

public class Service {
    public Service(Transaction transaction) {
        int buyerId = transaction.getProduct().getId();
    }
}

类型Product在单独的包中domain

package org.example.domain;

public class Product {
    // [...]
    public int getId() {
        return this.id;
    }
}

为了这个例子,假设我想避免 Service 依赖包 domain.

中的任何内容

我可以使用这个查询来确保这一点:

MATCH
    (c {name:"Service"})-[:DEPENDS_ON]->(d)
WHERE
    d.fqn STARTS WITH "org.example.domain"
RETURN
    c.fqn, d.fqn

这 returns 一个非空结果,即违反了约束 - 因为在这种情况下 jQAssistant 在 ServiceProduct 之间创建了 :DEPENDS_ON 关系,这感觉违反直觉,因为在 Service.

中既没有导入也没有直接引用 org.example.domain.Product

这让我想到以下问题:

该行为在技术和概念层面都是有意为之:

技术:在扫描 Java class 时,会聚合所有遇到的依赖项。在示例中,getProduct() returns 一个 Product 并且该 Product 用于调用其上的方法,因此它被跟踪。

概念:代码字面上 取决于产品。如果您从 class 路径中删除该类型,则显示的代码将中断。即使没有导入或显式 field/variable/parameter/return 类型声明,依赖关系仍然存在。如果您想重构(例如,将域和服务拆分为不同的工件),您还需要解决这种依赖性。所以你可以反过来看:即使你没有在代码中明确地看到依赖关系,它也会被 jQA 看到。