例如,某游戏有赢,输,平手,每个状态有不同背景,有不同文字提醒。如果集中在一个函数中处理,那么就要添加很多if语句,代码臃肿,且难以阅读。
下面是优化前的代码:
func compareSign(mySign:Sign) {
let computerSign:Sign = randomSign()!
let gameState = mySign.caculating(comupterSign: computerSign)
switch gameState { // 判读三种状态,然后更新不同UI ,臃肿代码#0
case .win:
updateWinUI(computerSign: computerSign, mySign: mySign)
break;
case .lose:
updateLoseUI(computerSign: computerSign, mySign: mySign)
break;
case .draw:
updateDrawUI(computerSign: computerSign, mySign: mySign)
break;
default:
break;
}
}
func updateLoseUI(computerSign:Sign ,mySign:Sign) {
//相同代码 #1
self.computerTurnLabel.text = computerSign.getSignPic();
//获取失败时的文字提醒, 类似代码 #2
self.stateLabel.text = GameState.lose.getStateString()
//相同代码,
switch mySign{
case .rock:
self.cissorButton.isHidden = true
self.paperButton.isHidden = true
break
case .paper:
self.rockButton.isHidden = true
self.cissorButton.isHidden = true;
break
case .scissors:
self.rockButton.isHidden = true
self.paperButton.isHidden = true;
break
}
//相同代码 #3
self.playAgainButton.isHidden = false;
self.view.backgroundColor = gameState.getStateBackgroundColor();//类似代码 #4
}
func updateWinUI(computerSign:Sign ,mySign:Sign) {
self.computerTurnLabel.text = computerSign.getSignPic(); //#1
self.stateLabel.text = GameState.win.getStateString() #2
switch mySign{
case .rock:
self.cissorButton.isHidden = true
self.paperButton.isHidden = true
break
case .paper:
self.rockButton.isHidden = true
self.cissorButton.isHidden = true;
break
case .scissors:
self.rockButton.isHidden = true
self.paperButton.isHidden = true;
break
}
self.playAgainButton.isHidden = false;#3
self.view.backgroundColor = UIColor.orange;#4
}
func updateDrawUI(computerSign:Sign ,mySign:Sign,gameState:GameState) {
self.computerTurnLabel.text = computerSign.getSignPic(); //#1
self.stateLabel.text = GameState.draw.getStateString()//#2
switch mySign{
case .rock:
self.cissorButton.isHidden = true
self.paperButton.isHidden = true
break
case .paper:
self.rockButton.isHidden = true
self.cissorButton.isHidden = true;
break
case .scissors:
self.rockButton.isHidden = true
self.paperButton.isHidden = true;
break
}
self.playAgainButton.isHidden = false; #3
self.view.backgroundColor = UIColor.orange; #4
}
如果把#2 #4的右边参数,写一个实例方法,那么优化后的代码是这样的:
func compareSign(mySign:Sign) { let computerSign:Sign = randomSign()! let gameState = mySign.caculating(comupterSign: computerSign) updateUI(computerSign: computerSign, mySign: mySign, gameState: gameState) } func gameStartUI() { self.computerTurnLabel.text = "