software metricas istqb ingenieria for complejidad como ciclomatica ciclo calcularla java validation cyclomatic-complexity

java - istqb - complejidad ciclomatica metricas



¿Cómo reducir la complejidad ciclomática? (2)

Otro enfoque sería hacer cumplir ese contrato en el objeto Solicitud en sí. Si se requiere un campo o no puede ser nulo, dígalo cuando se cree la Solicitud.

Cree la Solicitud de tal manera que sea 100% válida y lista para funcionar cuando exista el constructor.

También crearía esa versión de String en el método Request toString (). Debería saber cómo renderizarse.

Estoy trabajando en una clase que envía un RequestDTO a un servicio web. Necesito validar la solicitud antes de que sea enviada.

La solicitud se puede enviar desde 3 lugares diferentes y existen diferentes reglas de validación para cada "tipo de solicitud", por ejemplo, solicitud1 debe tener nombre y número de teléfono, solicitud2 debe tener dirección, etc.)

Tengo un DTO que contiene una larga lista de campos (nombre, dirección, ciudad, número de teléfono, etc.) y es el mismo DTO enviado independientemente del tipo de solicitud que sea.

He creado 3 métodos de validación diferentes y, según el tipo, se llama al método apropiado.

En cada uno de estos métodos tengo una larga lista de if-else para verificar los campos que son necesarios para cada tipo de solicitud.

private void validateRequest1(Request request) { StringBuilder sb = new StringBuilder(); if (null == request) { throw new IllegalArgumentException("Request is null"); } if (isFieldEmpty(request.getName())) { *see below sb.append("name,")); } if (isFieldEmpty(request.getStreet())) { sb.append("street,")); } ...

isFieldEmpty() comprueba la cadena para null y isEmpty() y devuelve un booleano

Esto me da una complejidad ciclomática de 28 en uno de esos métodos, así que mi pregunta es ... ¿es posible reducir esta complejidad? - Si es así, ¿cómo voy a hacerlo?

En última instancia, necesito verificar muchos campos y no puedo ver cómo se puede hacer esto sin muchos controles: /


Una forma fácil es promover el cheque en un método separado:

private String getAppendString(String value, String appendString) { if (value == null || value.isEmpty()) { return ""; } return appendString; }

Y luego puedes usar este método en lugar de los bloques if :

sb.append(getAppendString(request.getStreet(), "street,");

Esto reducirá la complejidad de 28 a 3. Recuerde siempre: los recuentos de alta complejidad son una indicación de que un método está tratando de hacer demasiado. La complejidad se puede tratar dividiendo el problema en partes más pequeñas, como hicimos aquí.