优化此Validate方法

时间:2010-11-25 17:15:23

标签: c# c#-3.0

有没有更好的优化方法来编写这段代码?

    public int ValidateEntries()
    {
        if (this.CompanyName.Length < 6)
        {
            MessageBox.Show("Company name must be of at least six characters.", "Invalid Entry", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return 1;
        }

        if (DateTime.Parse(this.FYStarting) > DateTime.Parse(this.FYEnding))
        {
            MessageBox.Show("Invalid financial year period.", "Invalid Entry", MessageBoxButtons.OK, MessageBoxIcon.Error);
            return 1;
        }
        return 0;  //Default error code: 0 : No Error, 1 : Error
    }

我想介绍 try..catch 阻止以防万一发生错误。但它会产生开销。我也想摆脱这些 if s。

第三,哪个更优化: Convert.ToDateTime DateTime.parse

3 个答案:

答案 0 :(得分:3)

声明性验证是一种最佳方式,使用适合您的相应验证框架(就像您在Entlib中可以找到的那样)

您必须摆脱当前的解决方案,并以更清洁,更简单和一致的方式处理横切问题。

答案 1 :(得分:2)

更好的方法是划分数据类和UI。使用特殊接口(如IDataErrorInfo和验证模式)可以帮助您将来支持您的代码。

答案 2 :(得分:2)

try ... catch相对便宜。如果抛出异常,它只会变得昂贵。

但我不喜欢你混合GUI和逻辑的方式。我宁愿传入错误列表(最简单的情况是List<string>但可能更复杂)并在每个验证子句中添加错误。最后,您可以检查errorlist.Count是否发生任何错误并显示消息。

如果你的int总是只代表两个值,那么bool会更好。

简化示例:

public class ErrorList:List<string>
{
    public bool HasErrors{get{return Count>0;}}
}

public void ValidateEntries(ErrorList errors)
{
    if (this.CompanyName.Length < 6)
        errors.Add("Company name must be of at least six characters.");

    if (DateTime.Parse(this.FYStarting) > DateTime.Parse(this.FYEnding))
       Errors.Add("Invalid financial year period."
}

public void CallingFunction()
{
    var errors=new ErrorList();
    ValidateEntries();
    if(erros.HasErrors)
    {
        ShowMessage(string.Join("\r\n",errors));
        return;
    }
    DoStuff();
}

根据您的体系结构,您还可以创建一些辅助函数或使用更具声明性的设计。但是如果不更好地了解你的程序,很难提供更具体的技巧。例如,在我的代码中,验证甚至不知道Form是什么,并且在ViewModel甚至更低级别的结构上运行。

例如,ASP.net MVC内置了处理验证和错误列表的机制。因此,请检查您的框架提供的内容。