私のコードは非常に複雑です。どうすれば減らすことができますか?
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番目の関数で同じリファクタリングアプローチを実行すると、同様の結果が得られ、合計の複雑さのスコアが低くなるはずです。