2013-09-22 12 views
0

這不是我第一次遇到這個問題,肯定不會是最後一個。當有多個選項供用戶選擇時,應該比做無數的IF語句更有效率,而且這個用戶爲多個變量提供輸入,而不是其他的變量,儘管我們需要爲其他人做一些工作 - 沒有選擇他們的地方非選擇的國家需要一些工作。根據幾個參數處理許多條件的模式是什麼?

5個子選項的選項意味着我們的IF語句數量顯着增加,我不確定SWITCH是否適用,因爲仍然需要比較邏輯,所以我們仍然需要以某種方式評估SWITCH的變量,然後使用它再次是IF?

如果您已經理解了範圍,請提供您對於要做的模式或解決方案的洞察,以更有效地處理這些案例?或者如果你沒有,我已經準備好一個例子來解釋更好。這是我們都遇到過的非常普遍的問題,所以如果你覺得自己不明白,請不要忽視 - 我可能在解釋它的時候真的很糟糕。

我的第一個例子很長,但與更新用戶詳細信息(預填充表單+驗證)有關。當用戶提交一些參數但不是全部時,我們不想觸發那些保持不變的字段的驗證。簡言之,這會生成一些嵌套的IF。

現在第二個例子我希望能夠清楚我的問題的所有困惑。考慮簡單的HTML表格。在我們的表格中,我們有四列名稱:

活動名稱|事件類型|即使開始日期|活動結束日期

在我的方案中,我應該允許通過兩個字段排序。

作爲一個用戶,我可以爲你生成4X3 = 案件僅僅用任何兩個字段

三個排序它長到4x3x2 =

顯然沒有if或switch語句拯救我們(很簡單)。實際上,我很少使用SWITCH語句,asfaik至少在允許通過整數或字符串切換的java中是相當有限的。

但SWITCH有趣的一面的問題是,之前提供的變量,我必須先評估它們。因此,從HTML表單我提出兩個變量sortByParamOne = NAME sortByParamTwo = TYPE

然後,我要聲明的是:

if(sortByParamOne.equals("NAME")&&sortByParamTwo.equals("TYPE")) 

case = 1 

else if ... 

case = 2 

else if ... 

12X IF總共只需準備變量

這種或那種方式開關廠只有單數輸入,並且當我們有兩個扮演不同角色的角色變量時,似乎沒有什麼幫助。如果我錯了,請糾正我。

如何處理這種情況下不使用大量的IF保持代碼清潔和短?看起來這是一種數學領域,而不是設計模式或我們的編程策略,甚至可能與SQL中的集合論有關,我們可以通過任何可能的方式訂購,並使用任意數量的參數。

我認爲在一個「春天」frmwrk書中,他們專門爲這個多表排序示例問題撰寫了整章。可能是另一個圖書館,很少說事情如何工作。我沒有擁有它atm所以不能查找。

回答

1

除了俱樂部條件的一般技術,使用switch語句,反射API,我會建議考慮如何使您的代碼模塊化。您可以將您的代碼分成更小的方法,並可能會減少您編寫的條件數量。嘗試儘可能地重複使用方法。總是嘗試以通用方式編寫方法以達到可重用性的目的。

很多理論,現在讓我們看看一些例子。假設你需要找到三個數字中最大的一個。這是我們怎樣寫,而無需使用模塊化方法:

public int largest(int first, int second, int third) { 
    int largest = first; 
    if (second > largest) 
     largest = second; 
    else if (third > largest) 
     largest = third; 
} 

現在,使用方法

public int largest(int first, int second, int third) { 

return largest(first,largest(second,third)); 
} 

public int largestOfTwo(int first, int second) { 
    int largest = first; 
    if(second > largest) 
     largest = second; 
    return largest; 
} 

的區別應該是在上面的示例中可見重新寫。如果不是那麼我沒有證明我的thoery :-(

+0

嗯,我只是想到了另一個很好的例子,就是CHESS ENGINE!也許我需要閱讀這篇文章,因爲他們不會在那裏寫出數十億的IFs? :-)我同意你的解決方案的少數選項和條件。這將清理我們的代碼約24例。但是如果我有8列和3個變量排序標準呢? 8 * 7 * 6 = 336例 - 我們會失去耐心:-) – Aubergine

0

讓我們拿你的排序示例。即使用戶想要排序的順序有很多的可能性,他們都是對稱。意思是說,你在哪個領域排序並不重要,因爲你會使用相同的方法。

所以,可以說你必須編寫一個自定義比較器來執行排序,我會這樣做:

public CustomComparator implements Comparator<TableRow> { 
    // this will contain the column names that the table will be sorted by, in order 
    // eg. "NAME", "TYPE", "STARTDATE" 
    private List<String> conditions; 

    public CustomComparator(List<String> cond) { conditions = cond; } 

    public int compare(TableRow row1, TableRow row2) 
    { 
     for (String condition : conditions) 
     { 
      int result = row1.getColumn(condition).compareTo(row2.getColumn(condition)); 
      if (result != 0) return result; 
     } 
     return 0; 
    } 
} 

當然,上面的例子假設所有列都是Comparable

相關問題