在一个项目中我使用到了软件工厂的工具帮助生成了对数据库的CRUD的方法,在Logic中需要对数据层进行封装,以提供对实体操作的接口,封装后的代码如:

<div style="border-right: #cccccc 1px solid; padding-right: 5px; padding-left: 4px; font-size: 13px; border-top: #cccccc 1px solid; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">
<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">AddNews(Newsnews)
{
<span style="color: #0000ff">try<span style="color: #000000">
{
newsRep.Add(news);<span style="color: #008000">//<span style="color: #008000">执行数据库操作<span style="color: #008000"><span style="color: #000000"><span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">true<span style="color: #000000">;
}
<span style="color: #0000ff">catch<span style="color: #000000">(Exceptionex)
{
LogLogic.AddSystemLog(<span style="color: #0000ff">this<span style="color: #000000">,ex);<span style="color: #008000">//<span style="color: #008000">记录异常日志<span style="color: #008000"><span style="color: #000000"><span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">false<span style="color: #000000">;<span style="color: #008000">//<span style="color: #008000">返回false<span style="color: #008000"><span style="color: #000000">}
}<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">UpdateNews(Newsnews)
{
<span style="color: #0000ff">try<span style="color: #000000">
{
newsRep.Save(news);
<span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">true<span style="color: #000000">;
}
<span style="color: #0000ff">catch<span style="color: #000000">(Exceptionex)
{
LogLogic.AddSystemLog(<span style="color: #0000ff">this<span style="color: #000000">,ex);
<span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">false<span style="color: #000000">;
}
}<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">DeleteNews(<span style="color: #0000ff">int<span style="color: #000000">newsID)
{
<span style="color: #0000ff">try<span style="color: #000000">
{
newsRep.Remove(newsID);
<span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">true<span style="color: #000000">;
}
<span style="color: #0000ff">catch<span style="color: #000000">(Exceptionex)
{
LogLogic.AddSystemLog(<span style="color: #0000ff">this<span style="color: #000000">,ex);
<span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">false<span style="color: #000000">;
}
}

一看上面的代码,其实都是实现调用一个数据访问层的方法,如果调用完成则返回成功,调用异常则返回失败。同样的逻辑,有必要重复的写这样的代码吗?虽然Ctrl+C和Ctrl+V的方式可以避免重复的手工输入重复的代码,但是从代码的艺术性来说,这样的代码明细不够优雅。此时我想到的第一个办法就是使用委托。但是数据访问层的方法传入的参数数目和类型又不相同,不能使用一个委托来实现。从一般的逻辑来说这里使用委托是必然的,但是一般的委托又不能适用于各自数据访问层的方法,这是就要使用.net2.0中的匿名函数来实现了。

首页我们定义一个所有Logic类的基类BaseLogic,在其中申明一个匿名函数的委托void TryMethod(),然后将公共的try catch部分提取出来形成方法TryIt。

<div style="border-right: #cccccc 1px solid; padding-right: 5px; padding-left: 4px; font-size: 13px; border-top: #cccccc 1px solid; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">
<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">class<span style="color: #000000">BaseLogic
{
<span style="color: #0000ff">protected<span style="color: #000000"><span style="color: #0000ff">delegate<span style="color: #000000"><span style="color: #0000ff">void<span style="color: #000000">TryMethod();
<span style="color: #0000ff">protected<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">TryIt(TryMethodtryMethod)
{
<span style="color: #0000ff">try<span style="color: #000000">
{
tryMethod();<span style="color: #008000">//<span style="color: #008000">调用委托中的匿名函数<span style="color: #008000"><span style="color: #000000"><span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">true<span style="color: #000000">;
}
<span style="color: #0000ff">catch<span style="color: #000000">(Exceptionex)
{
LogLogic.AddSystemLog(<span style="color: #0000ff">this<span style="color: #000000">,ex);
<span style="color: #0000ff">return<span style="color: #000000"><span style="color: #0000ff">false<span style="color: #000000">;
}
}
}

接下来就是改写前面的不够优雅的函数,改成使用匿名函数的方式:

<div style="border-right: #cccccc 1px solid; padding-right: 5px; padding-left: 4px; font-size: 13px; border-top: #cccccc 1px solid; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">
<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">class<span style="color: #000000">NewsLogic:BaseLogic,INewsLogic
{<span style="color: #008000">//<span style="color: #008000">…省略其他代码…<span style="color: #008000"><span style="color: #000000"><span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">AddNews(Newsnews)
{
<span style="color: #0000ff">return<span style="color: #000000">TryIt(<span style="color: #0000ff">delegate<span style="color: #000000">()<span style="color: #008000">//<span style="color: #008000">使用匿名函数,调用基类中的TryIt方法<span style="color: #008000"><span style="color: #000000">{
newsRep.Add(news);
}
);
}<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">UpdateNews(Newsnews)
{
<span style="color: #0000ff">return<span style="color: #000000">TryIt(<span style="color: #0000ff">delegate<span style="color: #000000">()
{
newsRep.Save(news);
}
);
}<span style="color: #0000ff">public<span style="color: #000000"><span style="color: #0000ff">bool<span style="color: #000000">DeleteNews(<span style="color: #0000ff">int<span style="color: #000000">newsID)
{
<span style="color: #0000ff">return<span style="color: #000000">TryIt(<span style="color: #0000ff">delegate<span style="color: #000000">()
{
newsRep.Remove(newsID);
}
);
}
}

对比一下现在的代码和前面的代码,明显感觉代码清爽了很多,匿名函数的使用使得代码更易修改和维护。

dawei

【声明】:淮南站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。