其实匿名函数就是个委托。只不过写起来更简洁。

为啥要用匿名函数呢?只是为了装逼吗?

诺诺诺

比如说,我们写代码,写着写着,发现有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 匿名函数的更多相关文章

  1. python之内置函数(二)与匿名函数、递归函数初识

    一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...

  2. JavaScript 闭包系列二(匿名函数及函数的闭包)

    一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {     return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...

  3. python函数知识六 内置函数二、匿名函数与内置函数三(重要)

    19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...

  4. python笔记十二(匿名函数)

    一.匿名函数 有些情况下,我们需要把函数当做参数传入到另外的函数中,或者是把函数作为某个函数的返回值,此时我们就可以使用匿名函数. 匿名函数的标志是lambda.   >>> f = ...

  5. Python内置函数二 (递归函数,匿名函数,二分法)

    匿名函数 lambda() 语法: lambad  参数 : 返回值 def func(a,b): return a * b print(func(2,5)) a = lambda a ,b : a* ...

  6. day13 内置函数二 递归,匿名函数,二分法

    .匿名函数(名字统一叫lambda) .语法 lambda 参数:返回值 .参数可以有多个,用逗号隔开 .只能写一行,执行结束后直接返回值 4返回值和正常函数一样,可以是任意值 .列: f=lambd ...

  7. 测开之路八十二:匿名函数:lambda表达式

    # 匿名函数:lambda表达式# lambda 参数: 逻辑f = lambda name: print(name)f('tom') f2 = lambda x, y: x + yprint(f2( ...

  8. python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r

    一.作用域 作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 二.匿名函数 lambda:正常和其他函数进行配合使用.正常无需把匿名函数赋值给一个变量. f=lambda x:x*x p ...

  9. JavaScript的匿名函数和模块化的使用方法

    对于开发人员来说,很多时候我们都会涉及到JavaScript的使用,而在使用过程中,最令人沮丧的就是变量没有相应的使用范围. 在开发中,对于任何变量.数组.函数.对象等,只要不在函数的内部,都会被默认 ...

  10. Day3-递归函数、高阶函数、匿名函数

    一.递归函数 定义:函数内部可以调用其它函数,如果调用自身,就叫递归. 递归特性: 1.必须有结束条件退出: >>> def calc(n): ... print(n) ... re ...

随机推荐

  1. 使用window.open打开新窗口被浏览器拦截的解决方案

    问题描述: 代码中直接使用window.open('//www.baidu.com', '_blank');会被浏览器窗口拦截 原因浏览器为了维护用户安全和体验,在JS中直接使用window.open ...

  2. CSS3---关于背景

    1.background-origin:设置元素背景图片的原始起始位置. background-origin : border-box | padding-box | content-box;    ...

  3. python基础知识10-描述器和装饰器

    课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...

  4. Django框架基础知识11-会话状态保持及表单

    浏览器存储cookie的方式不太安全,那有没有更好些的来存储登入状态的方式呢??? 状态保持----cookie和session: 状态保持: 1.http协议是无状态的:每次请求都是一次新的请求,不 ...

  5. Leetcode 222.完全二叉树的节点个数

    完全二叉树的节点个数 给出一个完全二叉树,求出该树的节点个数. 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最 ...

  6. Cow Exhibition (01背包)

    "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - Cows with G ...

  7. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  8. hdu 1824 2-sat问题(判断)

    /* 题意:u,v,w队长,队员,队长留下两个队员可以回家,两个队员留下,队长回家 2-sat问题,把两个队员看成一个整体就变成一个简单2-sat问题了 */ #include<stdio.h& ...

  9. vscode安装插件

    十分简单,知道名字叫啥后,直接搜索,安装,就完了,还可以查看自己已经安装了哪些插件. step1 如图.png step2 image.png step 3 去网上查找想要安装的插件的名字 step ...

  10. Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'

    Spring Security :HTTP Status 403-Invalid CSRF Token 'null' was found on the request parameter '_csrf ...