Как обращаться с «простыми» магическими ценностями? - PullRequest
0 голосов
/ 16 октября 2011

Я думаю, что это не зависит от языка, но если я ошибаюсь, перейдите на C # (или C или C ++).

Под "простыми" магическими значениями я имею в виду такие вещи:

if (Value > 0)

или

while (Value < 0)

или

while (MyQueue > 0)

При написании этого (псевдокод выше) меня как-то поразило, что это действительно относится только к чему-то, что сравнивается с 0.

В любом случае, как лучше всего обрабатывать подобные магические значения (с учетом читабельности, количества нажатий клавиш / кода для создания и имени)?

Это похоже на крайнее избыточное убийство, когда для этого выделен целый (статический) класс (или enum в C #).

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Как сказал Аллон Гуралнек, я бы также использовал методы расширения Any(), чтобы проверить, содержит ли определенная коллекция предметы.Вы также можете написать дополнительные методы расширения, такие как

public static class MyExtensions {
  public static bool IsNegative(this int number) {
    return number < 0;
  }

  public static bool IsPositive(this int number) {
    return number > 0;
  }
}

, а затем записать свой цикл или условия как

if (Value.IsPositive())
while (Value.IsNegative())
while (MyQueue.IsPositive())

, предполагая, что Value и MyQueue имеют тип int.

1 голос
/ 16 октября 2011

Некоторые числа считаются «магическими числами» только по своему контексту. В некоторых случаях используется простая концепция, которая не имеет ничего общего с конкретным значением числа. Например, если вы хотите проверить, не является ли список пустым, вы можете написать одно из следующих утверждений:

if (list.Count != 0)

if (list.Count > 0)

if (list.Count >= 1)

Ни 0, ни 1 не имеет никакого значения, кроме "ничто" и "что-то", и поэтому три вышеприведенных утверждения следует читать как "не ничего", "больше, чем ничего" и "по крайней мере что-то", и поэтому я бы не назвал их использование "магическими числами". Могут быть другие способы выполнить такую ​​проверку, не используя никаких цифр. Например, в C # вы можете использовать оператор Any LINQ:

if (list.Any())

Я считаю, что это более наглядно и обеспечивает читабельность кода, напоминающую историю. Другие языки могут иметь другие средства для выражения таких понятий, как «ничто», «что-то», «пустой набор», «непустой набор» и т. Д.

...