2010-09-20 2 views
0

Единственное, что исходит от этого кода - это то, что он работает. Не могли бы вы помочь мне структурировать его лучше?Оптимизация вложенных, если/then, java

if (profile.isIgnoreCase()) { 
    // ignore case 
    if (masterKey.equalsIgnoreCase((targetKey))) { 
    if (masterValue.equalsIgnoreCase(targetValue)) { 
     doOK(masterKey, masterValue); 
     break; 
    } else { 
     // Key is either Missing or is an Error 
     if (checkErrors) { 
     doError(masterKey, masterValue, targetValue); 
     break; 
     } 
    } 
    } 
} else { 
    if (masterKey.equals(targetKey)) { 
    if (masterValue.equals(targetValue)) { 
     doOK(masterKey, masterValue); 
     break; 
    } else { 
     if (checkErrors) { 
     doError(masterKey, masterValue, targetValue); 
     break; 
     } 
    } 
    } 
} 

ответ

2

Вы можете удалить некоторые из повторения с помощью:

if (profile.isIgnoreCase()) { 
    masterKey = masterKey.toLowerCase(); 
    masterValue = masterValue.toLowerCase(); 
} 

if (masterKey.equals(targetKey)) { 
    if (masterValue.equals(targetValue)) { 
     doOK(masterKey, masterValue); 
    } else { 
     if (checkErrors) { 
      doError(masterKey, masterValue, targetValue); 
     } 
    } 
} 

Я также удалил break с, как я не выглядеть, как вам нужно их мне

[UPDATE] Альтернативно , как насчет написания нового метода для обработки сравнения

public boolean isEqual(String a, String b, boolean ignoreCase) { 
    if (ignoreCase) { 
     return a.equalsIgnoreCase(b); 
    } else { 
     return a.equals(b); 
    } 
} 

Вы должны затем обновить свой код следующим образом:

if (isEqual(masterKey,targetKey,profile.isIgnoreCase())) { 
    if (isEqual(masterValue,targetValue,profile.isIgnoreCase())) { 
     doOK(masterKey, masterValue); 
    } else { 
     if (checkErrors) { 
      doError(masterKey, masterValue, targetValue); 
     } 
    } 
} 
+0

Вы должны убедиться, что targetKey/targetValue также имеют нижний регистр, конечно. – EboMike

+0

Бах конечно - хорошо пятнистый EboMike – irishbuzz

+0

Хорошая идея, но мы меняем данные здесь. Ключ MaSteR может быть смешанным, что становится актуальным позже в программе. Возможно, временные переменные .. для сравнения ... hmm .. – JAM

0

Вы могли бы сделать его короче, заменив их на булевы, которые они представляют, а именно: masterKey.equalsIgnoreCase((targetKey)) с true или false .which может помочь сделать короче, потому что вам нужно будет один меньше if и else пункт.

+0

Перемещение выражений в отдельные логические переменные (если это то, что вы имеете в виду) имеет смысл только в том случае, если некоторые из выражений if повторяются, а это не так. – EboMike

+0

Это неправда! У него две идентичные структуры if-then, которые просто вложены в структуру if/else! Это неэффективно: он может просто обработать if/else BEFOREHAND и THEN запустить вложенный цикл. – TaslemGuy

0

Не знаю, нужен ли вам перерыв. Но я считаю, что это полностью эквивалентно вашему коду.

bool ignoreCase = profile.isIgnoreCase(); 

if(ignoreCase and masterKey.equalsIgnoreCase(targetKey) or !ignoreCase and masterKey.equals(targetKey)) { 

    if(ignoreCase and masterValue.equalsIgnoreCase(targetValue) or !ignoreCase and masterValue.equals(targetValue)) { 

     doOK(masterKey, masterValue); 
     break; 

    } else if(checkErrors) { 

     doError(masterKey, masterValue, targetValue); 
     break; 
    } 
} 

Или я хотел бы написать следующую функцию в MasterKey и класса masterValue

public bool equalsCheckCase(targetKey, ignoreCase) { 

    if(ignoreCase) { 
     return this.equalsIgnoreCase(targetKey) 
    } else { 
     return this.equals(targetKey); 
    } 
} 

Таким образом, пример кода становится более удобным для чтения.

bool ignoreCase = profile.isIgnoreCase(); 

if(masterKey.equalsCheckCase(targetKey, ignoreCase)) { 

    if(masterValue.equalsCheckCase(targetValue, ignoreCase)) { 

     doOK(masterKey, masterValue); 
     break; 

    } else if(checkErrors) { 

     doError(masterKey, masterValue, targetValue); 
     break; 
    } 
} 
2

Вывести сравнение ключей и значений в локальные переменные и устранить дублируемую логику. Это позволяет избежать модификации строк, и в качестве бонуса заявления if немного легче на глаза.

boolean keysMatch, valuesMatch; 

if (profile.isIgnoreCase()) { 
    keysMatch = masterKey .equalsIgnoreCase(targetKey); 
    valuesMatch = masterValue.equalsIgnoreCase(targetValue); 
} else { 
    keysMatch = masterKey .equals(targetKey); 
    valuesMatch = masterValue.equals(targetValue); 
} 

if (keysMatch) { 
    if (valuesMatch) { 
     doOK(masterKey, masterValue); 
     break; 
    } else { 
     // Key is either Missing or is an Error 
     if (checkErrors) { 
      doError(masterKey, masterValue, targetValue); 
      break; 
     } 
    } 
} 
0
bool ignoreCase = profile.isIgnoreCase(); 

if ((ignoreCase && masterKey.equalsIgnoreCase(targetKey)) || 
    (!ignoreCase && masterKey.equals(targetKey))){ 

    if ((ignoreCase && masterValue.equalsIgnoreCase(targetValue)) || 
     (!ignoreCase && masterValue.equals(targetValue))) { 

     doOK(masterKey, masterValue); 
     break; 
    } else 
     if (checkErrors) { 
     doError(masterKey, masterValue, targetValue); 
     break; 
     } 
} 

Должен быть ускорена этим способом чтения логического значения, если это имеет значение ложной программы может перейти к следующей оценке быстрее, чем при запуске строки сравнить первый.

Смежные вопросы