测试中的代码分享~将可以合并的方法去合并Func不赖
在面向对象的设计中,我们经常会谈到“重构”,而重构之中有个叫合并方法的,就是将多个方法干的事类似,或者说,方法体的长向很像,那么,我们需要去考虑,将它们进行抽象!
原来的代码:
/// <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不赖的更多相关文章
- 针对MSHFlexGrid的一系列通用方法-项目中实践代码分享
1.给MSHFlexGrid填充数据通用方法 '自定义报表填充程序 fgrid Public Function ShowformfData(Resultset As ADODB.Recordset, ...
- 新书《编写可测试的JavaScript代码 》出版,感谢支持
本书介绍 JavaScript专业开发人员必须具备的一个技能是能够编写可测试的代码.不管是创建新应用程序,还是重写遗留代码,本书都将向你展示如何为客户端和服务器编写和维护可测试的JavaScript代 ...
- 使用强大的 Mockito 测试框架来测试你的代码
原文链接 : Unit tests with Mockito - Tutorial 译文出自 : 掘金翻译计划 译者 : edvardhua 校对者: hackerkevin, futureshine ...
- Web测试中常见分享问题
Web测试中,由于开发通常指注重完成H5页面的逻辑功能,对各种系统.浏览器等考虑不周,同时Android端各类机型碎片化,容易产生兼容性问题,这其中以分享类型为最. 本文简单分析总结一些测试 ...
- Java 中静态代码块初始化问题测试
Java 中静态代码块初始化问题测试 原创 情况一:变量是 static final 修饰的"编译期常量",如 public static final String a = &qu ...
- XGBoost中参数调整的完整指南(包含Python中的代码)
(搬运)XGBoost中参数调整的完整指南(包含Python中的代码) AARSHAY JAIN, 2016年3月1日 介绍 如果事情不适合预测建模,请使用XGboost.XGBoost算法已 ...
- MVC常遇见的几个场景代码分享
本次主要分享几个场景的处理代码,有更好处理方式多多交流,相互促进进步:代码由来主要是这几天使用前端Ace框架做后台管理系统,这Ace是H5框架里面的控件效果挺多的,做兼容也很好,有点遗憾是控件效果基本 ...
- 抓取oschina上面的代码分享python块区下的 标题和对应URL
# -*- coding=utf-8 -*- import requests,re from lxml import etree import sys reload(sys) sys.setdefau ...
- Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案及开发中的点滴分享 在此,先分享下写此文前的经历与感受,我所有的感觉浓缩到一个字,那就是:"坑&qu ...
随机推荐
- GO的GDB调试
GoLang语言,学了很久,一直觉得它单步调试有较多问题,最近才知道自已对它了解得太少了.原来GO语言对GDB的版本是至少为gdb7以上,才能比较好的打印任意变量,如果低于这个版本,则才会出一些问题. ...
- thinkphp这样玩关联查询(实例教会你)
thinkphp实例,内连接实现多表中同时查找,并存在了一个数组中,返回到模板中,模板中volist遍历即可使用多表中的字段 $row=M()->query("select realn ...
- 【转】关于Activity和Task的设计思路和方法
Activity和Task是Android Application Framework架构中最基础的应用,开发者必须清楚它们的用法和一些开发技巧.本文用大量的篇幅并通过引用实例的方式一步步深入全面讲解 ...
- OC基础15:内存管理和自动引用计数
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...
- SHUTDOWN: Active processes prevent shutdown operation
在使用shutdown immediate关闭数据库时hang住,查看alert 日志,遭遇了SHUTDOWN: Active processes prevent shutdown operation ...
- 6T GPT 移动硬盘在linux下的挂载
实验室拿来了一个6T的移动硬盘,拿到后没有分区就直接用了,在Windows上用的好好的,插到上Linux后起初不会挂载,折腾了一会,成功挂载,很简单. 运行fdisk –l后,显示如下: 很明显,sd ...
- SVG-1
<rect>矩形 <circle>圆 <ellipse>椭圆 <line>直线 <polyline>折线 <polygon>标签 ...
- js、jquery、css使用过程中学到的一些方法技巧
快速查看 1 动态创建script/link/style标签 2 在不适合使用iframe的情况下,让页面像iframe那样能分块滚动 3 鼠标在元素上时显示tip风格的提示信息 1.动态创建scr ...
- 蜗牛爱课 -- iOS 设置UIButton的字体的大小、显示位置、大小
/设置按钮上的自体的大小 //[btn setFont: [UIFont systemFontSize: 14.0]]; //这种可以用来设置字体的大小,但是可能会在将来的SDK版本中去除改方法 ...
- hdu1867A + B for you again
Problem Description Generally speaking, there are a lot of problems about strings processing. Now yo ...