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

简介:

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

 

public    bool  AddNews(News news)
{
    
try
    {
        newsRep.Add(news);
// 执行数据库操作
         return   true ;
    }
    
catch  (Exception ex)
    {
        LogLogic.AddSystemLog(
this , ex); // 记录异常日志
         return   false ; // 返回false
    }
}
public    bool  UpdateNews(News news)
{
    
try
    {
        newsRep.Save(news);
        
return   true ;
    }
    
catch  (Exception ex)
    {
        LogLogic.AddSystemLog(
this , ex);
        
return   false ;
    }
}
public    bool  DeleteNews( int  newsID)
{
    
try
    {
        newsRep.Remove(newsID);
        
return   true ;
    }
    
catch  (Exception ex)
    {
        LogLogic.AddSystemLog(
this , ex);
        
return   false ;
    }

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

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

 

public   class  BaseLogic

{
        
protected   delegate   void  TryMethod();
        
protected   bool  TryIt(TryMethod tryMethod)
        {
            
try
            {
                tryMethod();
// 调用委托中的匿名函数
                 return   true ;
            }
            
catch  (Exception ex)
            {
                LogLogic.AddSystemLog(
this , ex);
                
return   false ;
            }
        }

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

 

public   class  NewsLogic:BaseLogic, INewsLogic
{

// …省略其他代码…

public    bool  AddNews(News news)
{
    
return  TryIt( delegate () // 使用匿名函数,调用基类中的TryIt方法
                     {
                         newsRep.Add(news);
                     }
        );
}
public    bool  UpdateNews(News news)
{
    
return  TryIt( delegate ()
                     {
                         newsRep.Save(news);
                     }
        );
}
public    bool  DeleteNews( int  newsID)
{
    
return  TryIt( delegate ()
                     {
                         newsRep.Remove(newsID);
                     }
        );


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

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2008/04/08/1141229.html,如需转载请自行联系原作者

相关文章
|
10月前
|
Ubuntu 计算机视觉 C++
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
259 30
|
传感器 存储 编解码
基于STM32的智能手环wifi连接手机APP(上)
基于STM32的智能手环wifi连接手机APP(上)
547 0
|
SQL 运维 关系型数据库
MySQL数据库运维第一篇(日志与主从复制)
MySQL数据库运维第一篇(日志与主从复制)
|
存储 数据处理 数据中心
1U和2U服务器应如何正确选择?各有什么优缺点?
标准机架式服务器以U为高度单位,1U和2U服务器各有优缺点。1U服务器体积小、性价比高,但扩展性和散热性较差;2U服务器扩展性好、散热佳、稳定性强,但托管费用较高。不同高度的服务器适用于不同的业务场景,选择时需根据具体需求决定。未来数据中心将根据业务特性选择合适的服务器类型,而非统一采用2U服务器。
353 2
|
人工智能 API 持续交付
通义万相AI绘画创作解决方案评测
在阿里云平台上,资源部署体验流畅,提供详尽步骤,包括开通服务、获取API-KEY、创建网络资源和服务器。一键部署借助ROS脚本,简化了程序安装,API设计直观,适合快速集成。用户可自定义登录凭据,部署过程自动化,大约5分钟后即可通过URL访问。服务响应快,模型泛化能力强,支持多种图片风格,图片质量高。建议增加更多风格滤镜、多语言支持和动态图像生成等新功能。成本效益高,易用性强,适合广泛行业,文档丰富,适合新手。
326 4
|
监控 Shell 测试技术
一篇文章讲明白MonkeyAPP压力稳定性测试
一篇文章讲明白MonkeyAPP压力稳定性测试
1070 1
|
程序员 开发者
如何通过F12开发者工具保存网页中想要的视频资源
如何通过F12开发者工具保存网页中想要的视频资源
15167 1
如何通过F12开发者工具保存网页中想要的视频资源
|
网络协议 测试技术 数据安全/隐私保护
ensp中高级acl (控制列表) 原理和配置命令 (详解)
ensp中高级acl (控制列表) 原理和配置命令 (详解)
1515 0
|
数据挖掘
Genshinpalette | 一款为原X准备的配色包
Genshinpalette | 一款为原X准备的配色包
363 0
|
小程序
微信小程序项目实例——双人五子棋
微信小程序项目实例——双人五子棋