为什么在 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 在条件之前执行并将结果存储在变量中以在条件中使用,以避免歧义。