Algorithm 使用自己的确认对话框实现验证链?
我需要执行一系列验证,比如ValidationA、ValidationB、ValidationC 如果任何验证失败,链将无法立即验证 每个后续验证仅在前一个验证条件通过后执行 如果验证条件失败,我需要向用户显示一个确认对话框,例如“您确定要执行此操作吗?”-如果用户说“是”,那么我们应该继续进行链中的下一个验证。如果用户在确认对话框中说“否”,则我们可以立即失败Algorithm 使用自己的确认对话框实现验证链?,algorithm,design-patterns,language-agnostic,Algorithm,Design Patterns,Language Agnostic,我需要执行一系列验证,比如ValidationA、ValidationB、ValidationC 如果任何验证失败,链将无法立即验证 每个后续验证仅在前一个验证条件通过后执行 如果验证条件失败,我需要向用户显示一个确认对话框,例如“您确定要执行此操作吗?”-如果用户说“是”,那么我们应该继续进行链中的下一个验证。如果用户在确认对话框中说“否”,则我们可以立即失败 实现这一点的好方法是什么?如下所示: (ValidationA || UserConfirmationA) && (V
实现这一点的好方法是什么?如下所示:
(ValidationA || UserConfirmationA) && (ValidationB || UserConfirmationB) && (ValidationC || UserConfirmationC)
其中,Validation和usercofirmation是一个函数,它们按照名称执行操作并返回布尔值
我假设&&
和|
是懒惰的,这在大多数语言中都是如此。答案是C,但我希望这是清楚的。这里最重要的是原始验证与UI分离。OverridableValidator是一个“UI guy”,它在构造函数中获取“LogicGuy”,以及要显示给用户的消息
interface IValidator<T>
{
bool IsValid(T subject);
}
class OverridableValidator<T> : IValidator<T>
{
readonly IValidator<T> _validator;
readonly string _confirmOverrideMessage;
public OverridableValidator(IValidator<T> validator, string confirmOverrideMessage)
{
_validator = validator;
_confirmOverrideMessage = confirmOverrideMessage;
}
public bool IsValid(T subject)
{
if (_validator.IsValid(subject))
{
return true;
}
return MessageBox.Show(_confirmOverrideMessage, "Confirmation required", MessageBoxIcon.Question, MessageBoxButtons.YesNo) == DialogResult.Yes;
}
}
class Person
{
public int Age {get;set;}
public int HeightInCentimeters {get;set;}
}
class MaturityValidator : IValidator<Person>
{
public bool IsValid(Person guy)
{
return guy.Age >= 18;
}
}
class HeightValidator : IValidator<Person>
{
public bool IsValid(Person guy)
{
return guy.HeightInCentimeters < 120;
}
}
void Main()
{
var ageValidator = new OverridableValidator<Person>(new MaturityValidator(), "Do you want to sell him cigarettes?");
var heightValidator = new OverridableValidator<Person>(new HeightValidator(), "Do you want to invite such a short person to your basketball team?");
var validatedPerson = new Person() { Age = 15, HeightInCentimeters = 140 };
var validatorsList = new[] {ageValidator, heightValidator};
foreach (var validator in validatorsList)
{
if (!validator.IsValid(validatedPerson))
{
return; //validaton failed
}
}
Console.WriteLine("This guy can smoke and play in NBA");
}
接口IValidator
{
bool有效(T科目);
}
类可重写验证器:IValidator
{
只读IValidator_校验器;
只读字符串_confirmOverrideMessage;
公共可重写验证器(IValidator验证器、字符串确认器消息)
{
_验证器=验证器;
_确认消息=确认消息;
}
公共bool有效(T科目)
{
如果(_validator.IsValid(主题))
{
返回true;
}
return MessageBox.Show(_confirmOverrideMessage,“需要确认”,MessageBoxIcon.Question,MessageBoxButtons.YesNo)=DialogResult.Yes;
}
}
班主任
{
公共整数{get;set;}
公共int高度激励仪{get;set;}
}
类别到期确认器:IValidator
{
公共bool有效(个人)
{
返回盖。年龄>=18岁;
}
}
类高度验证器:IValidator
{
公共bool有效(个人)
{
回程拉线。高度激励仪<120;
}
}
void Main()
{
var ageValidator=new OverridableValidator(new-durationvalidator(),“你想卖给他香烟吗?”);
var heightValidator=new OverridableValidator(new heightValidator(),“你想邀请这么矮的人加入你的篮球队吗?”);
var validatedPerson=new Person(){Age=15,HeightInCentimeters=140};
var validatorsList=new[]{ageValidator,heightValidator};
foreach(validatorsList中的var验证器)
{
如果(!validator.IsValid(validatedPerson))
{
return;//验证失败
}
}
WriteLine(“这家伙可以在NBA吸烟和打球”);
}
除了dzendras所说的,它还可以帮助您考虑允许动态添加验证器。糟糕的设计。我甚至担心真正的代码会是什么样子。。。意大利面地狱。也许是时候做个标记了?