Meu código tem alta complexidade. Como posso reduzi-lo?

Nov 24 2020

Estou tentando programar um jogo simples chamado 'Atom'. Funciona muito bem, mas estou com um pequeno problema. VisualStudio diz que o primeiro código abaixo tem uma complexidade de 10 e o segundo uma complexidade de 13. Como posso reduzir a complexidade? Agradeço antecipadamente a todos :)

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");
    }
  }
}

},

Respostas

General_Twyckenham Nov 24 2020 at 18:48

Uma maneira de simplificar seria separando a iteração das condicionais; A refatoração automática do Visual Studio Code permitirá que você extraia a função com muita facilidade, de modo que sua checkForWinfunção pode acabar parecendo

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;
  }

que agora tem uma complexidade ciclomática de 4. (A função extraída teria um 8)

Outra etapa que você pode realizar é desfazer algumas dessas condicionais e ver se podemos eliminar qualquer código extra. Nesse caso, observe que a linha if(!this.htmlBoard[j][i].classList.contains("atom")){é estranha porque já foi tratada pela ifinstrução inicial ; remover isso reduzirá a função extraída a 7.

Executar a mesma abordagem de refatoração em sua 2ª função produzirá resultados semelhantes, e você deve terminar com uma pontuação de complexidade total mais baixa