Mi código tiene una alta complejidad. ¿Cómo puedo reducirlo?

Nov 24 2020

Estoy intentando codificar un juego simple llamado 'Atom'. Funciona muy bien pero tengo un pequeño problema. VisualStudio dice que el primer código a continuación tiene una complejidad de 10 y el segundo una complejidad de 13. ¿Cómo puedo reducir la complejidad? Gracias a todos de antemano :)

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

},

Respuestas

General_Twyckenham Nov 24 2020 at 18:48

Una forma de simplificar sería separando la iteración de los condicionales; La refactorización automática de Visual Studio Code le permitirá extraer la función muy fácilmente, por lo que su checkForWinfunción podría terminar pareciendo

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 ahora tiene una complejidad ciclomática de 4. (La función extraída tendría un 8)

Otro paso que puede tomar es desenrollar algunos de esos condicionales y ver si podemos eliminar algún código adicional. En este caso, observe que la línea if(!this.htmlBoard[j][i].classList.contains("atom")){es extraña porque ya la maneja la ifinstrucción inicial ; eliminar esto reducirá la función extraída a un 7.

Realizar el mismo enfoque de refactorización en su segunda función producirá resultados similares, y debería terminar con una puntuación de complejidad total más baja