2015-10-05 88 views
1

我有一个'Validator'类需要做一些简单的验证。但是,有些情况下可能需要调用全部或只是一种方法。依赖于参数的可选验证

用于验证的接口被定义为:

internal interface IBrandValidator 
    { 
    BrandInfo ValidateBrands(); 
    } 

类定义为对象返回:

internal class BrandInfo 
    { 
    public Organisation Brand { get; set; } 
    public Client Client { get; set; } 
    public Location Location { get; set; } 
    public Language Language { get; set; } 
    } 

实现该接口的类:

internal class ClientValidator : IBrandValidator 
    { 
    private readonly int? clientId; 
    private readonly int? locationId; 
    private readonly int? languageId; 

    public ClientValidator(int clientId, int? locationId, int? languageId) 
    { 
     this.clientId = clientId; 
     this.locationId = locationId; 
     this.languageId = languageId; 
    } 

    public BrandInfo ValidateBrandDimensions() 
    { 
     var brandInfo= new BrandInfo(); 

     //Optional validation 
     if(client != null) 
     brandDimensions.Client = ValidateClient(clientId); 
     if(locationId != null) 
      brandDimensions.Location = ValidateLocation(locationId); 
     if(languageId != null) 
      brandDimensions.Language = ValidateLanguage(languageId); 

     return brandInfo; 
    } 
    } 

我的问题是。评论'可选验证'下的3种验证方法。可能或可能不需要被调用。但是,可能还有一些事情需要在将来验证,并且使用if语句的可空int可能是一条糟糕的路线。

有没有我可以实现的设计模式来实现类似的东西?

+0

可能会单独执行你的界面吗? –

回答

1

你的代码是难以预料通过阅读例如:

brandDimensions.Client = ValidateClient(clientId); 

ValidateClient应该返回truthy或falsy对象。但分配给名称为“客户端”的对象。 您的验证器返回BrandInfo对象。但不包括任何指示其是否有效的财产或方法?!?

ClientValidator不必验证客户端 - 因为它可以为空?

它认为你应该考虑重新组织你的部分代码。

如果一个类从一个标识符创建了很多对象,你可以使用工厂模式。

如果您想在ComplexObjectValidator之后验证复杂的对象名称。 复杂对象的每个部分都得到验证。

如果有效的是,例如Id是可以为空的,则将该检查放入Validator Implementation中。

很难说更多的细节,因为它不清楚你的代码做什么或打算做什么。

编辑: 作为一个经验法则:

Truthy或falsy方法:用前缀“是”,“必须”,“应该”,“有”,“可以”等 如果一个方法应返回一个对象:“ “GetValidatedClient”“ValidateAndReturnClient”“CreateClient”

因此,有人在未来(6个月,3年,10年)阅读您的代码,可以从您的函数名称推断出行为。

ValidateClient会暗示它只是验证。更具体地说,它只是返回void。因为它只是验证。如果它返回真值或伪值,则使用上面列出的前缀之一。如果它返回一个Validator对象,例如使用“GetValidationResultFor(xyz)”。

+0

感谢您的回应。每种验证方法都会返回一个对象。如果验证失败,则抛出异常。我将使用你提到的命名约定。 – JBond