我认为这与语言无关,但如果我错了,那就选择C#(或C或C ++)。
“简单”魔术值我的意思是:
if (Value > 0)
或
while (Value < 0)
或
while (MyQueue > 0)
在写这篇文章时(上面的伪代码),有点让我感到震惊的是它真的只适用于与0比较的东西。
无论如何,处理这些魔术值的最佳方法是什么(考虑可读性,击键量/创建和命名的代码)?
在整个(静态)类(或C#中的枚举)专用于此时感觉极端矫枉过正。
答案 0 :(得分:1)
某些数字仅被其背景视为“神奇数字”。一些用法体现了一个简单的概念,与数字的具体价值无关。例如,如果要检查列表是否为空,则可以编写以下语句之一:
if (list.Count != 0)
if (list.Count > 0)
if (list.Count >= 1)
0
和1
都没有任何超越'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
。