加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用匿名函数减少重复代码

发布时间:2020-12-15 21:14:33 所属栏目:asp.Net 来源:网络整理
导读:在一个项目中我使用到了软件工厂的工具帮助生成了对数据库的CRUD的方法,在Logic中需要对数据层进行封装,以提供对实体操作的接口,封装后的代码如: div style="border-right: #cccccc 1px solid; padding-right: 5px; padding-left: 4px; font-size: 13px;

在一个项目中我使用到了软件工厂的工具帮助生成了对数据库的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(News?news)
{
????<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">?(Exception?ex)
????{
????????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(News?news)
{
????<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">?(Exception?ex)
????{
????????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">?(Exception?ex)
????{
????????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(TryMethod?tryMethod)
????????{
????????????<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">?(Exception?ex)
????????????{
????????????????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(News?news)
{
????<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(News?news)
{
????<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);
?????????????????????}
????????);
}?
}?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读