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

原来的代码:

        /// <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. 如何不让oracle使用linux的swap分区

    经常看到swap分区被使用,被缓存的内容本来是为了增加命中率,结果去不断换入换出,导致本地磁盘IO增加,影响访问速度.所以在内存充足的情况下,如果我们觉得不需要使用swap分区的时候,那就要想办法尽量 ...

  2. vs2010中看不见类视图和资源视图的解决方法

    vs2010工程中,因为删除了“vcxproj.filter”文件,所以导致资源视图看不见了. 解决方法是:先关掉工程,将工程对应的扩展名为.suo和.sdf删除,重新打开解决方案,问题解决.

  3. ASP.NET 委托,异步调用例子 .

    简要介绍:1.定义异步执行需要调用的方法2.定义具有与异步执行方法相同签名的委托(Delegate):3.调用 BeginInvoke 和 EndInvoke 方法.   3.1. BeginInvo ...

  4. autolisp 列表 resbuf

    有以下 list : (1 2 3 (4 5 6) "Properties" (("id" . 3) ("name" . "hel ...

  5. 【STL】算法 — partial_sort

    partial_sort接受一个middle迭代器,使序列中的middle-first个最小元素以递增顺序排序.置于[first, middle)内.以下是測试代码: #include <ios ...

  6. 什么是 CSS 预处理器?

    什么是 CSS 预处理器?  就CSS本身而言,对于大多数Web前端从业人员来说就不是问题.学过CSS的人都知道,它不是一种编程语言.你可以用它开发网页样式,但是没法用它编程.换句话说,CSS基本上是 ...

  7. UVA 1617 Laptop

    题意: 有n条长度为1的线段,确定他们的起点,必须是整数,使得第i条线段在[ri,di]之间.最后输出空隙的最小值 分析: 原始数据排序,排序的规则是先按照右端点排序,右端点相同的情况下,再按照左端点 ...

  8. MapReduce编程小结

    (1)key-value到map端比较容易,每个分片都会交由一个MapTask,而每个分片由InputFormat(一般是FileInputFormat)决定(一般是64M),  每个MapTask会 ...

  9. HDU 3030 - Increasing Speed Limits

    Problem Description You were driving along a highway when you got caught by the road police for spee ...

  10. 算法竞赛中G++编译器的编译指令简单说明

    算法竞赛使用的在线判题平台在FAQ会给出提交的代码是通过什么指令进行编译的.比如hustoj给出的c++编译指令通常是: C++: g++ Main.cc -o Main -fno-asm -O2 - ...