重构此方法,将其认知复杂性从18降低到允许的15

  • 本文关键字:此方法 复杂性 认知 重构 java
  • 更新时间 :
  • 英文 :


我正在获取声纳警告以降低其复杂性。我如何重构下面的代码,将其认知复杂性从18降低到允许的15?

@Override


try {
Field[] members = MSAUnderlyingStrategyDTO.class.getDeclaredFields();
Class<?> c = Class.forName("com.model.MSAUnderlyingStrategyDTO");
for (Field m : members) {
if (!m.getName().equalsIgnoreCase("serialVersionUID")
&& !m.getName().equalsIgnoreCase("DATE_FORMAT")) {
var audit = new Audit();
audit.setAuditType("ADD");
audit.setClientId(1);
audit.setEntityId(msaStrategy.getStrategyId());
audit.setCreatedBy(user);
audit.setCreatedOn(new Timestamp(System.currentTimeMillis()));
audit.setEntityName(MSASTRATEGY);
audit.setAttributeFromValue(null);
Object obj = c.getDeclaredMethod(createMethodName(m.getName())).invoke(msaStrategy);
if(obj!=null&& !obj.toString().isEmpty()) {
audit.setAttributeToValue(obj.toString());
if(m.getName().equalsIgnoreCase("msaUnderlyingStrategyName"))
audit.setAttributeName("underlying_strategy_name");
else

简单:通过将内容移动到辅助方法中。

这里真正的要点是:代码质量不是来自工具。它需要开发人员有一个共同的理解好的代码应该是什么样子。

这需要:开发人员花时间学习和思考。

长话短说:从读一本好书开始,喜欢"清洁代码";罗伯特·C·马丁。例如,这本书表明,在方法中总是只有一个抽象级别。实现这一目标的一种方法是:通过许多小助手方法。您的代码有4:try-for-if-if。理论上,每个主体(try/for/if/if(都可以进入自己的方法。

意思是:你可以通过将复杂的检查转移到不同的地方来降低这一方法的复杂性。替代方案,您也可以完全重组代码。正如用户Stultuske所建议的:最终,您的代码正在进行某种映射。其中一个解决方案是使用映射,它知道将strategyId映射到strategy_id。(注意:许多这样做DTO映射的库实际上已经内置了将名称从camelCase重新生成为snake_case的策略。

解决这类问题的一个简单步骤是检查for循环。

可能会将for循环的内容提取到方法中。

for (Field m : members) {
Audit a = createAudit(arrlist, m);
if(a!=null) arrlist.add(audit);
}