2017-08-17 88 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

我想建立一個通用的驗證我的實體和實體的領域,我寫這篇

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); 
} 

和Validator類

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); 
     } 
    } 
} 

,但我不知道如何實現接口有效性規則和其他類(NotNullValidationRule,NotEmptyValidationRule,AlreadyExistValidationRule)

+0

找到的答案? –

回答

0

我會寫這樣的:

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

在您引用鏈接時,接受的答案建議使用Strategy設計模式,然後給出一個接口和實現的例子。在你的情況下,你將創建一個新的接口ValidationRule,至少有一個方法validate(),然後你將創建每個實現該接口的具體類(NotNullValidationRule,NotEmptyValidationRule,AlreadyExistValidationRule)。