1

为了说明我的问题,我创建了一个最小的虚构示例项目,它由三个类ServiceTransactionProduct. 磷

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依赖 package 中的任何东西domain

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

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

这将返回一个非空结果,即违反了约束 - 因为 jQAssistant 在这种情况下创建了and之间的:DEPENDS_ON关系,这感觉违反直觉,因为既没有导入也没有直接引用in 。ServiceProductorg.example.domain.ProductService

这导致我提出以下问题:

  • 这种行为是有意的还是无意的?
  • 有没有办法区分在父类型中导入和使用依赖项的“直接”依赖项和我的示例中所示的“间接”依赖项?
4

1 回答 1

1

这种行为在技术和概念层面都是有意的:

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

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

于 2021-08-06T09:04:43.757 回答