2016-12-07 97 views
1

我怎样才能减少这种功能的圈复杂度在Java?:如何降低java中的圈复杂度?

public void execute() { 

     if (dx == 1 && dy == 0) { this.moveRight();} 
     if (dx == -1 && dy == 0) { this.moveLeft();} 
     if (dx == 0 && dy == -1) { this.moveUp();} 
     if (dx == 0 && dy == 1) { this.moveDown();} 
     if (dx == 1 && dy == -1) { this.moveUpRight();} 
     if (dx == 1 && dy == 1) { this.moveRightDown();} 
     if (dx == -1 && dy == -1) { this.moveLeftUp();} 
     if (dx == -1 && dy == 1) { this.moveDownLeft();} 
} 
+1

由于有8种方法,你需要有8个条件,这种排序是有道理的。顺便说一句,你可能想使用'if,else if'语句,因为程序是每当所有8个条件都被执行时 – nafas

+1

'moveUpRight()'与moveUp()'+ moveRight()'相同吗? – Berger

+1

我们不知道这些方法是做什么的。也许'moveUpRight'只是调用'moveUp(); moveRight();',也许不是。没有这一点,我看不出一种降低复杂性的方法。如果你问这个问题是因为像声纳这样的事情引发了一个警告,有时候可以忽略它。 – jhamon

回答

2

我认为有以下将在圈复杂度方面不太复杂:

public void execute() { 
    if (dx == 0) {this.moveVerticaly(dy)} 
    if (dx == 1) {this.moveRight(dy)} 
    if (dx == -1) {this.moveHorizontaly(dy)} 
} 
2

考虑转化dxdy到一个独特的价值和switch ing:

switch ((dx + 1) * 4 + (dy + 1))

A switch跳转在时间上实际上是恒定的,代价是计算switch表达式。

case 1对应于dx == -1dy == 0等等。

+0

虽然这可能会正式降低复杂度,但它引入了令人困惑的常量(4)并且使代码混淆。它忽略了降低复杂性的意图,即使代码更易于理解。 –