Другой вариант - сделать что-то вроде «заменить условный полиморфизм».
Хотя кажется, что вы просто пишете больше кода, вы можете заменить все эти правила на объект «validator» и иметь все проверки в некотором массиве и проходить через них.
Что-то вроде этого скретч-кода.
private void doCallMonitoring(int callId){
// Iterate the valiators and take action if needed.
for( Validation validation : validationRules ) {
if( validation.succeed() ) {
validation.takeAction();
}
}
}
И вы реализуете их так:
abstract class Validation {
public boolean suceed();
public void takeAction();
}
class InjectDTMFToneValidation extends Validation {
public boolean suceed() {
return (callTimeSeconds == Options.getSoftLimit().intValue())
&& (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)
}
public void takeAction() {
injectDTMFTone(Phone.getActiveCall());
}
}
class InjectEndCallValidation extends Validation {
public boolean suceed() {
return (callTimeSeconds >= Options.getHardLimit().intValue())
&& (Phone.getActiveCall().getStatus() == PhoneCall.STATUS_CONNECTED)
}
public void takeAction() {
injectEndCall();
}
}
И, наконец, установите их в списке:
private List<Validation> validationRules = new ArrayList<Validation>();{
validationrules.add( new InjectDTMFToneValidation() );
validationrules.add( new InjectEndCallValidation () );
...
...
}
Идея в том, чтобы переместить логику в подклассы. Конечно, вы получите лучшую структуру и, вероятно, suceed и takeAction могли бы быть заменены другими более значимыми методами, цель состоит в том, чтобы получить подтверждение от того, где оно находится.
Это становится более абстрактным? .. да.
Кстати, почему вы используете классы Options и Phone, вызывая их статические методы вместо использования экземпляров?