我有一个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);
}
答案 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());