Il y a plusieurs problèmes avec ce morceau de code, qui, soit dit en passant, peut être raccourci comme ceci:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
On ne sait pas pourquoi une personne est un cas spécial. Je suppose qu'il existe une règle commerciale spécifique qui dit qu'obtenir de l'argent d'une seule personne est radicalement différent de recevoir de l'argent de plusieurs personnes. Cependant, je dois aller voir à l'intérieur des deux getMoneyIfHasOnePerson
et getMoney
, en espérant comprendre pourquoi il y a des cas distincts.
Le nom getMoneyIfHasOnePerson
ne semble pas correct. D'après le nom, je m'attendrais à ce que la méthode vérifie s'il y a une seule personne et, si c'est le cas, obtienne de l'argent de sa part; sinon, ne faites rien. D'après votre code, ce n'est pas ce qui se passe (ou vous faites la condition deux fois).
Y a-t-il une raison de retourner une collection List<Money>
plutôt qu'une collection?
Revenons à votre question, car il n'est pas clair pourquoi il existe un traitement spécial pour une personne, le chiffre un devrait être remplacé par une constante, sauf s'il existe un autre moyen de rendre les règles explicites. Ici, on n'est pas très différent de tout autre nombre magique. Vous pourriez avoir des règles commerciales indiquant que le traitement spécial s'applique à une, deux ou trois personnes, ou seulement à plus de douze personnes.
Comment distinguer le contexte pour choisir la meilleure solution?
Vous faites tout ce qui rend votre code plus explicite.
Exemple 1
Imaginez le morceau de code suivant:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
Le zéro est-il ici une valeur magique? Le code est assez clair: s'il n'y a pas d'éléments dans la séquence, ne la traitons pas et retournons une valeur spéciale. Mais ce code peut également être réécrit comme ceci:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
Ici, pas plus constant, et le code est encore plus clair.
Exemple 2
Prenez un autre morceau de code:
const result = Math.round(input * 1000) / 1000;
Il ne faut pas trop de temps pour comprendre ce qu'il fait dans des langages tels que JavaScript qui n'ont pas de round(value, precision)
surcharge.
Maintenant, si vous voulez introduire une constante, comment l'appellerait-elle? Le terme le plus proche que vous pouvez obtenir est Precision
. Donc:
const precision = 1000;
const result = Math.round(input * precision) / precision;
Améliore-t-elle la lisibilité? Ça pourrait être. Ici, la valeur d'une constante est plutôt limitée et vous pouvez vous demander si vous avez vraiment besoin d'effectuer le refactoring. La bonne chose ici est que maintenant, la précision n'est déclarée qu'une seule fois, donc si elle change, vous ne risquez pas de faire une erreur telle que:
const result = Math.round(input * 100) / 1000;
changer la valeur dans un endroit et oublier de le faire dans l'autre.
Exemple 3
À partir de ces exemples, vous pouvez avoir l'impression que les nombres doivent être remplacés par des constantes dans tous les cas . Ce n'est pas vrai. Dans certaines situations, avoir une constante ne conduit pas à une amélioration du code.
Prenez le morceau de code suivant:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
Si vous essayez de remplacer les zéros par une variable, la difficulté serait de trouver un nom significatif. Comment le nommeriez-vous? ZeroPosition
? Base
? Default
? L'introduction d'une constante ici n'améliorerait en rien le code. Cela le rendrait légèrement plus long, et juste cela.
De tels cas sont cependant rares. Donc, chaque fois que vous trouvez un numéro dans le code, faites l'effort d'essayer de trouver comment le code peut être refactorisé. Demandez-vous s'il y a une signification commerciale au nombre. Si oui, une constante est obligatoire. Si non, comment nommeriez-vous le numéro? Si vous trouvez un nom significatif, c'est parfait. Sinon, vous avez probablement trouvé un cas où la constante n'est pas nécessaire.
persons
vient-il et que décrit-il? Votre code n'a aucun commentaire, il est donc difficile de deviner ce qu'il fait.