为什么在 if 条件下做事不好
Why is it bad to do things in if conditions
今天我在代码审查中发现了一个代码块,它对我来说很奇怪,但我找不到 objective 为什么这段代码对我来说很奇怪的原因。
代码如下所示(PHP)
// inside a for loop
if( $thing->isGood() === true && saveThing($thing) ) {
$successfulSavedCount++;
}
// for end
function saveThing($thing) {
// this method persists $thing to the database
}
检查 $this->isGood() === true
是否适合我,但我觉得调用一个执行某些操作的方法不对。
很久以前我在某处读到在条件下做事情是糟糕的风格,但我不记得为什么它是糟糕的风格。
也许你们中有人可以解释为什么它不好(或很好)?
在大多数情况下,在一个条件下做 事情 只是糟糕的风格,因为以后很难阅读和维护。但这并没有错,因为语言允许这样做。避免过于复杂的条件语句的最有说服力的理由是副作用。考虑下面的代码。
$globalVariable = true;
....
if(checkVariable() && changeVariable()){
do stuff....
}
function checkVariable(){
return $globalVariable;
}
function changeVariable(){
$globalVariable = false;
return true; //Marking success
}
此 if 语句将在条件全部为真时执行。但是在条件中添加 && checkVariable()
会使它变为假,因为 changeVariable()
的副作用会修改 checkVariable()
的行为。这意味着 checkVariable()
拥有两个值,这是不直观且糟糕的编码习惯,但在这里有效。经验法则是让 functions/methods 在条件之前执行并将结果存储在变量中以在条件中使用,以避免歧义。
今天我在代码审查中发现了一个代码块,它对我来说很奇怪,但我找不到 objective 为什么这段代码对我来说很奇怪的原因。
代码如下所示(PHP)
// inside a for loop
if( $thing->isGood() === true && saveThing($thing) ) {
$successfulSavedCount++;
}
// for end
function saveThing($thing) {
// this method persists $thing to the database
}
检查 $this->isGood() === true
是否适合我,但我觉得调用一个执行某些操作的方法不对。
很久以前我在某处读到在条件下做事情是糟糕的风格,但我不记得为什么它是糟糕的风格。
也许你们中有人可以解释为什么它不好(或很好)?
在大多数情况下,在一个条件下做 事情 只是糟糕的风格,因为以后很难阅读和维护。但这并没有错,因为语言允许这样做。避免过于复杂的条件语句的最有说服力的理由是副作用。考虑下面的代码。
$globalVariable = true;
....
if(checkVariable() && changeVariable()){
do stuff....
}
function checkVariable(){
return $globalVariable;
}
function changeVariable(){
$globalVariable = false;
return true; //Marking success
}
此 if 语句将在条件全部为真时执行。但是在条件中添加 && checkVariable()
会使它变为假,因为 changeVariable()
的副作用会修改 checkVariable()
的行为。这意味着 checkVariable()
拥有两个值,这是不直观且糟糕的编码习惯,但在这里有效。经验法则是让 functions/methods 在条件之前执行并将结果存储在变量中以在条件中使用,以避免歧义。