0

我认为这是相当独立于语言的,但如果我错了,那就选择 C#(或 C 或 C++)。

对于“简单”的魔法值,我的意思是这样的:

if (Value > 0)

或者

while (Value < 0)

或者

while (MyQueue > 0)

在写这个(上面的伪代码)时,我有点震惊,它真的只适用于与 0 比较的东西。

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

拥有一个专门用于此的整个(静态)类(或 C# 中的枚举)感觉像是极端的矫枉过正。

4

2 回答 2

1

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

if (list.Count != 0)

if (list.Count > 0)

if (list.Count >= 1)

除了“无”和“某物”之外,也0没有1任何意义,因此上述三个陈述应理解为“不是没有”、“多于没有”和“至少有一些”,因此我不会称它们的用法“魔术数字”。可能有其他方法可以在不使用任何数字的情况下执行此类检查。例如,在 C# 中,您可以使用AnyLINQ 运算符:

if (list.Any())

我发现这更具描述性,并使代码具有故事般的可读性。其他语言可能有其他工具来表达诸如“无”、“某物”、“空集”、“非空集”等概念。

于 2011-10-16T19:52:35.997 回答
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 是 type int

于 2011-10-16T20:30:38.897 回答