我正在用 Java 开发一个 BlackBerry 应用程序,并且有一个存储所有用户设置的选项类。问题是我需要检查一些条件才能知道如何反应。随着我不断添加更多功能,会向用户显示更多 GUI 选项,Options 类中存储更多设置,并且需要检查更多条件。
以下面的代码为例:
private void doCallMonitoring(int callId){
/*This is the part that I want to avoid. Having
multiple nested ifs. Here's just two conditions
but as I add more, it will get unmantainable
very quickly.*/
if(Options.isActive().booleanValue()){
callTime = new Timer();
TimerTask callTimeTask = new TimerTask(){
public void run(){
callTimeSeconds++;
if((callTimeSeconds == Options.getSoftLimit().intValue()) && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)){
injectDTMFTone(Phone.getActiveCall());
}else if((callTimeSeconds >= Options.getHardLimit().intValue()) && (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)){
injectEndCall();
}
}
};
callTime.schedule(callTimeTask, 0,1000);
}else{
System.out.println("Service not active");
}
}
我希望它的工作方式是通过一次调用验证所有选项,并从那里确定操作的诅咒。我怎样才能实现这样的设计呢?
另一种选择是使用诸如injectDMTFTone()
检查他们是否想要处理该条件,并根据是否已处理返回 true 或 false。
例如:
public void run() {
callTimeSeconds++;
do {
if (handleInjectDMTFTone())
break;
if (handleInjectEndCall())
break;
} while(false);
callTime.schedule(callTimeTask, 0,1000);
}
boolean handleInjectDMTFTone() {
if ((callTimeSeconds != Options.getSoftLimit().intValue()) ||
(Phone.getActiveCall().getStatus() != PhoneCall.STATUS_CONNECTED))
return false;
injectDTMFTone(Phone.getActiveCall());
return true;
}
boolean handleInjectEndCall() {
if ((callTimeSeconds < Options.getHardLimit().intValue()) ||
(Phone.getActiveCall().getStatus() != PhoneCall.STATUS_CONNECTED))
return false;
injectEndCall();
return true;
}
当然,而不是调用另一个injectDMTFTone()
方法或injectEndCall()
方法,您只需将该逻辑内联到这些方法中即可。通过这种方式,您可以将如何以及何时处理这些条件的所有逻辑集中在同一个地方。
这是我最喜欢的图案之一;使用if
语句尽可能靠近方法顶部,以消除条件并返回。该方法的其余部分没有多级缩进,并且易于阅读。
您可以通过创建所有实现相同接口并且位于您的处理程序存储库中的对象来进一步扩展它。run
方法可以迭代以查看哪个将处理它。这对你的情况来说可能会也可能不会太过分。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)