今天我在代码审查中发现了一个代码块,它对我来说很奇怪,但我无法找到一个客观原因,为什么这段代码对我来说很奇怪。
代码看起来像这样(它的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 :(得分: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()
包含两个值,这是不直观和错误的编码实践,但在此处有效。经验法则是在条件之前执行函数/方法,并将结果存储在变量中以便在条件中使用,以避免歧义。