2017-08-17 3 views
0
私はこの記事を読んで

リファクタリングビジネスロジックの検証

private void validate(Customer customer) { 

    List<String> errors = new ArrayList<>(); 

    if (customer == null) { 
     errors.add("Customer must not be null"); 
    } 

    if (customer != null && customer.getName() == null) { 
     errors.add("Name must not be null"); 
    } 

    if (customer != null && customer.getName().isEmpty()) { 
     errors.add("Name must not be empty"); 
    } 

    if (customer != null) { 
     Customer customerFromDb = customerRepository.findByName(customer.getName()); 
     if (customerFromDb != null) { 
      errors.add("Customer already present on db"); 
     } 
    } 

    if (!errors.isEmpty()) { 
     throw new ValidationException(errors); 
    } 
} 

このコードをリファクタリングしようとしている

Business logic validation patterns & advices

私は私のエンティティとエンティティのフィールドのための汎用バリデータを構築したいと思います

、Iこの

private void validate(Customer customer) { 

    List<ValidationRule> validationRules = new ArrayList<>(); 

    validationRules.add(new NotNullValidationRule(customer)); 
    validationRules.add(new NotNullValidationRule(customer, Customer::getName)); 
    validationRules.add(new NotEmptyValidationRule(customer, Customer::getName)); 
    validationRules.add(new AlreadyExistValidationRule(customer -> customerRepository.findByName(customer.getName()))); 

    Validator.validate(validationRules); 
} 

とバリデータクラスを書いた

public class Validator { 

    public static void validate(List<ValidationRule> validationRules) { 
     final List<String> errors = new ArrayList<>(); 
     for (final ValidationRule rule : validationRules) { 
      final Optional<String> error = rule.validate(); 
      if (error.isPresent()) { 
       errors.add(error.get()); 
      } 
     } 

     if (!errors.isEmpty()) { 
      throw new ValidationException(errors); 
     } 
    } 
} 

が、私は私が何か書くと

+0

あなたは答えを見つけましたか? –

答えて

0

インタフェースのValidationRuleと他のクラス(NotNullValidationRule、NotEmptyValidationRule、AlreadyExistValidationRule)を実装する方法がわからない:あなたが参照するリンクで

CommonValidations.notNull(errors, customer); 
if (customer != null) { 
    CommonValidations.notEmpty(errors, customer.getName()); 
} 
customerCustomeBeanValidations.validName(errors, customer.getName()); 
customerCustomeBeanValidations.notExist(errors, customer.getName()); 
0

を、受け入れられた答えはStrategyデザインパターンを使用して提案され、次にインターフェイスと実装の両方の例を挙げました。あなたのケースでは、少なくとも1つのメソッドvalidate()を持つ新しいインタフェースValidationRuleを作成し、そのインタフェースで実装する具象クラス(NotNullValidationRule、NotEmptyValidationRule、AlreadyExistValidationRule)を作成します。