最近入手了 代碼大全2
厌殉,真實程序員的圣經(jīng)啊胡桃,內(nèi)容好高端啊踩叭,書中建議的初級程序員看的章節(jié)就是:表驅(qū)動法
,真 NM NB翠胰,聽都沒聽過容贝,但是非常有用,其想法絕對不是一個人通過自我學(xué)習(xí)能醒悟出來的
表驅(qū)動法
的思路是什么:用表來代替那些 if/else
的業(yè)務(wù)邏輯之景,你把業(yè)務(wù)邏輯寫在 if/else
里就是硬編碼斤富,但是寫到表里是可以實現(xiàn)功能分離的,邏輯表可以統(tǒng)一做路徑設(shè)置或者其他配置锻狗,這樣的話業(yè)務(wù)邏輯會變得非常容易閱讀和理解了
我不說原理满力,書光說原理了焕参,有限的代碼還是 VB 的,壓根沒法看油额,所以我給大家舉些例子叠纷,大家看代碼體會,思想得落地才能變成自己的
今天周幾
像幾天周幾這樣的潦嘶,其實最適合做表驅(qū)動了涩嚣,因為邏輯最清晰,簡單掂僵,一個數(shù)組+下標(biāo)缓艳,輕輕松松搞定
傳統(tǒng)寫法:
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 = "周六";
}
表驅(qū)動法
String [] weekday = new String[]{"周日","周一","周二","周三","周四","周五","周六"};
String today = weekday [ dayForMonth % 7 ];
每個月對應(yīng)多少天
傳統(tǒng)的寫法,我們要寫一串 if/else
返回數(shù)據(jù)
傳統(tǒng)寫法:
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;}
但是表驅(qū)動法就不一樣了看峻,把邏輯寫成 map 或是 list阶淘,一目了然,這里我們搞個2維數(shù)組還加上了閏年的邏輯
表驅(qū)動法
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))
不同條件執(zhí)行不同任務(wù)
因為是任務(wù)互妓,是個方法溪窒,不再是數(shù)值了,這里我們可以利用 Dart 這樣的支持高階函數(shù)的語言特性冯勉,把方法當(dāng)做一個對象存儲在表中
表驅(qū)動法
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 可能會包紅線澈蚌,提示不是方法類型,大家強轉(zhuǎn)一下就行了灼狰。這個表
內(nèi)部可以無限的往下一層層嵌套宛瞄,只要保證是 map 的就能通過[]
統(tǒng)一書寫調(diào)用了
加減法
加法和減法有不同的計算共公式,那么就像下面這樣寫交胚,抽象方法當(dāng)做對象使用份汗,存到 map 表里去
傳統(tǒng)寫法:
def test(c,a,b):
if c == '+':
return a + b
elif c == '-':
return a - b
表驅(qū)動法:
def add(a,b):
return a+b
def minus(a,b):
return a - b
func_dict = {'+':add,'-':minus}
print(func_dict['+'](1,2))
復(fù)雜多條件判斷
這個例子邏輯最復(fù)雜,因為判斷的條件多蝴簇,并且還有不同配置杯活,像這種問題,我們一般用2維數(shù)組來做熬词,x 軸是判斷條件旁钧,y 軸是不同配置
傳統(tǒng)寫法:
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 ;
}
表驅(qū)動法:
// 把邏輯變?yōu)?2維數(shù)組,做好注釋互拾,這樣看是不是很清晰啊
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];
帶取值范圍的
像某某范圍內(nèi)是啥這樣的歪今,我們?nèi)蛇叺亩它c數(shù)值作為依據(jù),在數(shù)值判斷時使用最簡單的方式:for 循環(huán)
- 0-59 分是不及格 F級
- 60- 79 是及格 E級
- 80-84 是普通 D級
- 85-89 是良好 C級
- 90 - 94 是優(yōu)秀 B級
- 95-100 是太棒了 A級
表驅(qū)動法:
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];
}
}
}