私のコードは非常に複雑です。どうすれば減らすことができますか?

Nov 24 2020

「Atom」という簡単なゲームをコーディングしようとしています。それは本当にうまくいきますが、私は少し問題があります。VisualStudioによると、以下の最初のコードの複雑さは10で、2番目のコードの複雑さは13です。どうすれば複雑さを軽減できますか?よろしくお願いします:)

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

}、

回答

General_Twyckenham Nov 24 2020 at 18:48

単純化する1つの方法は、反復を条件から分離することです。Visual Studio Codeの自動リファクタリングを使用すると、関数を非常に簡単に抽出できるため、checkForWin関数は次のようになります。

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

これで循環的複雑度は4になります(抽出された関数は8になります)

実行できるもう1つのステップは、これらの条件のいくつかを展開して、余分なコードを削除できるかどうかを確認することです。この場合、if(!this.htmlBoard[j][i].classList.contains("atom")){最初のifステートメントですでに処理されているため、この行は無関係であることに注意してください。これを削除すると、抽出された関数は7になります。

2番目の関数で同じリファクタリングアプローチを実行すると、同様の結果が得られ、合計の複雑さのスコアが低くなるはずです。