私が見る限り、これはカスケード ステップの例であり、1 番目と 1 番目と 2 番目が有効な場合に 2 番目と 3 番目のステップが実行されます。つまり、hasFailed==false を返します。
このコードは、Template Method と Decorator デザイン パターンを使用して、より洗練されたものにすることができます。
1 つのインターフェイス、具体的な実装、抽象クラス、および抽象クラスのいくつかのサブクラスが必要です。
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 オブジェクトは 1 行で作成できますが、検証の順序が明確になるため、このスタイルを好みます。チェーン内に新しい検証リンクを作成するには、AbstractValidator クラスをサブクラス化し、predicate および isInvalid メソッドを実装する必要があります。