2011-09-20 99 views
1

我知道這聽起來很糟糕,但在我的Java程序中,我有大約100條if-else語句,全部包含3個變量,這些變量必須保持對這些if-else塊的唯一性, 1是一個標誌,用於知道何時第一次觸及if-else塊,其他2個都是字符串,並且是臨時變量,用於保存上次運行該if-else塊時使用的數據,所以它可以與這段時間的數據進行比較,如果聽起來很sl sorry,抱歉,我討厭有這麼多if-else塊的想法,但現在我更關心變量,因爲如果我爲每個塊創建3個變量這是一個額外的300個變量。我可以實現的任何建議,以減少變量的數量,我有一個想法是1陣列的所有標誌,然後2d陣列持有2個字符串爲每個if-else塊。謝謝牛肉。減少我的if-else語句中使用的變量數

編輯:顯示前2個if-else塊的樣本,其他所有其他代碼都有相同的代碼,只是標記和臨時變量ex的名稱不同。 ac101Flag, tempAC101Start, tempAC101End

   // AC 101 
       if (room.equals("FEB 2009") || room.equals("FEB 2011") ||room.equals("FEB 2013") || room.equals("FEB 2015") || room.equals("FEB 2017") || 
         room.equals("FEB 2021") || room.equals("FEB 2023") || room.equals("FEB 2025") || room.equals("FEB 2027") || room.equals("FEB 2029")) { 
        instanceNum = 4; 
        devID = 130200; 
        if (ac101Flag == false) { 
         Delete(); 
         Insert(); 
         ac101Flag = true; 
         tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.')); 
         tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.')); 
        } 
        //Insert(); 
        else if (tempAC101Start <= (Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'))) && tempAC101End >= Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'))) { 

        } 
        else 
        { 
         Insert(); 
         tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.')); 
         tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.')); 
        } 
       } 
       // AC 102 
       else if(room.equals("FEB 1130")) { 
        instanceNum = 4; 
        devID = 130400; 
        if (ac102Flag == false) { 
         Delete(); 
         Insert(); 
         ac102Flag = true; 
         tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.')); 
         tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.')); 
        } 
        //Insert(); 
        else if (tempAC101Start <= (Double.parseDouble(finalStart.substring(0, 5).replace(':', '.'))) && tempAC101End >= Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.'))) { 

        } 
        else 
        { 
         Insert(); 
         tempAC101Start = Double.parseDouble(finalStart.substring(0, 5).replace(':', '.')); 
         tempAC101End = Double.parseDouble(finalEnd.substring(0, 5).replace(':', '.')); 
        } 
       } 
+3

顯示該代碼的第一部分if/else塊。 – nos

+0

@nos參考編輯示例代碼 – Beef

回答

2

編輯:只是爲了給出答案的一個更具體的論證,我覺得你想要的東西,如:

class Foo // Rename this! 
{ 
    private double start; 
    private double end; 
    private boolean flag; 

    public void handleValue(double newStart, double newEnd) 
    { 
     // Insert code here 
    } 
} 

private static void insertFoo(Map<String, Foo> map, String... rooms) 
{ 
    Foo foo = new Foo(); 
    for (String room : rooms) 
    { 
     map.put(room, foo); 
    } 
} 

... 
HashMap<String, Foo> map = new HashMap<String, Foo>(); 
insertFoo(map, "FEB 2009", "FEB 2011", ...); 
insertFoo(map, "FEB 1130"); 

然後在你的循環,只需使用:

Foo foo = map.get(room); 
foo.update(start, end); // Parsed from the current finalStart/finalEnd 

很難說沒有看到你的代碼,但它聽起來像y OU應該封裝所有這在數據結構中:

  • 三個變量(狀態和falg)
  • 「東西」來表示if部件的狀態。這樣做的確切性質將取決於你有什麼

然後,您可以通過這些ConditionBlock對象的列表上運行(或者不管你選擇打電話給他們),並檢查是否在當前塊「匹配」在適當的情況下更新它。

如果你能給我們一個原始代碼的小例子,我們可以很容易地爲你重構它。

