2016-12-07 236 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)並且使代碼混淆。它忽略了降低複雜性的意圖,即使代碼更易於理解。 –