如何处理“简单”的魔术值?

时间:2011-10-16 18:16:31

标签: magic-numbers magic-string

我认为这与语言无关,但如果我错了,那就选择C#(或C或C ++)。

“简单”魔术值我的意思是:

if (Value > 0)

while (Value < 0)

while (MyQueue > 0)

在写这篇文章时(上面的伪代码),有点让我感到震惊的是它真的只适用于与0比较的东西。

无论如何,处理这些魔术值的最佳方法是什么(考虑可读性,击键量/创建和命名的代码)?

在整个(静态)类(或C#中的枚举)专用于此时感觉极端矫枉过正。

2 个答案:

答案 0 :(得分:1)

某些数字仅被其背景视为“神奇数字”。一些用法体现了一个简单的概念,与数字的具体价值无关。例如,如果要检查列表是否为空,则可以编写以下语句之一:

if (list.Count != 0)

if (list.Count > 0)

if (list.Count >= 1)

01都没有任何超越'nothing'和'something'的含义,所以上述三个陈述应该被理解为“不是没有”,“不仅仅是”和“at”最少的东西“,因此我不会称他们的用法为”魔术数字“。可能还有其他方法可以在不使用任何数字的情况下执行此类检查。例如,在C#中,您可以使用Any LINQ运算符:

if (list.Any())

我发现这更具描述性,并且能够实现类似故事的代码可读性。其他语言可能有其他设施来表达诸如“无”,“某事”,“空集”,“非空集”等概念。

答案 1 :(得分:1)

正如Allon Guralnek所说,我也会使用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