Насколько я вижу, это пример каскадных шагов, когда второй и третий шаги будут выполнены, если первое и первое и второе верны, то есть return hasFailed == false.
Этот код можно сделать намного более элегантным, используя Template Method и шаблон проектирования Decorator.
Вам нужен один интерфейс, конкретная реализация, абстрактный класс и несколько подклассов абстрактного класса.
public interface Validator {
public boolean isValid();
}
public class GetNewOrders implements Validator {
public boolean isValid() {
// same code as your GetNewOrders method
}
}
public abstract class AbstractValidator implements Validator {
private final Validator validator;
public AbstractValidator(Validator validator) {
this.validator = validator;
}
protected boolean predicate();
protected boolean isInvalid();
public final boolean isValid() {
if (!this.validator.isValid() && predicate() && isInvalid())
return false;
return true;
}
}
public class CheckInventory extends AbstractValidator {
public CheckInventory(Validator validator) {
super(validator);
}
@Override
public boolean predicate() {
return true;
}
@Override
public boolean isInvalid() {
// same code as your CheckInventory method
}
}
public class PreOrder extends AbstractValidator {
public CheckInventory(Validator validator) {
super(validator);
}
@Override
public boolean predicate() {
return true;
}
@Override
public boolean isInvalid() {
// same code as your PreOrder method
}
}
Теперь ваш метод может выглядеть намного элегантнее:
public void MyMethod() {
bool success = false;
try {
Validator validator = new GetNewOrders();
validator = new CheckInventory(validator);
validator = new PreOrder(validator);
success = validator.isValid();
} finally {
if (!success) {
// do something
}
}
}
Объект Validator может быть создан в одну строку, но я предпочитаю этот стиль, поскольку он делает очевидным порядок проверки. Создание новой ссылки проверки в цепочке зависит от подкласса класса AbstractValidator и реализации методов предиката и isInvalid.