使用表驅動簡化複雜邏輯判斷

2021-09-01 15:50:59 字數 2854 閱讀 4069

廢話不說,看**:

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...