流程和逻辑 - 始终测试所需的直接条件。 !(!n) != n

Flow and logic - always testing for direct condition desired. !(!n) != n

提前抱歉,我只是不知道如何表达这个问题,也没有去寻找它。 我觉得应该给它起个名字,某种原则或问题,但我不知道。我的标题可能也没有意义,但我希望它能提供足够的提示。

我想确定一种构建项目代码的方法。具体来说,嵌套条件。如果您无法使用 AND 等将它们拼在一起

sell_insurance($person): bool {
    if ($person->healthy() === true) {
        if ($person->rich() === true) {
            print 'sold!';
            return true;
        }
        print 'not enough money';
        return false;
    }
    print 'too risky to sell';
    return false;
}

对战:

sell_insurance($person): bool {
    if ($person->healthy() !== true) {
        print 'too risky';
        return false;
    }
    if ($person->rich() !== true) {
        print 'too poor';
        return false;
    }
    print 'sold!';
    return true;
}

我认为后者更容易阅读,如果有 50 个嵌套的 ifs 那就太丑了。但是,我想确保我不会 运行 陷入问题。我不会从这里看到一些意想不到的东西。

这些测试很简单。我担心的一件事是 not(not a) 不一定等于 a。有时我们可能期望逻辑是布尔值,而实际上它可能不是。我可能会测试 person->healthy() !== false,但我可能没有意识到它可能不是 true,而是一个字符串 'almost'。或者不那么愚蠢的东西。

我的另一个问题是,如何放置?后一种结构默认true。感觉不如第一种方法安全。

向更有经验的人提问 - 每种方法 up/downsides 是什么?您坚持哪种结构,或者您将它们改组?谢谢

我正在学习 PHP 但我想这或多或少适用于任何语言。

你也可以换个角度看,这个人要么被接受,要么被拒绝,他的请求被拒绝的原因都可以显示出来,例如: 如果此人贫穷且不健康,您只会 "see" 他不健康,因为您 return 在检查之前进行了检查。 这完全取决于您想要的优先级,而不仅仅是结构方面的。

第一种方法表明,您必须身体健康才能获得此物品, 另一方面,第二个只是添加了一些逻辑(这可能没有意义)

如果有更多的陈述,这将完全取决于优先级,如果你从每个陈述中 return 我会采用第二种方式,但这完全取决于什么更有意义,什么是更容易理解。

在这种情况下,有几种可能的方法,其中两种是: 使用 switch 语句 使一切更加紧凑和可读。 但是,正如 Kolos 指出的那样,这取决于您的优先级和一般情况...

你甚至可以摆脱逻辑运算符,有时我会使用下面这样的东西来得到简单的比较语句:

$var= $person->healthy() ? 'true' : 'false';
 $var.=$person->rich() ? 'true' : 'false';

    switch ($var) {
case "truetrue":
 echo "SOLD!";
    break;
case "falsetrue":
 echo "too risky to sell";
    break;
case "truefalse":
 echo "too poor!";
    break;
default:
    echo "NO WAY!";
}

另一种常用的是在开头使用一个或多个 so-colled guard clauses 来覆盖 "corner cases"。 在你的例子中,富有和健康是强制性的,所以让我们把它作为保护条款:

if ($person->healthy() && $person->rich()) {
   print "SOLD!";
    return true;
} elseif($person->healthy()) {
    print "too poor...";
     return false;
} elseif($person->rich()) {
    print "too risky...";
     return false;
} else {
    print "NO WAY!";
     return false;
}