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. Lorsque l'utilisateur est un pojo d'utilisateurs P > class Users {
String userId;
String email;
String name;
//getters and setters...
}
4 Réponses :
Casser-le à une autre méthode réduirait la complexité de la méthode elle-même.
Quelque chose comme
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 p> en fonction de celle-ci, vous pouvez extraire facilement comme p> 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. P> 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. P> 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
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
}
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());
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.
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; } code>?