2011-03-25 156 views
0

我寫一個Java應用程序來處理日誌文件已數百萬行 在方案有這樣的僞代碼如何避免重複的if語句?

if(optionA is On) 
    call object A's method 

if(optionB is On) 
    call object B's method 

if(optionC is On) 
    call object C's method 
... 

中的IF的選項配置值從配置文件 這叫做在每個僞代碼得到日誌行,所以它調用了數百萬次

由於速度和簡單性,我想刪除這個多個IF。 看到這麼多IF對我來說是不愉快的。 這是一個很好的方式來解決這個惱人的IFs?

+3

您是否擔心1)該方法的可擴展性(您不斷添加'if'語句),2)該方法的美學(你不想閱讀所有這些陳述),3)方法的表現(它太慢),或這些的組合?如果你更清楚**爲什麼**你想減少'if's的數量,我們可以幫助更多 – templatetypedef 2011-03-25 08:47:37

+0

不知道java,但不能使用接口/虛擬方法,並使用列表選項..類似於''for(i = 0; i stefan 2011-03-25 08:49:00

回答

1

如果對象共用一個接口,你可以這樣創建一個方法:

private void callOptional(myInterface obj, boolean flag) { 
    if (option) obj.method(); 
} 

你排除了所有的國際單項體育聯合會的方式。但是你仍然有一長串的通用代碼。爲了使它更幹,我的對象引用添加到您存儲的選項,然後只爲循環做一個列表:

for (OptionObjectPair ooPair : optionObjectList) { 
    callOptional(ooPair.obj, ooPair.flag) 
} 

然後,您可以甚至改變callOptional方法的接口取的OptionObjectPair直接。

+0

Uhu,每個對象都沒有選擇,正在優化? Java很有趣? – stefan 2011-03-25 09:09:39

+0

@stefan:是的,這不像是JVM會內聯方法 - 不,不要擔心,我們只做40年的優化,而不是30年的優化:p – Voo 2011-03-25 10:24:22

0

如果所有對象的方法都是相同的,則創建一個選項到對象的散列表並根據該選項調用方法。的if聲明

HashMap<Option,ActionObject> map ; 
for (Option option: map.keySet()) { 
    if (optionIsTrue(option)) { 
     map.get(option).performAction() ; 
    } 
} 
+0

爲什麼使用hashmap而不僅僅是數組/矢量? – stefan 2011-03-25 09:10:38

+0

這隻解決了一半的問題:只有當一個'Option'實例爲真時,他才需要調用'performAction()' – MarcoS 2011-03-25 09:14:42

+0

@stefan,因爲如果你使用一個數組,你必須保留兩個數組,並且從option根據索引來對象。 – euphoria83 2011-03-25 18:45:00

0

長序列不是總是一件壞事。如果你想這樣做正確的方式雖然,你必須定義你的選項到數據結構中的「處理程序」的映射,而不是在if語句中硬編碼它。

您可以定義一個方法接口,並有ABC(在你的例子)實現:

public interface OptionHandler { // For lack of a better name... 
    void handleOption(); // You could pass parameters here 
} 

然後,您可以定義地圖的選項,它們的處理程序:

private final Map<Option, OptionHandler> optionHandlers = new HashMap<Option, OptionHandler>(); 

你會再與像更換您的if語句序列10

0

這實際上取決於您想要優化的內容(請參閱templatetypedef的註釋)。如果你只是想減少代碼量可能會做這樣的事

// let's assume you have an Option interface with isTrue() method 
// let's assume you have an Action interface with performAction() method 

Map<Option,Action> actions = new HashMap<Option,Action>(); 
// initialize actions with instance of your objects so that you have: 
// optionA -> actionA 
// optionB -> actionB 
// etc. 
// this is done only once 

Option[] currentOptions; 
// read the current option values and put them in an array 
for (int i = 0; i < currentOptions.lengt; i++) { 
    if (currentOptions[i].isTrue()) 
     actions.get(currentOptions[i]).performAction(); 
}