0
votes

Comment réduire la complexité cyclomatique de cette méthode Java

J'ai la prochaine mise en œuvre de Java, mais elle a une question de sonarqube et je ne sais pas comment réduire la méthode. XXX PRE>

Lorsque l'utilisateur est un pojo d'utilisateurs P >

class Users {

String userId;

String email;

String name;

    //getters and setters...
}


1 commentaires

Si l'importance de l'e-mail et du nom était cohérente, cela pourrait être exprimé dans une seule expression, mais ils échangent des scores importants en fonction de la nullité ou non. Pouvez-vous le changer en sinon si (user.getname ()! = Null) {retour 7; } elier si (utilisateur.getemail ()! = null) {retour 6; } ?


4 Réponses :


0
votes

Casser-le à une autre méthode réduirait la complexité de la méthode elle-même. Quelque chose comme xxx


0 commentaires

0
votes

Donc, tout d'abord, nous devrions mettre l'accent sur quelle complexité cognitive est tout au sujet et comment il serait logique de le réduire. Principalement en extrayant des choses qui appartiennent ensemble.

Lorsque vous regardez votre méthode avec les 4 premières conditions, ils partagent une similitude et c'est la vérification de l'ID utilisateur. Cela signifie que vous pouvez facilement combiner les chèques ci-dessous dans une branche. Qui sera plus facile à saisir et offre également une bonne voie pour l'extraction xxx

en fonction de celle-ci, vous pouvez extraire facilement comme xxx

Maintenant, nous n'avons que quatre branches principales dans la première si - un développeur qui ne se soucie pas des cas où l'ID utilisateur est NULL, peut passer de simples sauter et il n'aura pas besoin de traiter toutes ces branches. D'où comme si cela a besoin, il n'a qu'une seule condition à la première vérification, et le reste est plus facile à saisir.

Pour gérer un tel cas, vous devriez toujours penser à la façon dont quelqu'un connaît le code de lecture. Quel avantage il obtient et vous pouvez réduire la charge cognitive afin qu'il soit plus facile de comprendre le développeur suivant. Les machines n'auront jamais de problèmes de lecture de notre code, mais de la rédaction de code qui est facile à lire par les humains, c'est la partie difficile.

Sidenote: Je préférerais retravailler vos méthodes DAO et, dans ce cas, mettez cette logique dans la DAO, en fournissant une carte des paramattres à la DAO, et laissez le DAO gérer une telle logique. Comme dao.find (mappe paramètres) et vous pouvez gérer cela en fonction des champs disponibles ou non disponibles.


0 commentaires

0
votes

Voici le code de complexité réduit,

    boolean userIdAvailable = user.getUserId() != null;
boolean emailAvailable = user.getEmail() != null;
boolean nameAvailable = user.getName();
short response = checkAll(userIdAvailable, emailAvailable, nameAvailable);
if (response == 0) {
    response = checkEmailAndName(emailAvailable, nameAvailable);
    if (response == 0) {
        checkUserIdAndName(userIdAvailable, nameAvailable);
    }
}

short checkAll(boolean userIdAvailable, boolean emailAvailable, boolean nameAvailable) {
    return userIdAvailable && emailAvailable && nameAvailable ? 1 : 0;
}

short checkEach(boolean userIdAvailable, boolean emailAvailable, boolean nameAvailable) {
    short response = 0;
    if(userIdAvailable) {
        response = 4;
    } else if(emailAvailable) {
        response = 7;
    } else if(nameAvailable) {
        response = 6;
    }
    return response;
}

short checkUserIdAndEmail(boolean emailAvailable, boolean userIdAvailable) {
    return userIdAvailable && emailAvailable ? 2 : 0
}

short checkEmailAndName(boolean emailAvailable, boolean nameAvailable) {
    return emailAvailable && nameAvailable ? 5 : 0
}

short checkUserIdAndName(boolean userIdAvailable, boolean nameAvailable) {
    return userIdAvailable && nameAvailable ? 3 : 0
}


0 commentaires

3
votes

Qu'en est-il du modèle de chaîne de responsabilité.

public abstract class Handler {

    protected Handler next;

    public abstract Integer process(User user);
}

  Handler checkIdEmailName = new Handler() {
      @Override
      public Integer process(User user) {
          boolean check = false;
          if (check) {
              return 1;
          }else {
              return next.process(user);
          }
      }
  };
  Handler checkIdEmail = new Handler() {
      @Override
      public Integer process(User user) {
          boolean check = false;
          if (check) {
              return 1;
          }else {
              return next.process(user);
          }
      }
  };
  checkIdEmailName.next = checkIdEmail;

  Integer result = checkIdEmailName.process(new User());


1 commentaires

Merci beaucoup, je ne connaissais pas le modèle de chaîne de responsabilité, alors vient de rechercher dans Google et que ce modèle est très utile, avec cela, j'ai réparé le problème de sonar. Merci et salutations.