廢話不說,看**:
if (jtdw == 1 || jtdw == 2 || jtdw == 7 || jtdw == 8 || jtdw == 15
|| jtdw == 19 || jtdw == 20 || jtdw == 21) else if (jtdw == 3 || jtdw == 4 || jtdw == 5 || jtdw == 6
|| jtdw == 16) else if (jtdw == 17) else if (jtdw == 9) else if (jtdw == 13 || jtdw == 18) else if (jtdw == 10 || jtdw == 22) else if (jtdw == 23) else
這段**在程式中出現了多次
,基本就是有些地方多出來乙個判斷,有些地方少了乙個判斷而已,應該提取成公共的方法,簡化**,方便復用。這不是主要問題,主要問題在於:
1.**太長,難理解:不解釋。
2. 可維護性低:比如裡面兩個有注釋的地方,都是後期新增的,以後修改或增加的判斷多了,都會使現有的程式更難理解。
其實,這種情況在程式中出現很頻繁,在我們的系統中出現的更是頻繁。應對這種複雜的邏輯判斷有很多很多方法,這裡介紹一種叫做表驅動的方法。
人類閱讀複雜資料結構遠比複雜的控制流程容易,或者說資料驅動開發是非常有價值的。
《**大全
2》聲稱這個是表驅動法。
表驅動法就是將一些通過較為複雜邏輯語句來得到資料資訊的方式,通過查詢表的方式來實現,將資料資訊存放在表裡。
這樣不僅**看起來簡明,而且後面如果資料或者別的什麼改變的話維護起來也相對簡單。
比如,將上面的
ajlb
和 jtdw
儲存到類似的乙個表的結構中(如
map),業務邏輯中只需
ajlb = getajlbbyjtdw(jtdw);
就可以替換原來的很多行的判斷,以後修改時,只需在
map中新增乙個即可,不影響業務邏輯流程。
private static mapjtdw_ajlb = new hashmap();
static
public static int getajlbbyjtdw(int jtdw)
表驅動的好處是消除**裡面到處出現的
if、 else
、swith
語句,讓凌亂**變得簡明和清晰。對簡單情況而言,表驅動方法可能僅僅使邏輯語句更容易和直白,但隨著邏輯的越來越複雜,表驅動法就愈發有吸引力。
補充解釋一下表驅動方法:
使用表驅動的主要要明白:如何構建表確定什麼樣的規則來訪問表裡的資料。
表驅動的訪問方式主要有三種:
直接訪問、索引訪問、階梯訪問。
1.
直接訪問:
key,
value
格式
經典的例子,根據月份取天數,非常好理解、不解釋,看**:
public int getmonthdays(int month) else if (2 == month) else if (3 == month) else if (4 == month) else if (5 == month) else if (6 == month) else if (7 == month) else if (8 == month) else if (9 == month) else if (10 == month) else if (11 == month) else if (12 == month)
return days;
}
使用表驅動的直接訪問方式消除
if語句
private static int month_dyas = ;
public int getmonthdays(int month)
2.
索引訪問
這種方式用於解決巢狀的
if效果比較明顯,比如
map>
,外層map
儲存內層
map的索引,內層
map儲存值,就不用**舉例了。
3.
階梯訪問,主要適用於無規則資料。比如在某個範圍區間內,對應某個值。這裡就不用**舉例了。
表驅動好處: 1.
在適當環境下,使用它能夠使**簡單、明了。
2. 修改容易(易維護)、效率更高。
3. 表驅動法的乙個好處就是能夠大量消除**中
if - else
, swith
判斷。
缺點:這是乙個用資料結構替換複雜流程控制的方法,
某些情況下
浪費空間,有時查詢可能沒有直接判斷快,效率低。
表驅動的乙個很重要的問題是如何去構建查詢的鍵值。主要有以下幾種方式:
1. 直接使用有規則的資料作為鍵值
2. 賦值資訊從而能夠直接使用鍵值
3. 在特定情況下寫**轉換鍵值使其能夠直接使用
4. 提取出鍵值轉換函式來,單獨的函式來處理表的鍵值生成
使用函式 使用邏輯函式判斷產品是否合格
下圖所示為某公司生產的產品稱重記錄,需要在d列判斷產品是否合格。判斷標準為 u型產品重量大於等於48並且小於等於52為合格,t型產品重量大於等於8並且小於等於10為合格。在d2單元格中輸入以下公式,並向下複製到d10單元格。if or and b2 u型 c2 48,c2 52 and b2 t型 ...
python自學(三) 列表和邏輯判斷
二 邏輯判斷 三 迴圈 四 dict和set 一 列表和tuple 1.1 列表 陣列和其他語言的陣列基本類似,表示乙個有序的資料集合 1.data 向列表追加資料元素 2.pop index index為空時,預設刪除最後一項 3.insert index,data 制定位置插入元素,每次只能插入...
在驅動中使用鍊錶
原始出處 在驅動程式的開發中經常需要用到鍊錶,常見的鍊錶有單向鍊錶和雙向鍊錶,我們只介紹雙向鍊錶的使用方法,ddk為我們提供了標準的雙向鍊錶 list entry,但這個鍊錶裡面沒有資料,不能直接使用,我們需要自己定義乙個結構體型別,然後將list entry作為結構體的乙個子域,如下 所示 typ...