在面向对象的设计中,我们经常会谈到“重构”,而重构之中有个叫合并方法的,就是将多个方法干的事类似,或者说,方法体的长向很像,那么,我们需要去考虑,将它们进行抽象!

原来的代码:

        /// <summary>
/// 单数累加
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int AddOpreation(int a, int b)
{
int sum = ;
for (int i = (a < b ? a : b); i <= (a > b ? a : b); i++)
{
sum += i;
}
return sum;
}
/// <summary>
/// 乘方累加
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int AddInvolutionOpreation(int a, int b)
{
int sum = ;
for (int i = (a < b ? a : b); i <= (a > b ? a : b); i++)
{
sum += i * i;
}
return sum;
}

可以看到这两个方法的方法体基本相同 ,只是在累加时第一个是原数累加,第二个方法是原数的乘方作累加,对于上面的代码,我们可以进行再次抽象,将不相同

的代码逻辑提出来,我们知道.net 3.5有了Action和Func两个委托,事实上,这两个委托是微软为我们封装好的,原来就是因为它们常用,所以,人家直接给封装好了,这一点,是值得我们去学习的,有人说,微软的东西升级快,但我要说的是,它的升级不是语言本身的升级,而是为了让开发人员更方便的使用它,让开发人员

的代码写出来更可读,让代码的艺术性更强,这是我想说的。

下面是把变化的部分抽象之后的结果,看代码:

        /// <summary>
/// 按着某种方法进行累加
/// </summary>
/// <param name="func"></param>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
static int BothIntegerOpreation(Func<int, int> func, int a, int b)
{
int sum = ;
for (int i = (a < b ? a : b); i <= (a > b ? a : b); i++)
{
sum += func(i);
}
return sum;
}

而在调用的时间,我们将具体的实现逻辑以参数的形式传递进来,有人说,委托用不到,但我想说,那是你对委托还不够了解!

            Func<int, int> funcAdd = (a) => { return a; };//以变量的形式定义委托的实例逻辑
int res1 = BothIntegerOpreation(funcAdd, , );
int res2 = BothIntegerOpreation((a) => { return a * a; }, , );//直接在方法调用时写逻辑
Console.WriteLine(res1.ToString() + res2.ToString());

结果如下:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAAwCAIAAABVDSmEAAAEuElEQVR4nO3Z609TZxwH8L4VcQMEJ2XD3mSXIjAHqLRcXm3LFqO4MDeny5aMZCJyaVEK9HKqDBB0uDkvccs0TBYNmdmyZYlJm/hucjFZk/0Np6+sLZdzgbKzF8/pw3PO6eX00B4WeL75vTh9+pySfPrL0+c5aDgcVaL55+8nuFQoDK0WdI6pbZ21fW/b9r1nQOWWnckta88ta899tX0HX2d3vHb2BVCvd7wI643OPFDmzjxzZ765K9/clV/elV/eVVDeXbCvu2Bf905QFbadFbbCClthpa2w0l5YaS+qtBdV2YuqeoqqenZV9ex6E9S5l/bztXv/+d1v8VVcfb64uheUtqZXW+PQ1ji0tY6SWkdJbV9Jbd/LB2J1sP8VWIcGSkHVDZTWOfeAsjh1FqfO4tJZXDqrS2916a1ufb1bX+82gGrwGBo8xgaPsdFjbCSMjYSpkTA1EaYmL4ZWF9o7OCKz3mnpzzGdxtAKof+ano1b0zNzM3NPp2efPpmZAyPewZEcQyuGVghNsSsyyzs4sm1DocFuSQQNBkXQYFAxNLg9w9DRaNTnD7S4p45fePDx8P1Prkx+em0iSJIsQ8Oytt1lGTouNLphBNDgGkKjE9YDzSsLOxoMijoaDIKOlu5qU0LzyocGSusGpLfrLC7poKHejb6E0Pw+GmCtRqM+f6Dj+h/dt3+33/n13L2HjgdTMqHBB8np6I2CLq7u5TiOYVe0Nb2KoffUOaEyhNZb3VAZdHRMWdDRa9Dzi5TPH/BMPjoy8v17o98evjrefGMMQDMMzdAUy9DNN8dUgwYzMwsNgy4dYCQ5NFw6UGi4dKQHvbBI+fyBd4e+e//KN0eufX3s1mjLj0NBkmQYBnb06T87pNCcMAAavpQDDSen7GgwTfRjGFMW/BhC5ZTQcTt6TRmBjikL1mgwiK7RqaCXaJ8/cHj86tHrlz+4fen43cETk0SQJJdZBl095He0TGgwkmfmL7IKzbAr/xfo5ptjLT8MfzRx8eTP7s+m+oIkydKUCtBrTZ0YGiqj0IjyGjSqLF2jU+46wO2i7R0YFO06oHLa0B/e+erEPe+p+87Pf3F88VtPkCRnY2FoOhIJh5+HstTRKX8MMwXNN7VS6FhfC6DBhRQaXAuglyhm4qeHPn8ALRR6aXExFAqFnj1La43mOE66veO5JWs0h3Q0eJkpaOlfT/JjKIWW3i5neycKD/18nuZWWY5bjrJL3CrDcasct/zvCsXQFE1RCwvz4Ug4EgkvzEc25MASUxacDHll4cmQV1Z6MuSVs3cy7HddjPtkY+jS5eHR8QvIyNvHbPgIvo6nd8Yvtxla5VSOoRU/VMKPSTE0ht7w//FskdIQOKpEQxBEE072w0NrcLIdDK1SMLRKwdAqBYV+HIv825NMTvejNnkgtAKXJLco+M42eQC0gkZOQpn83S0aZdAgce+CgxhaEBQ63TaUTkZHMLQg0o6WD5QIWtnXtsmTWWj57265yIFO1JsYOo2ItndJQNHxlOsDXjrESXkyxFiZCT6CqxQMrVIwtErB0CoFQ6sUDK1S4j7rkLOlwzvl9BL3ebR8PgwtN4ke/GPoDCdRR8MJyZcI6Xii+Vt8qfkPlFIXv4Pf0mcAAAAASUVORK5CYII=" alt="" />

