我有一个'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是一个不好的路径。
我可以实现一种设计模式来实现类似的东西吗?
答案 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)”。