如何区分 jQAssistant 中的 "Direct" 和 "Indirect" 依赖关系
How to differentiate between "Direct" and "Indirect" dependencies in jQAssistant
为了说明我的问题,我创建了 a minimal, fictional example project,它由三个 类、Service
、Transaction
和 Product
组成。 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 在 Service
和 Product
之间创建了 :DEPENDS_ON
关系,这感觉违反直觉,因为在 Service
.
中既没有导入也没有直接引用 org.example.domain.Product
这让我想到以下问题:
- 这种行为是有意还是无意?
- 有没有办法区分在父类型中导入和使用依赖项的“直接”依赖项和我的示例中所示的“间接”依赖项?
该行为在技术和概念层面都是有意为之:
技术:在扫描 Java class 时,会聚合所有遇到的依赖项。在示例中,getProduct() returns 一个 Product 并且该 Product 用于调用其上的方法,因此它被跟踪。
概念:代码字面上 取决于产品。如果您从 class 路径中删除该类型,则显示的代码将中断。即使没有导入或显式 field/variable/parameter/return 类型声明,依赖关系仍然存在。如果您想重构(例如,将域和服务拆分为不同的工件),您还需要解决这种依赖性。所以你可以反过来看:即使你没有在代码中明确地看到依赖关系,它也会被 jQA 看到。
为了说明我的问题,我创建了 a minimal, fictional example project,它由三个 类、Service
、Transaction
和 Product
组成。 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 在 Service
和 Product
之间创建了 :DEPENDS_ON
关系,这感觉违反直觉,因为在 Service
.
org.example.domain.Product
这让我想到以下问题:
- 这种行为是有意还是无意?
- 有没有办法区分在父类型中导入和使用依赖项的“直接”依赖项和我的示例中所示的“间接”依赖项?
该行为在技术和概念层面都是有意为之:
技术:在扫描 Java class 时,会聚合所有遇到的依赖项。在示例中,getProduct() returns 一个 Product 并且该 Product 用于调用其上的方法,因此它被跟踪。
概念:代码字面上 取决于产品。如果您从 class 路径中删除该类型,则显示的代码将中断。即使没有导入或显式 field/variable/parameter/return 类型声明,依赖关系仍然存在。如果您想重构(例如,将域和服务拆分为不同的工件),您还需要解决这种依赖性。所以你可以反过来看:即使你没有在代码中明确地看到依赖关系,它也会被 jQA 看到。