Meu código tem alta complexidade. Como posso reduzi-lo?
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
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 checkForWin
funçã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 if
instruçã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