Mój kod ma dużą złożoność. Jak mogę to zmniejszyć?
Próbuję napisać prostą grę o nazwie „Atom”. Działa naprawdę dobrze, ale mam mały problem. VisualStudio mówi, że pierwszy poniższy kod ma złożoność 10, a drugi - 13. Jak mogę zmniejszyć złożoność? Z góry dziękuję :)
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");
}
}
}
},
Odpowiedzi
Jednym ze sposobów uproszczenia byłoby oddzielenie iteracji od instrukcji warunkowych; Automatyczna refaktoryzacja w programie Visual Studio Code pozwoli Ci bardzo łatwo wyodrębnić funkcję, dzięki czemu Twoja checkForWin
funkcja może wyglądać jak
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;
}
który ma teraz cyklomatyczną złożoność 4. (Wyodrębniona funkcja miałaby 8)
Kolejnym krokiem, który możesz zrobić, jest rozwinięcie niektórych z tych warunków i sprawdzenie, czy możemy wyeliminować dodatkowy kod. W tym przypadku zauważ, że wiersz if(!this.htmlBoard[j][i].classList.contains("atom")){
jest obcy, ponieważ jest już obsługiwany przez instrukcję początkową if
; usunięcie tego spowoduje sprowadzenie wyodrębnionej funkcji do 7.
Wykonanie tego samego podejścia do refaktoryzacji na drugiej funkcji da podobne wyniki i powinieneś otrzymać niższy wynik całkowitej złożoności