我有一个很长的if条件如下。对于要评估的陈述,有两个条件都不能满足。我确实把它作为一个带有很多&&和而且!但它变得难以理解。我已尝试将其拆分为if elsif else
,因为第一个if elsif
块中没有代码,所以if ($instructionObject->instruction=='nesting_grammar' && $instructionObject->match=='>'){ //if instruction is a '>' child indicator
//don't change the child depth
}else if ($instructionObject->instruction=='selector' && is_object($this->instructions[$key+1]) && $this->instructions[$key+1]->instruction == 'nesting_grammar' && $this->instructions[$key+1]->match == '>'){ //if instruction is a selector followed by a '>'
//don't change the child depth
}else{
$insertOffset += $childDepth;
unset($childDepth);
}
更易读,但读取效果不佳。
整理此代码块的最佳做法是什么?
{{1}}
答案 0 :(得分:3)
您可以使用“extract method”重构。将您的条件替换为新方法。
if ($this->isInstructionNestingGrammar($instructionObject)){
//don't change the child depth
}else if ($this->isIntructionSelect($instructionObject)){
//don't change the child depth
}else{
$insertOffset += $childDepth;
unset($childDepth);
}
在新方法中,将每个比较放在单独的行中。
P.S。不要怕长名称的方法。
答案 1 :(得分:1)
只是否定条件并跳过if
和else if
部分,因为两个初始条件没有做任何事情......
if (
!($instructionObject->instruction=='nesting_grammar' &&
$instructionObject->match=='>')
|| !($instructionObject->instruction=='selector'
&& is_object($this->instructions[$key+1])
&& $this->instructions[$key+1]->instruction == 'nesting_grammar'
&& $this->instructions[$key+1]->match == '>')
) {
$insertOffset += $childDepth;
unset($childDepth);
}
答案 2 :(得分:1)
不是直接回答你的问题,而是如下:
if (my_check($instructionObject) || $instructionObject->instruction=='selector' && my_check($this->instructions[$key+1])) {
} else {
$insertOffset += $childDepth;
unset($childDepth);
}
function my_check($obj) {
return is_object($obj) && $obj->instruction == 'nesting_grammar' && $obj->match == '>';
}
- 你基本上做了两次同样的事情,是时候考虑一个功能了。
答案 3 :(得分:0)
就个人而言,如果我要跨越多行检查,我会将其列为类似于我如何布置JavaScript对象;
if (
great big long check line goes in here &&
another really long ugly check line goes in here too
) {
// Do this code
}
else if (
check 3 &&
check 4
) {
//Do this code
}
答案 4 :(得分:0)
将子表达式拉入变量。伪示例:
flibjit = FlibjitManager.FlibjitInstance(this);
isFrob =
(flibjit.Froblocity >= FlibjitManager.FrobThreshold) &&
(flibjit.Type == FlibjitTypes.Frobby);
if (isFrob) {
// ...