有没有更好的优化方法来编写这段代码?
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 ?
答案 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内置了处理验证和错误列表的机制。因此,请检查您的框架提供的内容。