編輯:正如我顯然還沒有明確的一個地方引入解析着想的局部變量,我會做這樣的事情(如一個第一步):

// TODO: Don't use double here - it's completely inappropriate. Use 
// BigDecimal if you absolutely must, but preferrably use a time-related 
// type, e.g. something from Joda Time (http://joda-time.sf.net) 
double parsedStart = Double.parseDouble(finalStart.substring(0, 5) 
                .replace(':', '.')); 

// TODO: Put all of these constants in a HashSet<String> and use contains 
if (room.equals("FEB 2009") || 
    room.equals("FEB 2011") || 
    room.equals("FEB 2013") || 
    room.equals("FEB 2015") || 
    room.equals("FEB 2017") || 
    room.equals("FEB 2021") || 
    room.equals("FEB 2023") || 
    room.equals("FEB 2025") || 
    room.equals("FEB 2027") || 
    room.equals("FEB 2029")) { 

    instanceNum = 4; 
    devID = 130200; 
    // TODO: Change to if (!ac101Flag) 
    if (ac101Flag == false) { 
     // TODO: Rename these methods to follow Java naming conventions 
     Delete(); 
     Insert(); 
     ac101Flag = true; 
     tempAC101Start = parsedStart; 
     tempAC101End = parsedEnd; 
    } 
    //Insert(); 
    else if (tempAC101Start <= parsedStart && tempAC101End >= parsedEnd) { 

    } 
    else 
    { 
     Insert(); 
     tempAC101Start = parsedStart; 
     tempAC101End = parsedEnd; 
    } 
} 
+0

請參閱編輯以查看代碼示例 – Beef

+0

@Beef:if/else塊的邏輯是否存在任何模式?你有沒有任何理由爲什麼你到處調用'parseDouble' *而不是隻在一個地方? –

+0

我在每個地方都使用'parseDouble'的原因是,每次進入if-else塊時,finalStart和finalEnd的值都會不同,並且可能會返回到塊,因此如果它進入AC101,它會保存那些臨時工,在它回到AC101之前可能會跳到50個其他塊,但是我仍然需要獲得AC101數據以便它回來時,如果這有意義的話 – Beef

1

聲明一個具有三個字段的類。爲需要維護的實例數量創建此類的數組。

private class Vars{ 
    int val1; 
    String val2, val3; 
} 

private Vars[] allVars = new Vars[300]; 

void myMethod(){ 
    if (condition1){ 
     allVals[0].val1 = ...; 
    } 
} 
1

考慮使用多態性。

每個塊都有行爲和數據。因此,使每個塊實現一個接口的對象。

每個塊對象可以保存到狀態對象,如@Jon Skeet建議的那樣。

首先,挑選一個對象。這可能與你現有的if語句,或者如果可能的話,通過一些更簡單的映射。

然後,只需調用所選對象的方法即可。

class BlockState { 
    boolean hasBeenCalled = false; 
    String last1; 
    String last2; 
} 

class Block1 implements Runnable { 
    BlockState m_blockState = new BlockState(); 
    public void run() { ... } 
} 

... 
class BlockN implements Runnable { 
    BlockState m_blockState = new BlockState(); 
    public void run() { ... } 
} 

... 

class LongChainOfIfs 
    void foo() { 
    Runnable runnable = null; 
    if (...) runnable = ... 
    else if (...) runnable = ... 
    ... 
    else runnable = ... 

    runnable.run(); 
    } 
} 
2

的一個問題,這不是你的問題清楚是多麼的相似,如果塊,在任何情況下,你可能有一個,如果塊祖先類具有共同inteface並採用上面的思路,創建一個實例每個if塊,將狀態變量作爲對象的一部分,然後創建這些對象的集合,然後循環遍歷每個依次調用每個對象的集合。每個if-block實例都會繼承公共變量,並且對於對象來說是唯一的(封裝),並且每個塊都可以針對每個if塊的每種特殊情況定製代碼。

定義每個實例的代碼開銷會更大,並且執行時間會更長,但是您不必創建獨立變量,並且您可以混合匹配並根據需要動態更改if塊的順序。