Рассмотреть возможность:
Язык,
Фреймворк,
Контекст.
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
false, что произойдет, если я установлю 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
типе.