Considerar:
Língua,
Estrutura,
Contexto.
1. Idioma
Usar ∞ pode ser uma solução para o máximo.
JavaScript, por exemplo, tem um infinito. C # não¹.
Ada, por exemplo, tem intervalos. C # não.
Em C #, existe int.MaxValue
, mas você não pode usá-lo no seu caso. int.MaxValue
é o número inteiro máximo, 2.147.483.647. Se no seu código, você tem um valor máximo de algo, como uma pressão máxima aceita antes que algo exploda, usar 2.147.483.647 não faz sentido.
2. Enquadramento
O .NET Framework é bastante inconsistente nesse ponto, e seu uso de valores mágicos pode ser criticado.
Por exemplo, "Hello".IndexOf("Z")
retorna um valor mágico -1
. É talvez torna mais fácil (não é?) Para manipular o resultado:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
em vez de usar uma estrutura personalizada:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
mas não é intuitivo. Por que -1
e não -123
? Um iniciante também pode pensar erroneamente que 0
significa "Não encontrado" também ou apenas digitar errado (position >= 0)
.
3. Contexto
Se o seu código estiver relacionado a tempos limites nos soquetes de rede, usar algo que foi usado por todos por décadas para manter a consistência não é uma má idéia . Especialmente, 0
pois um tempo limite é muito claro: é um valor que não pode ser zero. Usar uma classe personalizada nesse caso pode tornar as coisas mais difíceis de entender:
class Timeout
{
// A value indicating whether there is a timeout.
public bool IsTimeoutEnabled { get; set; }
// The duration of the timeout, in milliseconds.
public int Duration { get; set; }
}
- Posso definir
Duration
como 0 se IsTimeoutEnabled
for verdadeiro?
- Se
IsTimeoutEnabled
for falso, o que acontece se eu definir Duration
como 100?
Isso pode levar a vários erros. Imagine o seguinte pedaço de código:
this.currentOperation.Timeout = new Timeout
{
// Set the timeout to 200 ms.; we don't want this operation to be longer than that.
Duration = 200,
};
this.currentOperation.Run();
A operação é executada por dez segundos. Você consegue ver o que há de errado com esse código, sem ler a documentação da Timeout
classe?
Conclusão
null
expressa bem a ideia de que o valor não está aqui. Não é fornecido. Não disponível. Não é um número, nem uma string zero / vazia ou qualquer outra coisa. Não o utilize para valores máximos ou mínimos.
int.MaxValue
está fortemente relacionado à própria linguagem. Não use int.MaxValue
para um limite máximo de velocidade da Vehicle
classe ou uma velocidade máxima aceitável para uma aeronave etc.
Evite valores mágicos como -1
no seu código. Eles são enganosos e levam a erros no código.
Crie sua própria classe, que seria mais direta, com os valores mínimo / máximo especificados. Por exemplo, VehicleSpeed
pode ter VehicleSpeed.MaxValue
.
Não siga nenhuma diretriz anterior e não use valores mágicos se for uma convenção geral por décadas em um campo muito específico, usado pela maioria das pessoas que escreve código nesse campo.
Não se esqueça de misturar abordagens. Por exemplo:
class DnsQuery
{
public const int NoTimeout = 0;
public int Timeout { get; set; }
}
this.query.Timeout = 0; // For people who are familiar with timeouts set to zero.
// or
this.query.Timeout = DnsQuery.NoTimeout; // For other people.
¹ Você pode criar seu próprio tipo, que inclui o infinito. Aqui, estou falando int
apenas do tipo nativo .