真实,直到被证实或被证明是错误的?

时间:2009-04-28 00:13:22

标签: language-agnostic boolean

我注意到我的编码有点不明确。假设我们有一个二维数组,一个矩阵或一个表,我们正在查看它以检查每个行或嵌套维度的属性是否为真。

假设我有一个布尔标志,用于检查属性是真还是假。我的选择是:

  1. 将其初始化为true并检查每个单元格,直到证明为假。这个 在代码之前给它一个错误的名字 已完全执行。
  2. 从false开始并检查每一行,直到证明为真。仅当所有行都为真时,数据才是正确的。没有柜台,最干净的方法是什么?
  3. 我总是不加思索地做了1但今天它让我感到疑惑。 2呢?

6 个答案:

答案 0 :(得分:12)

取决于哪一个首先将你转出循环,恕我直言。

例如,对于OR情况,我默认为false,一旦获得TRUE,返回结果,否则在循环结束时返回默认值。

对于AND情况,我会做相反的事情。

答案 1 :(得分:3)

它们实际上都是相同的,因为你说“检查属性是否适用于每一行或嵌套维度”,我相信第一种方法更容易阅读,也许稍快一些。

在代码完全执行之前,您不应该尝试读取标志的值,因为检查没有完成。如果您正在运行异步代码,则应防止在不稳定时访问该值。

在执行代码之前,两种方法都“给出错误的名称”。 1给出误报,2给出假阴性。我不确定你要避免这样做 - 如果你在完全运行你的代码之前得到“正确”的值,你就没有首先运行你的代码。


如何在没有计数器的情况下实现每个(如果您的语言没有foreach语法,请使用相应的enumerator->next循环语法):

1:

bool flag = true;

foreach(item in array)
{
    if(!check(item))
    {
        flag = false;
        break;
    }
}

2:

bool flag = false;
foreach(item in array)
{
    if(!check(item))
    {
        break;
    } 
    else if(item.IsLast())
    {
        flag = true;
    }
}

答案 2 :(得分:2)

选择第一个选项。算法总是有前置条件,后置条件和不变量。如果你的不变量是“bool x是真的,如果0-currentN的所有行都有positve属性”,那么一切都很好。

不要让算法更复杂,只是为了使每个行迭代的完整程序状态有效。重构该方法,将其解压缩,并使用您的语言机制(Java:synchronized)使其“原子化”。

答案 3 :(得分:1)

就个人而言,我只是将整个循环抛入一个名为isPropertyAlwaysTrue(property,array [] [])的可重用的方法/函数中,并且如果它发现它找到的情况不是真的,则直接返回false。

顺便说一下,逻辑的反转并没有让你更快地离开那里。例如,如果你想要第一个非真实的情况,说areAnyFalse或areAllTrue将有一个反向输出,但必须测试完全相同的情况。

areAnyTrue和areAllFalse也是如此 - 完全相同算法的不同单词(一旦找到真值就返回)。

您无法将areAnyFalse与areAnyTrue进行比较,因为它们正在测试完全不同的情况。

答案 4 :(得分:0)

使属性名称类似于isThisTrue。然后它回答“是”或“否”,但它总是有意义的。

在Ruby和Scheme中,您可以在名称中使用问号:isThisTrue?。在许多其他语言中,在LISP中,对于名称为null-p的测试返回true或false,有一个puttng“p”用于“谓词”。

答案 5 :(得分:0)

我同意Will Hartung的说法。

如果您担心(1),那么只需为您的布尔值选择一个更好的名称。 IsNotSomething而不是IsSomething。