Algorithm 使用自己的确认对话框实现验证链?

Algorithm 使用自己的确认对话框实现验证链?,algorithm,design-patterns,language-agnostic,Algorithm,Design Patterns,Language Agnostic,我需要执行一系列验证,比如ValidationA、ValidationB、ValidationC 如果任何验证失败,链将无法立即验证 每个后续验证仅在前一个验证条件通过后执行 如果验证条件失败,我需要向用户显示一个确认对话框,例如“您确定要执行此操作吗?”-如果用户说“是”,那么我们应该继续进行链中的下一个验证。如果用户在确认对话框中说“否”,则我们可以立即失败 实现这一点的好方法是什么?如下所示: (ValidationA || UserConfirmationA) && (V

我需要执行一系列验证,比如ValidationA、ValidationB、ValidationC

如果任何验证失败,链将无法立即验证

每个后续验证仅在前一个验证条件通过后执行

如果验证条件失败,我需要向用户显示一个确认对话框,例如“您确定要执行此操作吗?”-如果用户说“是”,那么我们应该继续进行链中的下一个验证。如果用户在确认对话框中说“否”,则我们可以立即失败


实现这一点的好方法是什么?

如下所示:

(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所说的,它还可以帮助您考虑允许动态添加验证器。

糟糕的设计。我甚至担心真正的代码会是什么样子。。。意大利面地狱。也许是时候做个标记了?