ссылка на каждый случай переключения из условного внутри другого метода в java

Я реализую некоторые методы, которые используют операторы switch для различения разных случаев:

private void doThis(){
    switch(command){
    case on: {status = doCalculationsA; break;}
    case off: {status = doCalculationsB; break;}
    case idle: {status = doCalculationsC; break;}
    case stdby:{status = doCalculationsD; break;}   
    }
}

Вышеприведенное прекрасно работает, когда дальше по бизнес-логике я вызываю doThis() внутри других методов, которым нужна функциональность doThis().

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

Я имею в виду, что когда я вызываю doThis() внутри, скажем, bigOperation(), у меня появляются новые условия, которые нужно применять к каждому случаю переключателя, принадлежащего функции doThis():

Пример логики:

biggerOperation(){

    doThat();
    doTheOther();

    if(somethingIsTrue){
      execute "case: on" of doThis()
    }
    else if(somethingElseIsTrue){
      execute "case: off" of doThis()
    }
    else if(aThirdThingIsTrue){
      execute "case: idle" of doThis()
    }
    else if(aFourthThingIsTrue){
      execute "case: stdby" of doThis()
    }
}

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

Любые предложения приветствуются. Очень ценю вашу помощь.


person denchr    schedule 02.08.2009    source источник


Ответы (2)


Преобразуйте перечисление команд в классы, используя шаблон Command.

person Matt Howells    schedule 02.08.2009
comment
Спасибо за ваш вклад. Если вы не возражаете, не могли бы вы объяснить немного больше о новой логике? Используя шаблон команды, вы имеете в виду инкапсулировать вызов метода? - person denchr; 02.08.2009
comment
см. этот вопрос: stackoverflow .com/questions/1199646/ - person Rich Seller; 02.08.2009

Вы можете начать делать что-то вроде

public MyCreatedEnum getCommand() {
    if(somethingIsTrue){
      return MyCreatedEnum.on;
    }
    else if(somethingElseIsTrue){
      return MyCreatedEnum.off
    }
    else if(aThirdThingIsTrue){
      return MyCreatedEnum.idle
    }
    else if(aFourthThingIsTrue){
      return MyCreatedEnum.stdby
    }
}

private void doThis(){
    MyCreatedEnum command = getCommand();
    switch(command){
    case MyCreatedEnum.on: {status = doCalculationsA; break;}
    case MyCreatedEnum.off: {status = doCalculationsB; break;}
    case MyCreatedEnum.idle: {status = doCalculationsC; break;}
    case MyCreatedEnum.stdby:{status = doCalculationsD; break;}   
    }
}

public void biggerOperation(){
    doThat();
    doTheOther();
    doThis();
}

Затем сделайте еще один рефакторинг. Но я думаю, что это хорошая отправная точка (учитывая, что вас не раздражают 4 вложенных варианта if else и 4 случая переключения).

person Samuel Carrijo    schedule 02.08.2009
comment
это выглядит многообещающе. Попробую! - person denchr; 02.08.2009