Mein Code ist sehr komplex. Wie kann ich es reduzieren?

Nov 24 2020

Ich versuche, ein einfaches Spiel namens "Atom" zu codieren. Es funktioniert wirklich gut, aber ich habe ein kleines Problem. VisualStudio sagt, dass der erste Code unten eine Komplexität von 10 und der zweite eine Komplexität von 13 hat. Wie kann ich die Komplexität reduzieren? Vielen Dank im Voraus :)

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

},

Antworten

General_Twyckenham Nov 24 2020 at 18:48

Eine Möglichkeit zur Vereinfachung besteht darin, die Iteration von den Bedingungen zu trennen. Mit dem automatischen Refactoring von Visual Studio Code können Sie die Funktion sehr einfach extrahieren, sodass Ihre checkForWinFunktion möglicherweise so aussieht

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

die jetzt eine zyklomatische Komplexität von 4 hat. (Die extrahierte Funktion hätte eine 8)

Ein weiterer Schritt, den Sie unternehmen können, besteht darin, einige dieser Bedingungen abzuwickeln und zu prüfen, ob wir zusätzlichen Code entfernen können. if(!this.htmlBoard[j][i].classList.contains("atom")){Beachten Sie in diesem Fall, dass die Zeile irrelevant ist, da sie bereits von der ursprünglichen ifAnweisung behandelt wird. Wenn Sie dies entfernen, wird die extrahierte Funktion auf 7 reduziert.

Wenn Sie für Ihre zweite Funktion denselben Refactoring-Ansatz ausführen, erhalten Sie ähnliche Ergebnisse, und Sie sollten am Ende eine niedrigere Gesamtkomplexitätsbewertung erhalten