Mon code est très complexe. Comment puis-je le réduire?

Nov 24 2020

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

General_Twyckenham Nov 24 2020 at 18:48

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 checkForWinfonction 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' ifinstruction 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