测试中的代码分享~将可以合并的方法去合并Func不赖的更多相关文章

  1. 针对MSHFlexGrid的一系列通用方法-项目中实践代码分享

    1.给MSHFlexGrid填充数据通用方法 '自定义报表填充程序 fgrid Public Function ShowformfData(Resultset As ADODB.Recordset, ...

  2. 新书《编写可测试的JavaScript代码 》出版,感谢支持

    本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代 ...

  3. 使用强大的 Mockito 测试框架来测试你的代码

    原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...

  4. Web测试中常见分享问题

         Web测试中,由于开发通常指注重完成H5页面的逻辑功能,对各种系统.浏览器等考虑不周,同时Android端各类机型碎片化,容易产生兼容性问题,这其中以分享类型为最. 本文简单分析总结一些测试 ...

  5. Java 中静态代码块初始化问题测试

    Java 中静态代码块初始化问题测试 原创 情况一:变量是 static final 修饰的"编译期常量",如 public static final String a = &qu ...

  6. XGBoost中参数调整的完整指南(包含Python中的代码)

    (搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日     介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...

  7. MVC常遇见的几个场景代码分享

    本次主要分享几个场景的处理代码,有更好处理方式多多交流,相互促进进步:代码由来主要是这几天使用前端Ace框架做后台管理系统,这Ace是H5框架里面的控件效果挺多的,做兼容也很好,有点遗憾是控件效果基本 ...

  8. 抓取oschina上面的代码分享python块区下的 标题和对应URL

    # -*- coding=utf-8 -*- import requests,re from lxml import etree import sys reload(sys) sys.setdefau ...

  9. Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享

    Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...

随机推荐

  1. 闲来瞎扯 -- 在vs2008下编写linux程序

    虽说vim很强大,但是个人感觉器代码提示功能不如visual assist来的强大.如何使用visual assist来实现代码的提示功能呢? 首先说明我的环境 : 宿主机是xp(O(∩_∩)O~还是 ...

  2. 关于k-means聚类算法的matlab实现

    在数据挖掘中聚类和分类的原理被广泛的应用. 聚类即无监督的学习. 分类即有监督的学习. 通俗一点的讲就是:聚类之前是未知样本的分类.而是根据样本本身的相似性进行划分为相似的类簇.而分类 是已知样本分类 ...

  3. la 3942 Rember_前缀树

    #include <iostream> #include<cstdio> #include<cstring> using namespace std; #defin ...

  4. virtualbox 复制多个虚拟机 (宿主机redhat)

    我用VirtualBox做了一个winxp虚拟镜像. 想实现不重新安装而直接复制几个,也就是同时装载几个虚拟机. 但是直接复制已安装好机子的vdi文件,系统会报uuid已存在的错误. 所以,就需要修改 ...

  5. php float 转int

    round(x,prec) 参数 描述 x 可选.规定要舍入的数字. prec 可选.规定小数点后的位数. <?php echo(round(0.60)); echo(round(0.50)); ...

  6. Jenkins的安全控制

    在默认配置下,Jenkins是没有安全检查的.任何人都可以以匿名用户身份进入Jenkins,设置Jenkins和Job,执行build操作.但是,Jenkins在大多数应用中,尤其是暴露在互联网的应用 ...

  7. Activity(三)

    常用控件 EditView.TextView.Button 设置layout,在fragment_main.xml配置控件 配置可编辑文本控件factorOne.factorTwo,显示文本控件sym ...

  8. C#整理7——函数

    数据类型--变量常量--运算符表达式--语句(顺序,分支,循环)--数组--函数 函数 1.定义:能够独立完成某个功能的模块.2.好处:1.结构更清析(编写.维护方便 ).2.代码重用.3.分工开发. ...

  9. 数据库基础(变量、运算符、if语句、while语句)

    数据库基础(变量.运算符.if语句.while语句)   变量: 定义变量:declare @变量名 数据类型 变量赋值:set @变量名 = 值 输出:print 变量或字符串 SQL语言也跟其他编 ...

  10. adb server didn t ack failed to start daemon

    关掉Ecilpse,打开cmd命令行 1)cd到sdk的platform-tools目录下, 2)执行  adb kill-server  ,出现  server not runing 提示 3)执行 ...