C# 可选验证取决于参数
我有一个“Validator”类,需要做一些简单的验证。但是,在某些情况下,可能需要调用全部或单个方法 验证程序的接口定义为:C# 可选验证取决于参数,c#,C#,我有一个“Validator”类,需要做一些简单的验证。但是,在某些情况下,可能需要调用全部或单个方法 验证程序的接口定义为: internal interface IBrandValidator { BrandInfo ValidateBrands(); } 要返回的对象的类定义: internal class BrandInfo { public Organisation Brand { get; set; } public Client Cl
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)”。可能需要单独实现您的接口吗?感谢您的回复。每个验证方法都会返回一个对象。如果验证失败,将引发异常。我将使用您提到的命名约定。