Considérer:
La langue,
Cadre,
Le contexte.
1. Langue
L'utilisation de ∞ peut être une solution pour un maximum.
JavaScript, par exemple, a une infinité. C # ne fait pas¹.
Ada, par exemple, a des plages. C # ne le fait pas.
En C #, il y en a int.MaxValue
, mais vous ne pouvez pas l'utiliser dans votre cas. int.MaxValue
est l'entier maximum, 2.147.483.647. Si dans votre code, vous avez une valeur maximale de quelque chose, comme une pression maximale acceptée avant que quelque chose explose, l'utilisation de 2147483647 n'a aucun sens.
2. Cadre
.NET Framework est plutôt incohérent sur ce point, et son utilisation des valeurs magiques peut être critiquée.
Par exemple, "Hello".IndexOf("Z")
renvoie une valeur magique -1
. Cela facilite peut-être (le fait-il?) La manipulation du résultat:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
plutôt que d'utiliser une structure personnalisée:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
mais n'est pas du tout intuitif. Pourquoi -1
et non -123
? Un débutant peut également penser à tort que cela 0
signifie aussi "Introuvable" ou simplement taper du texte (position >= 0)
.
3. Contexte
Si votre code est lié à des délais d'expiration dans les sockets réseau, utiliser quelque chose qui a été utilisé par tout le monde pendant des décennies dans un souci de cohérence n'est pas une mauvaise idée . Surtout, 0
car un timeout est très clair: c'est une valeur qui ne peut pas être nulle. L'utilisation d'une classe personnalisée dans ce cas peut rendre les choses plus difficiles à comprendre:
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; }
}
- Puis-je mettre
Duration
à 0 si IsTimeoutEnabled
c'est vrai?
- Si
IsTimeoutEnabled
est faux, que se passe-t-il si je mets Duration
100?
Cela peut conduire à de multiples erreurs. Imaginez le morceau de code suivant:
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();
L'opération dure dix secondes. Pouvez-vous voir ce qui ne va pas avec ce code, sans lire la documentation de la Timeout
classe?
Conclusion
null
exprime bien l'idée que la valeur n'est pas là. Ce n'est pas fourni. Indisponible. Ce n'est ni un nombre, ni une chaîne vide / nulle ou quoi que ce soit. Ne l'utilisez pas pour des valeurs maximales ou minimales.
int.MaxValue
est fortement liée à la langue elle-même. Ne pas utiliser int.MaxValue
pour une limite de vitesse maximale de Vehicle
classe ou une vitesse maximale acceptable pour un avion, etc.
Évitez les valeurs magiques comme -1
dans votre code. Ils sont trompeurs et entraînent des erreurs de code.
Créez votre propre classe qui serait plus simple, avec les valeurs minimum / maximum spécifiées. Par exemple, VehicleSpeed
peut avoir VehicleSpeed.MaxValue
.
Ne suivez aucune directive précédente et utilisez des valeurs magiques si c'est une convention générale depuis des décennies dans un domaine très spécifique, utilisé par la plupart des gens qui écrivent du code dans ce domaine.
N'oubliez pas de mélanger les approches. Par exemple:
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.
¹ Vous pouvez créer votre propre type qui inclut l'infini. Ici, je parle int
uniquement de type natif .