2017-07-06 43 views
-1

今天我在代码审查中发现了一个代码块,这个代码块让我感到奇怪,但我找不到这个代码对我来说很奇怪的客观原因。为什么在条件不好的情况下做事

的代码看起来是这样的(它的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是为我好,但呼吁,做什么感觉错了我的方法。

很久以前,我在某处读到在做情况是件坏事,但我不记得为什么它是不好的风格。

也许有人可以解释为什么它不好(或罚款)?

+0

这可能有助于:[为什么副作用在函数式编程中被视为邪恶?](https://softwareengineering.stackexchange.com/q/15269/22659)(或不) –

+0

人们在if语句中使用函数所有时间,在许多情况下这是常见的做法。根据他们的样式文档,最好是根据谁阅读代码的意见。 –

回答

0

在大多数情况下,做东西内的条件只是不好的风格,因为它可能很难在以后阅读和维护。尽管如此,这是没有错的,因为这是语言允许的。避免过度复杂的病情陈述的最有说服力的理由是副作用。考虑下面的代码。

$globalVariable = true;  
.... 
if(checkVariable() && changeVariable()){ 
    do stuff.... 
} 
function checkVariable(){ 
    return $globalVariable; 
} 
function changeVariable(){ 
    $globalVariable = false; 
    return true; //Marking success 
} 

这条if语句将作为条件按顺序执行,都是如此。但是将&& checkVariable()添加到条件将会使其为假,因为changeVariable()修改checkVariable()的行为的副作用。这意味着checkVariable()拥有两个值,这是不直观的和错误的编码实践,但在这里有效。经验法则是在条件之前执行函数/方法,并将结果存储在条件中使用的变量中,以避免模糊性。

相关问题