最近入手了 代码大全2
,真实程序员的圣经啊,内容好高端啊,书中建议的初级程序员看的章节就是:表驱动法
,真 NM NB,听都没听过,可是很是有用,其想法绝对不是一我的经过自我学习能醒悟出来的python
表驱动法
的思路是什么:用表来代替那些 if/else
的业务逻辑,你把业务逻辑写在 if/else
里就是硬编码,可是写到表里是能够实现功能分离的,逻辑表能够统一作路径设置或者其余配置,这样的话业务逻辑会变得很是容易阅读和理解了程序员
我不说原理,书光说原理了,有限的代码仍是 VB 的,压根无法看,因此我给你们举些例子,你们看代码体会,思想得落地才能变成本身的数组
像几天周几这样的,其实最适合作表驱动了,由于逻辑最清晰,简单,一个数组+下标,轻轻松松搞定bash
传统写法:
函数
String today = "周日";
Switch( dayForMonth % 7 ){
case 0 :
today = "周日";
case 1 :
today = "周一";
case 2 :
today = "周二";
case 3 :
today = "周三";
case 4 :
today = "周四";
case 5 :
today = "周五";
default:
today = "周六";
}
复制代码
表驱动法
学习
String [] weekday = new String[]{"周日","周一","周二","周三","周四","周五","周六"};
String today = weekday [ dayForMonth % 7 ];
复制代码
传统的写法,咱们要写一串 if/else
返回数据ui
传统写法:
编码
if(1 == iMonth) {iDays = 31;}
else if(2 == iMonth) {iDays = 28;}
else if(3 == iMonth) {iDays = 31;}
else if(4 == iMonth) {iDays = 30;}
else if(5 == iMonth) {iDays = 31;}
else if(6 == iMonth) {iDays = 30;}
else if(7 == iMonth) {iDays = 31;}
else if(8 == iMonth) {iDays = 31;}
else if(9 == iMonth) {iDays = 30;}
else if(10 == iMonth) {iDays = 31;}
else if(11 == iMonth) {iDays = 30;}
else if(12 == iMonth) {iDays = 31;}
复制代码
可是表驱动法就不同了,把逻辑写成 map 或是 list,一目了然,这里咱们搞个2维数组还加上了闰年的逻辑spa
表驱动法
code
const monthDays = [
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
]
function getMonthDays(month, year) {
let isLeapYear = (year % 4 === 0) && (year % 100 !== 0 || year % 400 === 0) ? 1 : 0
return monthDays[isLeapYear][(month - 1)];
}
console.log(getMonthDays(2, 2000))
复制代码
由于是任务,是个方法,再也不是数值了,这里咱们能够利用 Dart 这样的支持高阶函数的语言特性,把方法当作一个对象存储在表中
表驱动法
var data = <String, Map>{
"A": {
"name": "AA",
"action": (name) => print(name + "/AA"),
},
"B": {
"name": "BB",
"action": (name) => print(name + "/BB"),
},
};
var action = data["A"]["action"];
action("kk");
// if( action is Function ) action("KK");
复制代码
action 可能会包红线,提示不是方法类型,你们强转一下就好了。这个表
内部能够无限的往下一层层嵌套,只要保证是 map 的就能经过[]
统一书写调用了
加法和减法有不一样的计算共公式,那么就像下面这样写,抽象方法当作对象使用,存到 map 表里去
传统写法:
def test(c,a,b):
if c == '+':
return a + b
elif c == '-':
return a - b
复制代码
表驱动法:
def add(a,b):
return a+b
def minus(a,b):
return a - b
func_dict = {'+':add,'-':minus}
print(func_dict['+'](1,2))
复制代码
这个例子逻辑最复杂,由于判断的条件多,而且还有不一样配置,像这种问题,咱们通常用2维数组来作,x 轴是判断条件,y 轴是不一样配置
传统写法:
if( (a && !c ) || (a && b && c)){
category = 1 ;
}else if( (b && ! a) || (a && c && !b)){
category = 2 ;
}else if ( c && !a && !b){
category = 3 ;
}else {
category = 0 ;
}
复制代码
表驱动法:
// 把逻辑变为 2维数组,作好注释,这样看是否是很清晰啊
static int categoryTable[2][2]={
//!b!c !bc b!c bc
0, 3, 2, 2, // !a
1, 2, 1, 1, // a
}
// 使用
category = categoryTable[1][0];
复制代码
像某某范围内是啥这样的,咱们取两边的端点数值做为依据,在数值判断时使用最简单的方式:for 循环
表驱动法:
int [] grade = {59,79,84,89,94,100};
String [] level = {"F","E","D","C","B","A"},
public String getLevel (int grade){
for( int i = 0 ; i < grade.length ; i++){
if(grade <= grade[i]){
return level[i];
}
}
}
复制代码