請 AI 幫自己的程式作業列出可以改進的地方和打分數(code review,refactor code)

完成程式作業後,先別急著繳交呀。就像考試交卷前最好檢查一下,作業繳交前可以先請 AI 看看是否有需要調整的地方。

註: AI 的回答還無法做到百分百正確,因此 AI 的建議是不錯的參考,但還是要加上自己的判斷。

以下我們以同學的計分器 App 程式為例,請 GPT 4 列出可以改進的地方和打分數(code review)。

class ViewController: UIViewController {
var scoreA : Int = 0
var scoreB : Int = 0
var scoreA2 : Int = 0
var scoreB2 : Int = 0
var player : String = ""

@IBOutlet weak var playerName1: UILabel!

@IBOutlet weak var playerName2: UILabel!

@IBOutlet weak var scoreLabelA: UILabel!

@IBOutlet weak var scoreLabelB: UILabel!



override func viewDidLoad() {
super.viewDidLoad()

NewGame()

}


@IBAction func getPointButtonA(_ sender: UIButton) {

switch sender.tag{
case 1 :
scoreA += 1
scoreA2 = scoreA
getPoint()
case 2 :
scoreB += 1
scoreB2 = scoreB
getPoint()
default : return
}
}


@IBAction func retrunButton(_ sender: UIButton) {

switch sender.tag{
case 1 :
scoreA -= 1
scoreA2 = scoreA
getPoint()
case 2 :
scoreB -= 1
scoreB2 = scoreB
getPoint()
default : return
}

}



@IBAction func NewGameButton(_ sender: Any) {
NewGame()
}

@IBAction func changeButton(_ sender: Any) {

scoreA = scoreB
scoreB = scoreA2
scoreA2 = scoreB2
scoreB2 = scoreB
scoreLabelA.text = String(scoreA2)
scoreLabelB.text = String(scoreB2)
if playerName1.text == "player 1"{
playerName1.text = "player 2"
playerName2.text = "player 1"
}else{
playerName1.text = "player 1"
playerName2.text = "player 2"
}

}


func NewGame(){
scoreA = 0
scoreB = 0
scoreA2 = 0
scoreB2 = 0
scoreLabelA.text = "0"
scoreLabelB.text = "0"
}

func gameEndAlert(){
if scoreA2 > scoreB2 {
player = "player 1"
}else{ player = "player 2" }
let endAlert = UIAlertController(title: "Game End", message: "Winner is \(player)", preferredStyle: .alert)
let endAcrion = UIAlertAction(title: "Start New Game", style: .default, handler: {
(action: UIAlertAction!) -> Void in
self.NewGame()
})

endAlert.addAction(endAcrion)

present(endAlert, animated: true)
}

func getPoint(){

scoreLabelA.text = String(scoreA2)
scoreLabelB.text = String(scoreB2)

let pointDiff = abs(scoreA2-scoreB2)

if pointDiff > 1{
if scoreA2 > 10 || scoreB2 > 10{
gameEndAlert()
}
}
}


}

你是一個程式老師,以下程式是學生的作業,請用中文條列出他可以改進的地方

其它適合的指令。

  • code review
  • refactor code

AI 的回答

以下是學生可以改進的地方:

  1. 變數命名:
    使用具有更明確意義的變數名稱,例如將 scoreA2 和 scoreB2 改為 displayScoreA 和 displayScoreB。
  2. 代碼重複:
    在 getPointButtonA 和 retrunButton 方法中,有重複的代碼。可以考慮將共同的代碼部分提取成一個單獨的方法,例如 updateScore,並將相應的參數(如分數增減和玩家)傳遞給這個方法。這樣可以讓代碼更簡潔、易於維護。
  3. 方法命名:
    使用更具描述性的方法名稱。例如,將 getPoint 改為 updateScoreLabels,將 changeButton 改為 swapPlayersAndScores
  4. 常量和魔法數字:
    getPoint 方法中,應使用常量代替硬編碼的數字(如10)。這樣,如果需要更改閾值,只需更改一個地方即可。例如,可以在類的開始處定義一個常量 let winningScore = 10,然後在 getPoint 方法中使用它。
  5. 界面元素命名:
    將界面元素的名稱改為更具描述性的名稱。例如,將 playerName1 改為 player1NameLabel,將 scoreLabelA 改為 player1ScoreLabel
  6. 代碼格式和風格:
    確保整個程式的縮排和空格保持一致。這有助於提高代碼的可讀性和易於維護。
    將相關的界面元素和方法分組,以保持代碼結構的清晰。例如,將所有 IBOutletIBAction 放在一起,並將功能相似的方法放在一起。
  7. 適當使用 switch 語句:
    getPointButtonAretrunButton 方法中,可以使用 if-else 語句代替 switch 語句,因為這裡只有兩個情況。
if sender.tag == 1 {
// 代碼
} else if sender.tag == 2 {
// 代碼
}

8. 簡化 gameEndAlert 方法:
在設定 player 變量時,可以使用三元運算符簡化代碼:

player = scoreA2 > scoreB2 ? "player 1" : "player 2"

綜合以上建議,學生可以對代碼進行優化和重構,以提高程式的可讀性和易於維護性。以下是根據前述建議修改後的部分程式碼:

在修改後的程式碼中,我們將變數名稱、方法名稱和界面元素名稱改得更具描述性,並將重複的代碼提取到單獨的方法中,如 updateScoreupdateScoreLabels。此外,我們還使用了常量 winningScore 來替代硬編碼的數字,以便日後更容易修改。

在代碼的結構和格式方面,我們確保了縮排和空格的一致性,並將相關的界面元素和方法分組以保持結構的清晰。最後,我們將 switch 語句替換為更簡潔的 if-else 語句,並在適當的地方使用了三元運算符來簡化代碼。

通過進行這些改進,學生的程式碼將更具可讀性和易於維護,同時也更易於理解和修改。

你是一個程式老師,以下程式是學生的作業,請用中文幫他打個分數

這份作業的程式碼看起來還不錯,但是還有一些可以改進的地方。首先,我們可以將 scoreA、scoreB、scoreA2、scoreB2、player 這些變數的命名改得更有意義一些,例如 scorePlayer1、scorePlayer2、previousScorePlayer1、previousScorePlayer2、winner 等等。其次,我們可以將 getPoint() 這個函數的名稱改成 updateScore(),因為這個函數不僅僅是獲取分數,還會更新分數。最後,我們可以將 gameEndAlert() 這個函數的名稱改成 showGameEndAlert(),因為這個函數不僅僅是遊戲結束,還會顯示遊戲結束的提示框。

總體來說,這份作業的程式碼還有進一步優化的空間,但是已經達到了及格的水平。

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com