使用表驱动法代替繁琐的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语句实现,也不是特别麻烦,但当你碰到更复杂的情况时,希望表驱动法能够更好的帮助你。