使用表驱动法,替换复杂的if/else和switch/case语句。
复杂的if/else
忘记从哪里看到这么一段话:
互斥条件表驱动
嵌套条件校验链
短路条件早return
零散条件可组合
在实际编程中,我已经遇到了第一种情况了,就是过多的条件导致的分支。在之前我都会用switch/case代替这种情况,毕竟这就是switch的作用,但是这并不是最优解,因为当条件逐渐复杂到几百条的时候,每次修改都是一种痛苦,过长的代码阅读起来也不方便,并且不满足“面向对象”的思想:对修改关闭,对扩展开放。
所以这时候就需要用到了表驱动法!
表驱动法
表驱动法是什么
表驱动是一种编程模式,是一种将输入变量作为索引在表里查找直接的结果或者处理函数,而不是用很多的逻辑语句来进行判断(比如if-sle||switch_case).索引表可以是个数组、map或者其他高效率查找的数据结构。
举个例子
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语句代码实现的功能是将星期的英文转化为中文输出,幸亏一周只有七天,若有八天、九天还需要进行代码的增加,想想都特别麻烦。当使用表驱动法时,你就能发现当遇到此类时会变得特别方便。
解决方法:
1、case语句或if-else语句的结果返回结果是某个值
其实上述的例子就属于这类情况,表驱动法解决过程是:首先将所有返回的值写进一个数组中,定义数组weekDay
string weekDay[]={
"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}
然后要解决的是将case值和数组下标索引能联系起来,这里最好的办法就是使用枚举型,这是因为枚举值是可以转化为数字的,定义一个枚举Week
public enum