如何重构以下方法以降低复杂性?
protected Specification<Test> createSpecification(TestCriteria criteria) {
Specification<Test> specification = Specification.where(null);
if (criteria != null) {
if (criteria.getId() != null) {
specification = specification.and(buildRangeSpecification(criteria.getId(), test_.id));
}
if (criteria.getCustomerName() != null) {
specification = specification.and(buildStringSpecification(criteria.getCustomerName(), Test_.customerName));
}
if (criteria.getAddress() != null) {
specification = specification.and(buildStringSpecification(criteria.getAddress(), Test_.address));
}
(...)
return specification;
}
声纳抱怨的问题是:重构此方法以将其认知复杂度从 17 降低到允许的 15。
谢谢!
考虑反转一些 if 条件并使用提前返回。
protected Specification<Test> createSpecification(TestCriteria criteria) {
Specification<Test> specification = Specification.where(null);
if (criteria == null) return specification;
// split into methods
addIdSpecification(criteria.getId(), specification);
addStringSpecification(criteria.getCustomerName(), Test_.customerName, specification);
addStringSpecification(criteria.getAddress(), Test_.address, specification);
// Add other criteria as needed
(more)
return specification;
}
private void addIdSpecification(Long id, Specification<Test> specification) {
if (id == null) return;
specification = specification.and(buildRangeSpecification(id, test_.id));
}
...
但是认知复杂性取决于更多因素,例如包括深度等等......