Mój kod ma dużą złożoność. Jak mogę to zmniejszyć?

Nov 24 2020

Próbuję napisać prostą grę o nazwie „Atom”. Działa naprawdę dobrze, ale mam mały problem. VisualStudio mówi, że pierwszy poniższy kod ma złożoność 10, a drugi - 13. Jak mogę zmniejszyć złożoność? Z góry dziękuję :)

checkForWin(){
    let winner = true;
    for(let i = 0; i < this.fieldSize; i++){
        for(let j = 0; j < this.fieldSize; j++){
            if(this.htmlBoard[j][i].classList.contains("atom")){
                if(this.htmlBoard[j][i].classList.contains("suspectAtom")){
                    this.setField(j, i, "correct");
                }
                else{
                    this.setField(j, i, "wrong");
                    winner = false
                }    
            }
            else if(this.htmlBoard[j][i].classList.contains("suspectAtom")){
                if(!this.htmlBoard[j][i].classList.contains("atom")){
                    this.setField(j, i, "wrong");
                    winner = false
                }
            }
        }
    }
    return winner;
},



setBorder() {
for (let y = 0; y < this.fieldSize; y++) {
  for (let x = 0; x < this.fieldSize; x++) {
    if (
      x == y ||
      (x === 0 && y === this.fieldSize - 1) ||
      (y === 0 && x === this.fieldSize - 1)
    ) {
      continue;
    }
    if (
      y == 0 ||
      x == 0 ||
      y == this.fieldSize - 1 ||
      x == this.fieldSize - 1
    ) {
      this.board[x][y] = "borderField";
      this.htmlBoard[x][y].classList.add("borderField");
    }
  }
}

},

Odpowiedzi

General_Twyckenham Nov 24 2020 at 18:48

Jednym ze sposobów uproszczenia byłoby oddzielenie iteracji od instrukcji warunkowych; Automatyczna refaktoryzacja w programie Visual Studio Code pozwoli Ci bardzo łatwo wyodrębnić funkcję, dzięki czemu Twoja checkForWinfunkcja może wyglądać jak

checkForWin() {
    let winner = true;
    for (let i = 0; i < this.fieldSize; i++) {
      for (let j = 0; j < this.fieldSize; j++) {
        winner = this.checkForWinningCondition(j, i, winner);
      }
    }
    return winner;
  }

który ma teraz cyklomatyczną złożoność 4. (Wyodrębniona funkcja miałaby 8)

Kolejnym krokiem, który możesz zrobić, jest rozwinięcie niektórych z tych warunków i sprawdzenie, czy możemy wyeliminować dodatkowy kod. W tym przypadku zauważ, że wiersz if(!this.htmlBoard[j][i].classList.contains("atom")){jest obcy, ponieważ jest już obsługiwany przez instrukcję początkową if; usunięcie tego spowoduje sprowadzenie wyodrębnionej funkcji do 7.

Wykonanie tego samego podejścia do refaktoryzacji na drugiej funkcji da podobne wyniki i powinieneś otrzymać niższy wynik całkowitej złożoności