Considerar:
Idioma,
Marco de referencia,
Contexto.
1. Idioma
Usar ∞ puede ser una solución para un máximo.
JavaScript, por ejemplo, tiene un infinito. C # no.
Ada, por ejemplo, tiene rangos. C # no lo hace.
En C #, la hay int.MaxValue
, pero no puede usarla en su caso. int.MaxValue
es el número entero máximo, 2,147,483,647. Si en su código, tiene un valor máximo de algo, como una presión máxima aceptada antes de que algo explote, usar 2,147,483,647 no tiene sentido.
2. Marco
.NET Framework es bastante inconsistente en este punto, y su uso de valores mágicos puede ser criticado.
Por ejemplo, "Hello".IndexOf("Z")
devuelve un valor mágico -1
. Tal vez hace que sea más fácil (¿verdad?) Manipular el resultado:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
en lugar de usar una estructura personalizada:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
pero no es intuitivo en absoluto. ¿Por qué -1
y no -123
? Un principiante también puede pensar erróneamente que eso 0
significa "No encontrado" o simplemente escribir mal (position >= 0)
.
3. Contexto
Si su código está relacionado con los tiempos de espera en los sockets de red, no es una mala idea usar algo que fue utilizado por todos durante décadas para ser coherente . Especialmente, 0
para un tiempo de espera es muy claro: es un valor que no puede ser cero. Usar una clase personalizada en este caso puede hacer que las cosas sean más difíciles 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; }
}
- ¿Puedo establecer
Duration
a 0 si IsTimeoutEnabled
es cierto?
- Si
IsTimeoutEnabled
es falso, ¿qué sucede si configuro Duration
a 100?
Esto puede conducir a múltiples errores. Imagine la siguiente pieza 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();
La operación se ejecuta durante diez segundos. ¿Puedes ver lo que está mal con este código, sin leer la documentación de la Timeout
clase?
Conclusión
null
expresa bien la idea de que el valor no está aquí. No está provisto. No disponible. No es un número, ni una cadena cero / vacía, ni nada. No lo use para valores máximos o mínimos.
int.MaxValue
está fuertemente relacionado con el lenguaje en sí. No lo use int.MaxValue
para un límite de velocidad máxima de Vehicle
clase o una velocidad máxima aceptable para una aeronave, etc.
Evita los valores mágicos como -1
en tu código. Son engañosos y conducen a errores en el código.
Cree su propia clase que sería más sencilla, con los valores mínimos / máximos especificados. Por ejemplo VehicleSpeed
puede tener VehicleSpeed.MaxValue
.
No siga ninguna directriz anterior y use valores mágicos si es una convención general durante décadas en un campo muy específico, utilizado por la mayoría de las personas que escriben código en este campo.
No olvides mezclar enfoques. Por ejemplo:
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.
¹ Puede crear su propio tipo que incluye infinito. Aquí, solo estoy hablando del int
tipo nativo .