मेरे कोड में उच्च जटिलता है। मैं इसे कैसे कम कर सकता हूं?

Nov 24 2020

मैं 'एटम' नामक एक साधारण गेम को कोड करने की कोशिश कर रहा हूं। यह वास्तव में ठीक काम करता है लेकिन मुझे थोड़ी समस्या है। VisualStudio का कहना है कि नीचे दिए गए पहले कोड में 10 की जटिलता है और दूसरी की जटिलता 13 है। मैं जटिलता को कैसे कम कर सकता हूं? अग्रिम धन्यवाद y :)

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

सरलीकरण से एक तरीका यह होगा कि सशर्त से पुनरावृत्ति को अलग करके; विजुअल स्टूडियो कोड के स्वचालित रीफैक्टरिंग से आप फ़ंक्शन को बहुत आसानी से निकाल सकते हैं, इसलिए आपका 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 होगा)

एक और कदम जो आप उठा सकते हैं, उनमें से कुछ शर्तों को अनियंत्रित करें और देखें कि क्या हम किसी अतिरिक्त कोड को समाप्त कर सकते हैं। इस मामले में, ध्यान दें कि रेखा if(!this.htmlBoard[j][i].classList.contains("atom")){बाहरी है, क्योंकि यह पहले से ही प्रारंभिक ifकथन द्वारा नियंत्रित है ; इसे हटाने से निकाले गए फ़ंक्शन को 7 पर लाया जाएगा।

अपने दूसरे फ़ंक्शन पर समान रीफ़ैक्टरिंग दृष्टिकोण निष्पादित करने से समान परिणाम प्राप्त होंगे, और आपको कम कुल जटिलता स्कोर के साथ समाप्त होना चाहिए