C# 可选验证取决于参数

C# 可选验证取决于参数,c#,C#,我有一个“Validator”类,需要做一些简单的验证。但是,在某些情况下,可能需要调用全部或单个方法 验证程序的接口定义为: internal interface IBrandValidator { BrandInfo ValidateBrands(); } 要返回的对象的类定义: internal class BrandInfo { public Organisation Brand { get; set; } public Client Cl

我有一个“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语句中使用可为null的int是一种错误的方法


是否有一种设计模式可以实现类似的功能?

您的代码很难预测,例如:

brandDimensions.Client = ValidateClient(clientId);
ValidateClient应返回truthy或falsy对象。但被分配给名为“客户端”的对象。 验证器返回一个BrandInfo对象。但不包括任何属性或方法,表明它是否有效

ClientValidator不必为客户端进行验证-因为它是可空的

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

如果一个类从一个标识符创建了许多对象,那么您可能会使用工厂模式

如果要验证复杂对象,请将其命名为ComplexObjectValidator。 复杂对象的每个部分都会得到验证

例如,如果Id可以为null是有效的,则将该检查放入验证器实现中

很难说出更多细节,因为不清楚您的代码做了什么或打算做什么

编辑: 根据经验:

Truthy或falsy方法:前缀为“Is”“Must”“Should”“Has”“Can”等。 如果方法应返回对象:“GetValidatedClient”“ValidateAndReturnClient”“CreateClient”

因此,将来(6个月、3年、10年)阅读你的代码的人可以从你的函数名推断出你的行为


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

可能需要单独实现您的接口吗?感谢您的回复。每个验证方法都会返回一个对象。如果验证失败,将引发异常。我将使用您提到的命名约定。