应该如何删除其他块
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));
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));