注入式开发(二):.NET 匿名函数
其实匿名函数就是个委托。只不过写起来更简洁。
为啥要用匿名函数呢?只是为了装逼吗?
诺诺诺
比如说,我们写代码,写着写着,发现有2个函数非常相像:
string methodA(string data)
{
相同代码1。。。
methodA特有部分
相同代码2。。。
}
string methodB(string data)
{
相同代码1。。。
methodB特有部分
相同代码2。。。
}
不行,要重构。如果没有匿名函数,我们应该怎么重构呢?
重构方式一,将相同部分分拆出一个个独立的方法
void same1(string data){...}
void same2(string data){...}
string methodA(string data)
{
same1(data);
methodA特有部分
same2(data);
}
string methodB(string data)
{
same1(data);
methodB特有部分
same2(data);
}
重构方式二,写一个共用方法,然后在该方法里分情况处理原先A和B的特有部分:
string same(string data,string methodtype)
{
相同代码1。。。
if(methodtype == "A")
methodA特有部分
else
methodB特有部分
相同代码2。。。
}
string methodA(string data)
{
return same(data,"A");
}
string methodB(string data)
{
return same(data,"B");
}
重构方式一,多了2个方法;重构方式二,多了一个方法,然后原先的方法还多了一个参数。
下面用匿名函数进行重构
delegate string dlgMethod(string data);
string same(string data,dlgMethod dlg)
{
相同代码1。。。
//委托dlg处理每个method的特有部分
dlg(data);
相同代码2。。。
}
string methodA(string data)
{
return same(data,(data) =>
{
methodA特有部分
});
}
string methodB(string data)
{
return same(data,(data) =>
{
methodB特有部分
});
}
这种方式,提炼出一个公用方法,然后原先的方法参数不变。更值得一提的是,特有部分在原先每个方法里自行定义,逻辑更加清晰。
我认为,匿名函数比较适合应用在 特殊部分 位于方法的中间位置这种情况,故而很难提炼出一个公用的方法,而不得不提炼出两个。匿名函数本质是一个委托,委托的作用就像一把尖刀插向敌人的胸膛:插进其他对象,插进其他方法。
因此,我将使用委托命名为:注入式开发。
注入式开发(二):.NET 匿名函数的更多相关文章
- python之内置函数(二)与匿名函数、递归函数初识
一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...
- JavaScript 闭包系列二(匿名函数及函数的闭包)
一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) { return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...
- python函数知识六 内置函数二、匿名函数与内置函数三(重要)
19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...
- python笔记十二(匿名函数)
一.匿名函数 有些情况下,我们需要把函数当做参数传入到另外的函数中,或者是把函数作为某个函数的返回值,此时我们就可以使用匿名函数. 匿名函数的标志是lambda. >>> f = ...
- Python内置函数二 (递归函数,匿名函数,二分法)
匿名函数 lambda() 语法: lambad 参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...
- day13 内置函数二 递归,匿名函数,二分法
.匿名函数(名字统一叫lambda) .语法 lambda 参数:返回值 .参数可以有多个,用逗号隔开 .只能写一行,执行结束后直接返回值 4返回值和正常函数一样,可以是任意值 .列: f=lambd ...
- 测开之路八十二:匿名函数:lambda表达式
# 匿名函数:lambda表达式# lambda 参数: 逻辑f = lambda name: print(name)f('tom') f2 = lambda x, y: x + yprint(f2( ...
- python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r
一.作用域 作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 二.匿名函数 lambda:正常和其他函数进行配合使用.正常无需把匿名函数赋值给一个变量. f=lambda x:x*x p ...
- JavaScript的匿名函数和模块化的使用方法
对于开发人员来说,很多时候我们都会涉及到JavaScript的使用,而在使用过程中,最令人沮丧的就是变量没有相应的使用范围. 在开发中,对于任何变量.数组.函数.对象等,只要不在函数的内部,都会被默认 ...
- Day3-递归函数、高阶函数、匿名函数
一.递归函数 定义:函数内部可以调用其它函数,如果调用自身,就叫递归. 递归特性: 1.必须有结束条件退出: >>> def calc(n): ... print(n) ... re ...
随机推荐
- (11) openssl req(生成请求证书、私钥和自建CA)
伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...
- Python_编程题集_003_递归算法解析
3.递归算法: 3)传入一个Json串,返回一个字典,字典只取出Json最底层的数据, 中间如果有字符串也要进行处理,请以下面的数据为例,请用递归方法实现 Json:{"a":&q ...
- running Fluent on Apocrita Cluster
two files: code.sh, code.jou code.sh #!/bin/bash #$ -cwd #$ -j y #$ -m bea #$ -M k.ai@qmul.ac.uk #$ ...
- Java 常用集合笔记
自增数组 ArrayList<Integer>G[]=new ArrayList[N] 详细笔记 相关题目 栈 Stack<Integer> stack=new Stack&l ...
- POJ 3621 Sightseeing Cows (最优比率环 01分数划分)
题意: 给定L个点, P条边的有向图, 每个点有一个价值, 但只在第一经过获得, 每条边有一个花费, 每次经过都要付出这个花费, 在图中找出一个环, 使得价值之和/花费之和 最大 分析: 这道题其实并 ...
- tiles框架的definition讲解
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE tiles-definitions PUBL ...
- "转成"
在java中这样转 StringEscapeUtils.unescapeHtml(soapResponseData); 在js中这样转 str.replace(""",& ...
- 病毒的侵扰和再侵扰两道AC自动机的应用
HDU2896 病毒的侵扰 http://vjudge.net/problem/viewProblem.action?id=16404 题目大意: 记录每个病毒的编号,并给出一些网站的源码,分别输出网 ...
- hdu1856 选出更多的孩子
题目大意: 老师选取2个学生对应的号码,这两人视作朋友,同时朋友的朋友也可以看成自己的朋友. 最后老师选出一个人数最多的朋友圈. 这里学生的人数不大于10^7,所以操作时需要极为注意,操作步数能省则省 ...
- 次最短路径 POJ 3255 Roadblocks
http://poj.org/problem?id=3255 这道题还是有点难度 要对最短路径的算法非常的了解 明晰 那么做适当的修改 就可以 关键之处 次短的路径: 设u 到 v的边权重为cost ...