我有各种类来处理表单数据和查询数据库。我需要一些关于减少从站点到站点编写的代码量的建议。
以下代码用于处理通过ajax发布到服务器的表单。它只是实例化Form类,验证数据并处理任何错误:
public static string submit(Dictionary<string, string> d){
Form f = new Form("myform");
if (!f.validate(d)){
return f.errors.toJSON();
}
//process form...
}
有没有办法将此减少到1行,如下所示:
if (!Form.validate("myform", d)){ return Form.errors.toJSON(); }
答案 0 :(得分:7)
让我们将其分解为两个问题。
1)我可以在一个声明中写出现有的逻辑吗?
必须在自己的语句中声明局部变量,但初始化程序不必存在。说:
是完全合法的Form f;
if (!(f=new Form("myform")).validate(d))return f.errors.toJSON();
为什么你会想要超越我;这样做是丑陋的,难以调试,难以理解,难以维护。但这完全合法。
2)我可以将此实例方法转换为静态方法吗?
可能不直接。假设你有两个调用者在两个不同的线程上验证东西,都调用静态Form.Validate方法,并且都产生错误。现在你有一场比赛。其中一个将赢得并填写Form.Errors。现在你有两个线程报告同一组错误,但其中一个错误是错误的。
将它变成静态方法的更好方法是将整个事物变成一个具有所需语义的静态方法,如在plinth的答案中那样。
Errors errors = Validator.Validate(d);
if (errors != null) return errors.toJSON();
现在代码非常清晰,Validate的实现非常简单。创建一个表单,调用验证器,返回null或错误。
我建议你不要求减少你编写的代码量。相反,请获取有关如何使代码读取更像其打算表示的含义的建议。有时这意味着编写更多代码,但代码清晰易懂。
答案 1 :(得分:3)
我会将所有常见的验证逻辑移到超类中。
我认为你的代码的主要问题不是很长,而是你在许多地方重复这个问题,要么你设法让它成为一个单行,那就不会是DRY。
看看Template Method模式,它可能会有帮助(带有验证的抽象类将是模板,您的特定'操作'将是子类)。
答案 2 :(得分:1)
当然你可以这样写:
public static string FormValidate(Dictionary<string, string> d)
{
Form f = new Form("myform");
if (!f.validate(d))
return f.errors.ToJSON();
return null;
}
然后您的提交可以是:
public static string submit(Dictionary<string, string> d)
{
if ((string errs = FormValidate(d))!= null) { return errs; }
// process form
}
这会减少您的代码,并且不会对可读性造成太大影响。
答案 3 :(得分:0)
如果您真的非常想,可以将错误文本存储在线程本地属性中。
Does C# have a "ThreadLocal" analog (for data members) to the "ThreadStatic" attribute?