Existem vários problemas com esse trecho de código, que, a propósito, podem ser abreviados assim:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
Não está claro por que uma pessoa é um caso especial. Suponho que exista uma regra comercial específica que indique que receber dinheiro de uma pessoa é radicalmente diferente de receber dinheiro de várias pessoas. No entanto, eu tenho que ir e olhar dentro de ambosgetMoneyIfHasOnePerson
e getMoney
, na esperança de entender por que existem casos distintos.
O nome getMoneyIfHasOnePerson
não parece certo. Pelo nome, eu esperaria que o método verifique se existe uma única pessoa e, se for esse o caso, receba dinheiro dele; caso contrário, não faça nada. No seu código, não é isso que está acontecendo (ou você está fazendo a condição duas vezes).
Existe algum motivo para retornar um List<Money>
uma coleção em vez de uma coleção?
Voltando à sua pergunta, porque não está claro por que existe um tratamento especial para uma pessoa, o dígito um deve ser substituído por uma constante, a menos que exista outra maneira de tornar as regras explícitas. Aqui, um não é muito diferente de qualquer outro número mágico. Você pode ter regras comerciais informando que o tratamento especial se aplica a uma, duas ou três pessoas ou apenas a mais de doze pessoas.
Como posso distinguir o contexto para escolher a melhor solução?
Você faz o que torna seu código mais explícito.
Exemplo 1
Imagine o seguinte pedaço de código:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
Aqui zero é um valor mágico? O código é bastante claro: se não houver elementos na sequência, não vamos processá-lo e retornar um valor especial. Mas esse código também pode ser reescrito assim:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
Aqui, não mais constante, e o código é ainda mais claro.
Exemplo 2
Pegue outro pedaço de código:
const result = Math.round(input * 1000) / 1000;
Não leva muito tempo para entender o que ele faz em linguagens como JavaScript que não possuem round(value, precision)
sobrecarga.
Agora, se você deseja introduzir uma constante, como seria chamada? O termo mais próximo que você pode obter é Precision
. Então:
const precision = 1000;
const result = Math.round(input * precision) / precision;
Melhora a legibilidade? Pode ser. Aqui, o valor de uma constante é bastante limitado, e você pode se perguntar se realmente precisa executar a refatoração. O bom aqui é que agora, a precisão é declarada apenas uma vez; portanto, se ela mudar, você não corre o risco de cometer um erro como:
const result = Math.round(input * 100) / 1000;
alterando o valor em um local e esquecendo de fazê-lo no outro.
Exemplo 3
A partir desses exemplos, você pode ter a impressão de que os números devem ser substituídos por constantes em todos os casos . Isso não é verdade. Em algumas situações, ter uma constante não leva à melhoria do código.
Pegue o seguinte pedaço de código:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
Se você tentar substituir zeros por uma variável, a dificuldade seria encontrar um nome significativo. Como você o nomearia? ZeroPosition
? Base
? Default
? A introdução de uma constante aqui não aprimora o código de forma alguma. Isso tornaria um pouco mais longo, e exatamente isso.
Tais casos são contudo raros. Portanto, sempre que encontrar um número no código, faça um esforço para descobrir como o código pode ser refatorado. Pergunte a si mesmo se existe um significado comercial para o número. Se sim, uma constante é obrigatória. Se não, como você nomearia o número? Se você encontrar um nome significativo, isso é ótimo. Caso contrário, é provável que você encontre um caso em que a constante seja desnecessária.
persons
vem e o que descreve? Seu código não possui comentários, portanto é difícil adivinhar o que está fazendo.