簡體   English   中英

嵌套的IF語句

[英]Nested IF statements

我經常遇到以下情況需要編寫如下代碼的情況:無需大量IF語句即可整齊地執行此操作的任何設計模式-

A obj = new A();
B obj2 = new B();

for ( i = 1 ; i < 20  ; i ++ )  {

if( i == 1 ) 
  obj.setField1(obj2.getOption1())
else if ( i == 2 ) 
  obj.setField1(obj2.getOption2())
else if ( i == 3 ) 
  obj.setField1(obj2.getOption3())

And so on.. for 20 times .. 

obj.setField2(obj2.getNonOptionField2());
obj.setField3(obj2.getNonOptionField3())

}

編輯-

與循環類似,我在數據庫上循環,每條記錄在其他表中再創建20條記錄。 在20條記錄中,除了我添加的條件之外,大多數列都是相同的。

是的,設計不是最好的,但我沒有選擇。

如果操作的條件是整數,則可以創建Map<Integer,MyAction> ,其中MyAction是為此特定目的定義的接口。 MyAction實現放入映射中以與整數選項相對應,並在運行時調用操作以響應傳入的值:

interface MyAction {
    void setField(A obj, B obj2);
}
...
Map<Integer,MyAction> actionByNumber = new HashMap<Integer,MyAction>();
actionByNumber.put(1, new MyAction() {
    void setField(A obj, B obj2) {
        obj.setField1(obj2.getOption1());
    }
});
actionByNumber.put(2, new MyAction() {
    void setField(A obj, B obj2) {
        obj.setField1(obj2.getOption2());
    }
});
...
A obj = ...
B obj2 = ...
for (int i = 0 ; i != 20 ; i++) {
    MyAction action = actionByNumber.get(i);
    if (action != null) {
       action.setField(obj, obj2);
    }
}

嘗試改用開關盒

例如,您的代碼將是:

for ( i = 1 ; i < 20  ; i ++ )  {
    switch(i){
        case(1): obj.setField1(obj2.getOption1());
                 break;
        case(2): obj.setField1(obj2.getOption2());
                 break;
        case(3): obj.setField1(obj2.getOption3());
                 break;
    }
}

一種選擇是switch語句。

另一個選擇是使obj2保留一個選項數組,並通過索引對其進行訪問。 就像是:

obj.setField1(obj2.options[i]);

人們會爭論這種O-Oness,但是您可以使用訪問器方法來修飾它。

+1以建議dasblinkenlight使用界面和模式。 如果if / switch不斷增長,通常是代碼氣味,表明某些OO重構是適當的。 您可以添加一個方法以將新的MyAction實例傳遞給地圖。 這種方法優於ifswitch構造的優點是:

1-實施對擴展開放,對修改封閉的策略。 您要添加新行為嗎? 無需為不斷增長的原始類添加其他條件,只需創建MyAction的新實現並將其傳遞即可。

2-可以通過更改地圖的內容來更改運行時的行為。

根據您的確切要求,您可能不需要將actionByNumber用作地圖,也許必要時可以對列表進行排序,排序或排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM