2016-12-07 12 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 методов, u необходимо иметь 8 условий, что sorta имеет смысл. btw, u, вероятно, хотите использовать оператор '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

Рассмотрим преобразование dx и dy в уникальное значение и switch ИНГ на нем:

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

A switch прыжок является фактически постоянным во времени, за счет вычисления выражения switch.

case 1 соответствует dx == -1 и dy == 0 и т. Д.

+0

Хотя это может формально уменьшить сложность, оно вводит непонятную константу (4) и обфускает код. В нем отсутствует намерение уменьшить сложность, что делает код более понятным. –