Enum 和Switch
在上一篇,和大家介紹了enum列舉,而enum在應用上常和switch做搭配。
switch是一個用來取代if else的方法,寫程式可以不會用switch只用if else,這結果其實是相同的,但如果不使用switch,只會使用if else,這樣會造成程式變得很長,所以還是應該要會使用switch比較好。這篇文章的重點不在介紹怎麼使用switch,如果對switch還不熟悉的朋友可以自己上網學習甚麼是switch。
switch也可以不需要和enum搭配使用,結果其實是一樣的,但是好的程式要讓人容易理解和好維護,使用enum的目的就是可以讓程式較好理解,讓程式較好維護,才不會程式一時之間看不懂,還要再去看衍生的程式。
舉個例子會比較好理解。
今天我要做一個投注系統,依照使用者的輸入來增加使用者的下注金額,程式如下:
//現在下注的金額
int mybet = 0;
//賭注金額增減
private void BetMoney(int money)
{
//依照不同的狀況,增加玩家的下注金額
switch(money)
{
case 0:
mybet = 0;
break;
case 1:
mybet += 1;
break;
case 2:
mybet += 5;
break;
case 3:
mybet += 10;
break;
case 4:
mybet *= 2;
break;
}
}
這裡使用switch,從money的數字是多少,來決定玩家的下注金額增加多少,或是金額歸零,然而這樣子做有缺點,就是程式很不好理解,開發的人知道程式在寫甚麼,但如果另一個程式設計師看到就不知道在寫甚麼,還要再花費時間看懂程式。如果這裡的money改成使用列舉enum的話那程式就變得簡單易讀了,下面把money改成使用列舉enum:
//列舉不同的賭注金額
enum betmoney { clear, bet1, bet5, bet10, betdouble }
//現在下注的金額
int mybet = 0;
//賭注金額
private void BetMoney(betmoney money)
{
switch(money)
{
case betmoney.bet1:
mybet += 1;
break;
case betmoney.bet5:
mybet += 5;
break;
case betmoney.bet10:
mybet += 10;
break;
case betmoney.clear:
mybet = 0;
break;
case betmoney.betdouble:
mybet *= 2;
break;
}
}
跟前面的程式比較起來,這樣子寫看起來就非常容易理解,本來都是寫數字,這樣的程式看都看不懂,而這裡改成betmoney.bet1就表示下注1元,betmoney.clear表示下注的金額歸零,另外betmoney.betdouble表示下注金額乘以2。這樣子的程式就非常好理解,而且也比較能夠顯示出一個程式設計師的程度,一個有經驗的程式設計師就會善用enum列舉,沒經驗的程式設計師不會使用enum列舉,出來的結果其實也都一樣,但是這樣一看就知道這個人沒甚麼程式設計經驗,程式很不好懂也不好維護,當然更沒有經驗的程式設計師連switch都不會用,程式就更難維護了。
我舉例的這個程式為視窗程式,使用者透過按鈕來增減下注金額,按下按鈕後下注金額就會改變,最後附上完整程式碼以及程式碼連結給大家。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
namespace public_enum_sample { public partial class Form1 : Form { //現在下注的金額 int mybet =0;
//列舉不同的賭注金額 enum betmoney { clear, bet1, bet5, bet10, betdouble }
public Form1() { InitializeComponent(); }
//賭注金額增減 private void BetMoney(betmoney money) { //依照不同的狀況,增加玩家的下注金額 switch(money) { case betmoney.bet1: mybet += 1; break; case betmoney.bet5: mybet += 5; break; case betmoney.bet10: mybet += 10; break; case betmoney.clear: mybet = 0; break; case betmoney.betdouble: mybet *= 2; break; } //結果顯示於textbox lbResult.Text = mybet.ToString(); }
//按下1元 private void money1_Click(object sender, EventArgs e) { BetMoney(betmoney.bet1); }
//按下5元 private void money5_Click(object sender, EventArgs e) { BetMoney(betmoney.bet5); }
//按下10元 private void money10_Click(object sender, EventArgs e) { BetMoney(betmoney.bet10); }
//按下reset private void money0_Click(object sender, EventArgs e) { BetMoney(0); }
private void Form1_Load(object sender, EventArgs e) { //剛開始下注金額顯示為0 lbResult.Text = "0"; }
//按下double private void moneyDouble_Click(object sender, EventArgs e) { BetMoney(betmoney.betdouble); } } } |
下注系統程式畫面
相關文章
留言列表