可选的验证取决于参数

时间:2015-10-05 08:08:26

标签: c#

我有一个'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语句的nullable int是一个不好的路径。

我可以实现一种设计模式来实现类似的东西吗?

1 个答案:

答案 0 :(得分:1)

您的代码难以通过阅读来预测:

brandDimensions.Client = ValidateClient(clientId);

ValidateClient应返回truthy或falsy对象。但是被分配给名为“Client”的Object。 验证器返回BrandInfo对象。但是不包括任何表明它是否有效的属性或方法?!?

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

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

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

如果要在ComplexObjectValidator之后验证复杂对象名称。 复杂对象的每个部分都经过验证。

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

很难说出更具体的内容,因为不清楚你的代码做了什么或打算做什么。

编辑: 根据经验:

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

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

ValidateClient意味着它只是验证。更具体地说,它只是返回无效。因为它只是验证。如果它返回truthy或falsy值,请使用上面列出的前缀之一。如果它返回Validator对象,则使用“GetValidationResultFor(xyz)”。