在我的ussd应用程序中减少if else语句

时间:2016-03-12 08:24:05

标签: java algorithm

我有一个ussd应用程序,我生成一个界面和预定义的选项,例如1.我的帐户2.交易3.账单查询。用户键入1或2或3或手机上的任何其他预定义选项。现在,由于来自所有接口的输入是相同的值,为了跟踪用户的进度,每次用户导航到某个界面时我都设置了状态。现在我的问题是状态变得太多我有大约30个状态,而if else语句开始看起来像意大利面的一个大球加上不​​要忘记这种方法是不可扩展的。任何人都可以帮我做一个更好的设计,可能是一个可扩展的设计。

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);
}

2 个答案:

答案 0 :(得分:0)

在您的示例代码段中,out.println(a)的每个子句中都重复if,您可以通过将out.println(a)移到if之外来简化代码。您也可以使用switch代替if。 然而,这些想法都没有从根本上改善设计。

我建议您查看“State”设计模式。实质上,每个状态都有一个单独的对象,它知道如何处理该状态中的交互,以及一个接收事件的外部容器,保存对当前状态对象的引用,并将事件委托给它。

第二个(正交)建议是命名您的方法以揭示意图 -i.e。行为。方法deactivate_nav()没问题,但my_account(uid)没有说出做的方法。

如果没有关于您的具体问题的更多信息,很难提供具体的建议。

答案 1 :(得分: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());