流程和逻辑 - 始终测试所需的直接条件。 !(!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 个嵌套的 if
s 那就太丑了。但是,我想确保我不会 运行 陷入问题。我不会从这里看到一些意想不到的东西。
这些测试很简单。我担心的一件事是 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;
}
提前抱歉,我只是不知道如何表达这个问题,也没有去寻找它。 我觉得应该给它起个名字,某种原则或问题,但我不知道。我的标题可能也没有意义,但我希望它能提供足够的提示。
我想确定一种构建项目代码的方法。具体来说,嵌套条件。如果您无法使用 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 个嵌套的 if
s 那就太丑了。但是,我想确保我不会 运行 陷入问题。我不会从这里看到一些意想不到的东西。
这些测试很简单。我担心的一件事是 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;
}