我得到声纳警告来降低它的复杂性。我如何重构下面的代码,将其认知复杂度从18降低到允许的15?
@Override
public List<Audit> saveAudit(Object response, String user) {
List<Audit> arrlist = new ArrayList<>();
MSAUnderlyingStrategyDTO msaStrategy =(MSAUnderlyingStrategyDTO) response;
try {
Field[] members = MSAUnderlyingStrategyDTO.class.getDeclaredFields();
Class<?> c = Class.forName("com.broadridge.pm.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 if(m.getName().equalsIgnoreCase("msaUnderlyingPercentage"))
audit.setAttributeName("underlying_strategy_percentage");
else if(m.getName().equalsIgnoreCase("msaUnderlyingFoaId"))
audit.setAttributeName("underlying_strategy_code");
else if(m.getName().equalsIgnoreCase("styleId"))
audit.setAttributeName("style_node_id");
else if(m.getName().equalsIgnoreCase("strategyId"))
audit.setAttributeName("strategy_id");
else
audit.setAttributeName(m.getName());
arrlist.add(audit);
}
}
}
简单:通过将内容移动到帮助器方法中。
这里的真正要点是:代码质量不是由工具决定的。它需要开发人员对好代码的外观有一个共同的理解。
这需要:开发人员花时间学习和思考它。
如何降低给定代码段的复杂性?我在Sonarqube中得到了这个错误-->重构这个方法,将其认知复杂度从21降低到允许的15。
在Sonarqube上,我把这个问题作为一个关键问题,有人能帮我解决这个问题吗。这里是代码的详细信息,请让我知道如何用开关情况重构此代码:
> 如何重构该函数以减少复杂度 当我使用开关大小写时,代码的兼容性更高,那么如何减少它 如何实现此功能
我在重构这部分代码时遇到了问题。如何降低该代码的认知复杂性