如何代码复用?

panzi667 2016-11-17 10:51:16
下面三个方法,唯一不同的就是红色部分的调用方法,有没有什么办法可以进行提炼,让代码更加简洁,目前看啦比较臃肿

public SmsStatus SearchBalance()
{
SmsStatus entity_status = new SmsStatus();
if (string.IsNullOrEmpty(strSmsType))
{
return CreateErrorStatus("短信通道类型没有配置");
}
foreach (var _do in DoList.Where(item => item.Metadata.Depict == strSmsType))
{
entity_status = _do.Value.SearchBalance();
}
return entity_status;
}


public SmsStatus SearchKeyword(string strSms)
{
SmsStatus entity_status = new SmsStatus();
if (string.IsNullOrEmpty(strSmsType))
{
return CreateErrorStatus("短信通道类型没有配置");
}
foreach (var _do in DoList.Where(item => item.Metadata.Depict == strSmsType))
{
entity_status = _do.Value.SearchKeyword(strSms);
}
return entity_status;
}


public SmsStatus SearchSendResult(string strTaskID)
{
SmsStatus entity_status = new SmsStatus();
if (string.IsNullOrEmpty(strSmsType))
{
return CreateErrorStatus("短信通道类型没有配置");
}
foreach (var _do in DoList.Where(item => item.Metadata.Depict == strSmsType))
{
entity_status = _do.Value.SearchSendResult(strTaskID);
}
return entity_status;
}
...全文
616 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2016-11-21
  • 打赏
  • 举报
回复
使用委托,提取出来 public SmsStatus Search(Func<Do.Value的类型, SmsStatus> foo) { SmsStatus entity_status = new SmsStatus(); if (string.IsNullOrEmpty(strSmsType)) { return CreateErrorStatus("短信通道类型没有配置"); } foreach (var _do in DoList.Where(item => item.Metadata.Depict == strSmsType)) { entity_status = foo(_do.Value); } return entity_status; } 调用 Search(x => x.SearchKeyword(s));
panzi667 2016-11-21
  • 打赏
  • 举报
回复
学习,受教了~
  • 打赏
  • 举报
回复
引用 1 楼 panzi667 的回复:
方法调用的参数也有可能不一样
想看出什么“一样”,是需要学一点理论知识的。
  • 打赏
  • 举报
回复
其实如果有上面的基本意识之后,你就会意识到,你的代码中最滥的不是什么“红色部分的调用代码”,而是类似于 strSmsType、DoList 这种参数(属性)跟方法流程的关系的相对位置设计,它才是感觉“味道不好”的根源。但是你没有建立起来工程概念,所以找不到问题的出处。
  • 打赏
  • 举报
回复
代码复用之前,你首先要在脑袋里建立起软件工程方面的知识。如果只是说“唯一不同的就是红色部分的调用方法”这还是属于“无知但是有一点感触”的阶段。 做一个事情的流程,前提是围绕其业务对象(类)而设计数据结构。而设计业务数据结构的前提,是面向领域而进行系统分析。你如果无厘头地纠结什么“纯粹编程的伎俩”,那就很难理解真正的软件思路。 在你将死板的流程代码分析为面向对象(类)的立体的结构之后,那么如果只有流程中很少的部分的不同,这就是“继承、多态”。你在流程中不是写一堆的 switch...case....代码,而是可以使用“继承、多态”的思路来设计应用系统。此时你只要把握住父类的设计,就能理解整个系统的核心,而你的3个子类只是一般化、扩展。 但是回到一开头,就是,你要有一点“悟性”能够将死板、平淡、只能见树木不见森林的过程化思维方式,变为面向对象的思维方式。从3个过程中分析出3种具体的业务子类,从而抽象出共同的业务父类,找到领域模型中自然的表示。没有这个训练,就等于还是纠结在代码那个层面,还没有能够站在最重要的业务领域设计角度去开始重构。
panzi667 2016-11-19
  • 打赏
  • 举报
回复
学习一下 顶起来
正怒月神 2016-11-18
  • 打赏
  • 举报
回复
没什么必要合并。
xuzuning 2016-11-17
  • 打赏
  • 举报
回复
你这三个方法并成一个就可以了 不过变成一个后,含义就不那么贴切了
        public SmsStatus Search(string strParam="")
        {
            SmsStatus entity_status = new SmsStatus();
            if (string.IsNullOrEmpty(strSmsType))
            {
                return CreateErrorStatus("短信通道类型没有配置");
            }
            foreach (var _do in DoList.Where(item => item.Metadata.Depict == strSmsType))
            {
                entity_status = _do.Value.Search(strParam);
            }
            return entity_status;
        }
panzi667 2016-11-17
  • 打赏
  • 举报
回复
方法调用的参数也有可能不一样

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