Mi código tiene una alta complejidad. ¿Cómo puedo reducirlo?
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
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