Mon code est très complexe. Comment puis-je le réduire?
J'essaye de coder un jeu simple appelé «Atom». Cela fonctionne très bien mais j'ai un petit problème. VisualStudio indique que le premier code ci-dessous a une complexité de 10 et le 2ème une complexité de 13. Comment puis-je réduire la complexité? Merci à tous d'avance :)
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");
}
}
}
},
Réponses
Une façon de simplifier serait de séparer l'itération des conditions; Le refactoring automatique de Visual Studio Code vous permettra d'extraire la fonction très facilement, de sorte que votre checkForWin
fonction pourrait ressembler à
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;
}
qui a maintenant une complexité cyclomatique de 4. (La fonction extraite aurait un 8)
Une autre étape que vous pouvez prendre est de dérouler certaines de ces conditions et de voir si nous pouvons éliminer tout code supplémentaire. Dans ce cas, notez que la ligne if(!this.htmlBoard[j][i].classList.contains("atom")){
est superflue car elle est déjà gérée par l' if
instruction initiale ; le supprimer ramènera la fonction extraite à un 7.
Effectuer la même approche de refactoring sur votre 2ème fonction donnera des résultats similaires, et vous devriez vous retrouver avec un score de complexité totale plus faible