应该如何删除其他块

how should remove else blocks

PHPMD 告诉我应该避免在此测试中使用 else 块,但在那种情况下,我找不到删除它们的方法。

代码如下:

if ($fight->c1 == NULL) {
    if ($fight->c2 == NULL) {
        // C1 and C2 Is Bye
        $this->assertEquals($parentFight->$toUpdate, NULL);
    }
    else {
        // C1 Is Bye
        $this->assertEquals($parentFight->$toUpdate, $fight->c2);
    }
}
else {
    if ($fight->c2 == NULL) {
        // C2 Is Bye
        $this->assertEquals($parentFight->$toUpdate, $fight->c1);
    }
    else {
        // C1 and C2 Are all set
        $this->assertEquals($parentFight->$toUpdate, NULL);
    }
}

有什么想法吗???

使用 else if 而不是多个 if...else

if ($fight->c1 == null && $fight->c2 == null) {
    // C1 and C2 Is Bye
    $this->assertEquals($parentFight->$toUpdate, null);
} else if($fight->c1 == null &&  $fight->c2 != null) {
    // C1 Is Bye
    $this->assertEquals($parentFight->$toUpdate, $fight->c2);
} else if($fight->c1 != null &&  $fight->c2 == null) {
    // C2 Is Bye
    $this->assertEquals($parentFight->$toUpdate, $fight->c1);
} else {
    // C1 and C2 Are all set
    $this->assertEquals($parentFight->$toUpdate, null);
}

还有另一种方法:

if(($fight->c1 == null && $fight->c2 == null) || ($fight->c1 != null && $fight->c2 != null)) {
    // C1 and C2 Is Bye
    // C1 and C2 Are all set
    $this->assertEquals($parentFight->$toUpdate, null);
} else if($fight->c1 == null && $fight->c2 != null) {
    // C1 Is Bye
    $this->assertEquals($parentFight->$toUpdate, $fight->c2);
} else if($fight->c1 != null && $fight->c2 == null) {
    // C2 Is Bye
    $this->assertEquals($parentFight->$toUpdate, $fight->c1);
}

你可以用两个 if{} 代替 if{}else{} 像这样,

if(a){
  //do a
}else{
  //do !a
}

if(a){
  //do a
}
if(!a){
  //do !a
} 

也可以用三元运算符来完成,像这样。

if (!$fight->c1) {
    $this->assertEquals($parentFight->$toUpdate, ($fight->c2 ?: null));
}

if (!$fight->c2) {
    $this->assertEquals($parentFight->$toUpdate, ($fight->c2 ?: null));
}

您也可以为您正在测试的每个案例进行一次测试,进行 4 次明确测试,而不是一次测试,其中所有路径的测试方式都不明显

$checkValue = null;
$cntNulls = (int)is_null($fight->c1) + (int)is_null($fight->c2);
if ($cntNulls === 1) {
    $checkValue = is_null($fight->c1) ? $fight->c2 : $fight->c1;
}

$this->assertEquals($parentFight->$toUpdate, $checkValue);

好像$fight->c1不是null,你想通过$fight->c1。而当 $fight->c2 不是 null 时,你想传递 $fight->c2。当两者都是 null 你想传递 null.

你只需要做的是,

$param = null;
if($fight->c1 != null)
{
    $param = $fight->c1;
}
if($fight->c2 != null)
{
    $param = $fight->c2;
}

$this->assertEquals($parentFight->$toUpdate, $param);

但我会更进一步,将 $param 解析过程抽象为

private function relolveParam($fight) {
    $param = null;
    if($fight->c1 != null)
    {
        $param = $fight->c1;
    }
    if($fight->c2 != null)
    {
        $param = $fight->c2;
    }
    return $param;
}

那么你只会得到,

$this->assertEquals($parentFight->$toUpdate, $this->relolveParam($fight));