2012-05-03 3 views
3

У меня есть метод хотят реорганизовать, и некоторые фиктивные коды, как показано ниже:как реорганизовать следующие коды

if(deletedInfo.isEmpty() && addedInfo.isEmpty()) { 
    // some logic codes 
} else if (!deletedInfo.isEmpty() && addedInfo.isEmpty()) { 
    // some logic codes 
} else if (deletedInfo.isEmpty() && !addedInfo.isEmpty()) { 
    // some logic codes 
} else if(!deletedInfo.isEmpty() && !addedInfo.isEmpty()) { 
    // some logic codes 
} 

существует ли соответствующий шаблон или некоторый алгоритм, чтобы реорганизовать этот код?

Спасибо.

+1

ли '// некоторая логика code' полностью различны в каждом состоянии? – assylias

+0

Мне не нравится любое предлагаемое решение. Наверное, потому что нужно больше контекстной информации. Возможно, рефакторинг структуры данных ... не имеет смысла deletedInfo и добавилInfo вообще, не так ли? Если не удаляться, следует добавить. Если вы хотите проверить, не произошло ли что-либо (не добавлено, не удалено), возможно, ваша структура объекта будет пустой. –

ответ

4
if (deletedInfo.isEmpty()) { 

    if (addedInfo.isEmpty()) { 
     // some logic codes 
    } else { 
     // some logic codes 
    } 

} else { 

    if (addedInfo.isEmpty()) { 
     // some logic codes 
    } else { 
     // some logic codes 
    } 

} 
+0

Вы также можете поместить строки внутри внешних 'if' и' else' в частный метод и вызвать его вместо этого. Будет неоценимо, особенно если логика много длинная. – adarshr

0

Есть несколько способов, которыми вы могли бы это сделать. Вот один:

if (a) { 
    if (b) { 
    // do J 
    } else { 
    // do K 
    } 
} else { 
    if (b) { 
    // do L 
    } else { 
    // do M 
    } 
} 

Вы можете предпочесть что-то более похожее на таблицу истинности, особенно если у вас есть более двух тестов для объединения:

int switcher = 0; 
if (a) switcher|=1; 
if (b) switcher|=2; 
switch(switcher) { 
    case 0: 
    // do J 
    break; 
    case 1: 
    // do K 
    break; 
    case 2: 
    // do L 
    break; 
    case 3: 
    // do M 
    break; 
} 

Я не думаю, что это автоматически «право «путь - вам нужно выбрать все, что лучше для вашей ситуации.

+0

Я бы не пошел с переключателем. Похож на меня. – aioobe

+0

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

+1

switch ((a? 0: 2) + (b 0: 1)) {... –

2

Вы можете реорганизовать с этим кодом:

int val = 0; 
if (deletedInfo.isEmpty()) val |= 0x1; 
if (addedInfo.isEmpty()) val |= 0x2; 

switch (val) { 
    case 0: // some logic codes 
    case 1: // some logic codes 
    case 2: // some logic codes 
    case 3: // some logic codes 
} 
Смежные вопросы