web-dev-qa-db-fra.com

Comment réduire la complexité cyclomatique?

Je travaille sur une classe qui envoie un RequestDTO à un service Web. J'ai besoin de valider la demande avant de l'envoyer.

La demande peut être envoyée à partir de 3 endroits différents et il existe différentes règles de validation pour chaque "type de demande", par ex. request1 doit avoir un nom et un numéro de téléphone, request2 doit avoir une adresse, etc.)

J'ai un DTO qui contient une longue liste de champs (nom, adresse, ville, numéro de téléphone, etc.) et c'est le même DTO envoyé quel que soit le type de demande.

J'ai créé 3 méthodes de validation différentes et en fonction du type, la méthode appropriée est appelée.

Dans chacune de ces méthodes, j'ai une longue liste de if-else pour vérifier les champs qui sont nécessaires pour chaque type de demande.

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() vérifie la chaîne pour null et isEmpty() et retourne un booléen

Cela me donne une complexité cyclomatique de 28 dans l'une de ces méthodes, donc ma question est ... est-il possible de réduire cette complexité? - si oui, comment pourrais-je procéder?

En fin de compte, je dois vérifier beaucoup de champs et je ne vois pas comment cela peut se faire sans beaucoup de contrôles: /

28
Herter

Un moyen simple consiste à promouvoir le chèque dans une méthode distincte:

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

Et puis vous pouvez utiliser cette méthode au lieu des blocs if:

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

Cela réduira la complexité de 28 à 3. Rappelez-vous toujours: un nombre élevé de complexité indique qu'une méthode essaie d'en faire trop. La complexité peut être traitée en divisant le problème en petits morceaux, comme nous l'avons fait ici.

35
EmirCalabuch

Une autre approche consisterait à appliquer ce contrat dans l'objet Request lui-même. Si un champ est obligatoire ou ne peut pas être nul, dites-le lors de la création de la demande.

Créez la demande de manière à ce qu'elle soit 100% valide et prête à l'emploi lorsque le constructeur existe.

Je créerais également cette version String dans la méthode Request toString (). Il doit savoir se rendre.

4
duffymo