Java 在我的ussd应用程序中减少if-else语句
我有一个ussd应用程序,我在其中生成一个接口,并带有预定义的选项,例如1。我的账户2。交易3。账单查询。用户在手机上输入1、2、3或任何其他预定义选项。现在,由于所有界面的输入值都相同,为了跟踪用户的进度,每次用户导航到某个界面时,我都会设置状态。现在我的问题是州越来越多了,我有大约30个州,if-else语句开始看起来像一个大意大利面球加上不要忘记这个方法是不可伸缩的。任何人都可以帮助我做一个更好的设计,可能是一个可扩展的设计Java 在我的ussd应用程序中减少if-else语句,java,algorithm,Java,Algorithm,我有一个ussd应用程序,我在其中生成一个接口,并带有预定义的选项,例如1。我的账户2。交易3。账单查询。用户在手机上输入1、2、3或任何其他预定义选项。现在,由于所有界面的输入值都相同,为了跟踪用户的进度,每次用户导航到某个界面时,我都会设置状态。现在我的问题是州越来越多了,我有大约30个州,if-else语句开始看起来像一个大意大利面球加上不要忘记这个方法是不可伸缩的。任何人都可以帮助我做一个更好的设计,可能是一个可扩展的设计 if (state == 35) {//exit applica
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);
}
在您的示例代码段中,在
if
的每个子句中都重复了out.println(a)
,您可以通过将out.println(a)
移到if
之外来简化代码。如果,也可以使用开关
,而不是。
然而,这些想法都不能从根本上改善设计
我建议你看看“”的设计模式。本质上,每个状态都有一个单独的对象,它知道如何处理该状态下的交互,还有一个外部容器,它接收事件,保存对当前状态对象的引用,并将事件委托给它
第二个(正交)建议是命名你揭示意图的方法——即行为。方法deactivate\u nav()
可以,但是my\u account(uid)
没有说明该方法的作用
如果没有关于具体问题的更多信息,就很难给出具体的建议。您可以使用映射
并将键设为状态,值是接口的对象,例如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());
为什么不使用switch case?这是一个很好的主意,现在让我试试看结果如何