使用表驱动法代替繁琐的if-else语句和case语句

使用表驱动法代替繁琐的if-else语句和case语句

“一个好的例子胜过一堆的道理”,这里我们全文通过一个例子来讲解表驱动法的优势之处,它是如何做到替代复杂繁琐的if-else语句和case语句的。首先我们来看一段代码:

switch(weeek)
{
	case Monday:
	Console.WritleLine("星期一");
	case Tuesday:
	Console.WritleLine("星期二");
	case Wednesday:
	Console.WritleLine("星期三");
	case Thursday:
	Console.WritleLine("星期四");
	case Friday:
	Console.WritleLine("星期五");
	case Saturday:
	Console.WritleLine("星期六");
	case Sunday:
	Console.WritleLine("星期日");
}

这段case语句代码实现的功能是将星期的英文转化为中文输出,幸亏一周只有七天,若有八天、九天还需要进行代码的增加,想想都特别麻烦。当使用表驱动法时,你就能发现当遇到此类时会变得特别方便。表驱动法常用的2种情况:
1、case语句或if-else语句的结果返回结果是某个值
其实上述的例子就属于这类情况,表驱动法解决过程是:首先将所有返回的值写进一个数组中,定义数组weekDay

string weekDay[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}

然后要解决的是将case值和数组下标索引能联系起来,这里最好的办法就是使用枚举型,这是因为枚举值是可以转化为数字的,定义一个枚举Week

public enum Week
{
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday,
  Sunday
}

(int)Week.Monday的值是1,如此就解决了将case值和数组下标之间转换的问题。所以上例通过表驱动法来实现就只需要一行代码就可以了:

week=weekDay.Monday;//week为WeekDay中任意一个枚举值,这里设为Monday
string result=weekDay[(int)week];
Console.Writle(result);

2、case语句或if-else语句的结果是执行某个动作
假如原case语句代码为

switch(weeek)
{
	case Monday:
	Cleaning();
	case Tuesday:
	Cooking();
	case Wednesday:
	Writing();
	case Thursday:
	swimming();
	case Friday:
	Running();
	case Saturday:
	PlayGame();
	case Sunday:
	Shopping();
}

表驱动法的解决过程是:先将所有执行的动作封装为一个表,这里做的是将它们写到一个类里面,

Class SampleClass
{
	Public void Cleaning()
	{};
	Public void Cooking()
	{};
	Public void Writing()
	{};
	Public void Swimming()
	{};
	Public void Runnning()
	{};
	Public void PlayGame()
	{};
	Public void Shopping()
	{};
}

然后定义一个包含所有方法名的数组,

string doing={"Cleaning","Cooking","","Writing",...};

还是将case值写成一个枚举类型,

public enum Week
{
  Monday,
  Tuesday,
  Wednesday,
  Thursday,
  Friday,
  Saturday,
  Sunday
}

下面是使用表驱动法的代码,其中涉及到反射的内容,主要是通过方法名的字符串来实现该方法的执行,

SampleClass sample=new SampleClass();
week=weekDay.Monday;
var method=typeof(SampleClass).GetMethod(doing[(int)week.Monday]);//利用字符串获取了同名的方法
method.Invoke(sample,null);//执行对应的方法,由于Cleaning无输入参数,所以为null;若有参数,null需换为object[]{参数值}

以上就是表驱动法常用的两种情况,读者可以得到明显的结论:表驱动法法代替了繁琐的case语句和if-else语句,通过查询表的内容就能实现复杂的逻辑关系。其实上面的例子完全可以用case语句实现,也不是特别麻烦,但当你碰到更复杂的情况时,希望表驱动法能够更好的帮助你。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值