从丑陋到优雅,让代码越变越美续集之服务器端数据校验
数据校验是两方面的,客户端校验虽然可以大大减少服务器回调次数提升用户体验.但是客户端校验并不是万能 的,从原理上说,客户端返回的数据都是不可信任的,服务器端校验必不可少。(关于客户端校验的总结:从丑陋到优雅,让代 码越变越美(客户端检测方法思考) )
总的来说,服务器端代码也经历了相似的几个过程:
以判断一个输入是否是可以转换成整数为例,开始大家都会续项强写:
Code1
string str = txtTest.Text;
if (!string.IsNullOrEmpty(str))
{
int? intResult = 0;
if (int.TryParse(str, out intResult))
{
if (intResult>0 && intResult<100)
{
//success
}
else
{
ShowMessage ("输入必须大于0小于100");
}
}
else
{
ShowMessage("不能格式化 为Int类型");
}
}
else
{
ShowMessage("输入为空");
}
string str = txtTest.Text;
if (!string.IsNullOrEmpty(str))
{
int? intResult = 0;
if (int.TryParse(str, out intResult))
{
if (intResult>0 && intResult<100)
{
//success
}
else
{
ShowMessage ("输入必须大于0小于100");
}
}
else
{
ShowMessage("不能格式化 为Int类型");
}
}
else
{
ShowMessage("输入为空");
}
看着就够麻烦,然后大家都会总结经验,将检测写成一个一个的函 数:
Code2
protected bool IsInt(string str)
{
if (!string.IsNullOrEmpty(str))
{
int? intResult = 0;
if (int.TryParse(str, out intResult))
{
return true;
}
}
return false;
}
protected bool IsInRange(int max,int min,int input)
{
if (input > min && input < max)
return true;
else
return false;
}
protected bool IsInt(string str)
{
if (!string.IsNullOrEmpty(str))
{
int? intResult = 0;
if (int.TryParse(str, out intResult))
{
return true;
}
}
return false;
}
protected bool IsInRange(int max,int min,int input)
{
if (input > min && input < max)
return true;
else
return false;
}
然后轻松调用:
Code3
if (IsInt (str))
{
if(IsInRange(100,0,int.Parse (str))
{
//success
}
else
{
ShowMessage("输入必须大 于0小于100");
}
}
else
{
ShowMessage("不能格式化为Int 类型");
}
if (IsInt (str))
{
if(IsInRange(100,0,int.Parse (str))
{
//success
}
else
{
ShowMessage("输入必须大 于0小于100");
}
}
else
{
ShowMessage("不能格式化为Int 类型");
}
这样界面果然清爽多了..但是这样就满足了吗? 当然不是,这样的写法还是有很多缺点的,例如一大堆各种类型的判断函数很难记得住,加的方法多了还很容易重复,还有例如随着判断 条件的增多那一堆"If"就让人火大~不优雅啊!!在这个追求优雅的时代,怎么能让这样的代码出在我们追求完美的人的手中? 一定要干 掉它们!
下面,我们就介绍一种经过改良的客户端检测解决方案:
Code4
vInfo info = vHelper.StartVerify (txtTest.Text)
.IsNotNullOrEmpty("输入为空 ")
.IsInt("不能格式化为Int 类型")
.Min(0, "输入小于0")
.Max(100, "输入大于100")
.EndVerify();
ShowMessage(info);
vInfo info = vHelper.StartVerify (txtTest.Text)
.IsNotNullOrEmpty("输入为空 ")
.IsInt("不能格式化为Int 类型")
.Min(0, "输入小于0")
.Max(100, "输入大于100")
.EndVerify();
ShowMessage(info);
上边 这个是检测字符串是否只能转换成int并在0到100范围的.下边这个是检测int类型是否属于0到100范围的.
Code5
vInfo info = vHelper.StartVerify (10)
.IsNotNullOrEmpty("输入 为空")
.Min(0, "输入小于0")
.Max(100, "输入大于100")
.EndVerify();
ShowMessage(info);
vInfo info = vHelper.StartVerify (10)
.IsNotNullOrEmpty("输入 为空")
.Min(0, "输入小于0")
.Max(100, "输入大于100")
.EndVerify();
ShowMessage(info);
相似吧? 无论在检测的数据是任何类型,都只是同一种写法,浅显易记又优雅(囧!),返回的vInfo是一个贫血的实体类:
Code6
public class vInfo
{
private bool _Status;
public bool Status
{
get { return _Status; }
set { _Status = value; }
}
private string _Message;
public string Message
{
get { return _Message; }
set { _Message = value; }
}
}
public class vInfo
{
private bool _Status;
public bool Status
{
get { return _Status; }
set { _Status = value; }
}
private string _Message;
public string Message
{
get { return _Message; }
set { _Message = value; }
}
}