Поміркуйте:
1. Мова
Використання ∞ може бути рішенням максимум.
Наприклад, JavaScript має нескінченність. C # не¹.
Наприклад, Ада має діапазони. C # ні.
У C # є int.MaxValue
, але ви не можете використовувати його у вашому випадку. int.MaxValue
- максимальне ціле число, 2,147,483,647. Якщо у вашому коді ви маєте максимальне значення чогось, наприклад, максимально прийнятий тиск, перш ніж щось вибухне, використання 2,147,483,647 не має сенсу.
2. Рамка
З цього приводу .NET Framework досить непослідовний, і його використання магічних значень може бути піддано критиці.
Наприклад, "Hello".IndexOf("Z")
повертає магічне значення -1
. Це може бути легше (це робить?) , Щоб маніпулювати результат:
int position = "Hello".IndexOf("Z");
if (position > 0)
{
DoSomething(position);
}
замість використання спеціальної структури:
SearchOccurrence occurrence = "Hello".IndexOf("Z");
if (occurrence.IsFound)
{
DoSomething(occurrence.StartOffset);
}
але зовсім не інтуїтивно зрозумілий. Чому -1
і ні -123
? Початківець також може помилково подумати, що це 0
означає "Не знайдено" або просто ввести помилку (position >= 0)
.
3. Контекст
Якщо ваш код пов'язаний із затримкою часу в мережевих сокетах, використання того, що використовувалося десятиліттями для послідовності, не є поганою ідеєю . Тим більше, що 0
час очікування дуже зрозуміло: це значення, яке не може бути нульовим. Використання користувацького класу в цьому випадку може ускладнити розуміння речей:
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; }
}
- Чи можна встановити
Duration
0, якщо IsTimeoutEnabled
це правда?
- Якщо
IsTimeoutEnabled
помилково, що станеться, якщо я встановив Duration
100?
Це може призвести до декількох помилок. Уявіть наступний фрагмент коду:
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();
Операція триває десять секунд. Чи можете ви бачити, що з цим кодом не так, не читаючи документацію Timeout
класу?
Висновок
null
добре висловлює думку, що значення тут немає. Це не передбачено. Недоступний. Це ні число, ні нуль / порожній рядок, ні що інше. Не використовуйте його для максимальних або мінімальних значень.
int.MaxValue
сильно пов’язаний із самою мовою. Не використовуйте int.MaxValue
для максимального обмеження швидкості Vehicle
класу або максимально допустиму швидкість для літака тощо.
Уникайте магічних значень, як -1
у коді. Вони вводять в оману і призводять до помилок у коді.
Створіть свій власний клас, який був би простішим із вказаними мінімальними / максимальними значеннями. Наприклад, VehicleSpeed
може мати VehicleSpeed.MaxValue
.
Не дотримуйтесь жодних попередніх вказівок і не використовуйте магічні значення, якщо це загальна конвенція протягом десятиліть у дуже специфічній галузі, яку застосовує більшість людей, що пишуть код у цій галузі.
Не забудьте змішати підходи. Наприклад:
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.
¹ Ви можете створити власний тип, який включає нескінченність. Тут я говорю лише про рідний int
тип.