2016-03-12 2 views
0

У меня есть приложение ussd, где я создаю интерфейс и с предопределенными параметрами, например 1. моя учетная запись 2. транзакции 3. запрос счета. пользовательские ключи в 1 или 2 или 3 или любые другие предопределенные опции на телефоне. теперь, поскольку вход со всех интерфейсов является одним и тем же значением, чтобы отслеживать прогресс пользователя, я имею состояние, которое я устанавливаю каждый раз, когда пользователь переходит к определенному интерфейсу. теперь моя проблема состоит в том, что состояния становятся слишком много, у меня около 30 состояний, и оператор if else начинает выглядеть как один большой шар спагетти плюс не забывая, что этот подход не масштабируется. любой может помочь мне сделать лучший дизайн, возможно, масштабируемый.Уменьшить if else заявление в моем приложении ussd

if (state == 35) {//exit application 
    a = mm.exit(uid); 
    out.println(a); 
} else if (state == 3) { 
    a = view.main_menu_nav(uid, value.trim()); 
    out.println(a); 
} else if (state == 4) { 
    a = view.my_account(uid); 
    out.println(a); 
} else if (state == 5) { 
    a = view.my_account_nav(uid, value.trim()); 
    out.println(a); 
} else if (state == 6) { 
    String value = USSD_STRING; 
    a = view.transaction_nav(uid, value.trim()); 
    out.println(a); 
} else if (state == 7) { 
    a = view.deactivate_nav(uid, value.trim()); 
    out.println(a); 
} 
+0

почему бы не использовать переключатель дело? –

ответ

0

В вашем примере фрагмент кода, есть повторение out.println(a) в каждом предложении о if, вы можете упростить код, переместив out.println(a) за пределами if. Вы также можете использовать switch вместо if. Однако ни одна из этих идей не улучшает дизайн.

Я предлагаю вам взглянуть на шаблон дизайна «State». По сути, у вас есть отдельный объект для каждого состояния, который знает, как обрабатывать взаимодействия в этом состоянии, и внешний контейнер, который принимает события, содержит ссылку на текущий объект состояния и делегирует ему события.

Второе (ортогональное) предложение - назвать ваши методы для выявления намерений — Поведение. Метод deactivate_nav() в порядке, но my_account(uid) не говорит, что метод делает.

Трудно дать конкретный совет без дополнительной информации о вашей конкретной проблеме.

0

Вы можете использовать Map и указать ключевое состояние, значение является объектом интерфейса, например. StateAction который обеспечивает правильный метод, который вы затем вызвать:

StateAction action = stateActions.get(state); 

action.execute(); 

интерфейс будет определяться как

interface StateAction 
{ 
    void execute(); 
} 

Карта может быть заполнен программным:

stateActions.put(35, new StateAction 
{ 
    public void execute() 
    { 
     //exit application 
     YourType a = mm.exit(uid); 
     out.println(a); 
    } 
}); 

stateActions.put(3, new StateAction 
{ 
    public void execute() 
    { 
     YourType a = view.main_menu_nav(uid, value.trim()); 
     out.println(a); 
    } 
}); 

// and so on ... 

Также можно создать класс для вашего действия и пусть он реализует интерфейс:

class AccountHandler implements StateAction 
{ 
    // ... 

    public void execute() 
    { 
     YourType a = view.my_account(uid); 
     out.println(a); 
    } 

    // ... 
} 

Добавить это с

stateActions.put(4, new AccountHandler()); 
+0

это отличная идея, позвольте мне попробовать сейчас посмотреть, как это получается –