【晒出你的第83行代码】阿里研究员福贝,用一个小演示程序来解释一下 C++11/14 里的 closure 是可以多么的“爽”

简介: 在五四青年节之际,社区发起了来晒晒属于你的“第83行”的活动,活动中邀请业界的大牛、大神们来晒代码或者Review代码!第一波邀请的大神就是阿里研究员福贝。

最近社区有个很火的《向代码致敬,寻找你的第83行》的活动,缘起于前几天,在阿里巴巴的一个小黑屋里,5名对代码有着极致追求的程序员参与了阿里代码领域最高荣誉“多隆奖”最终角逐(多隆作为淘宝的第一代程序员,也是很多技术人心中的大神)。那天代码评审现场,看到某代码片段最后结尾,多隆突然补上一句,往上翻看下第83行。代码一般都是几百行,他看到最后,居然还记得第83行的一个细微瑕疵,这得是对代码怀着怎样的敬畏之心。

于是,在五四青年节之际,社区发起了来晒晒属于你的“第83行”的活动,活动中邀请业界的大牛、大神们来晒代码或者Review代码!第一波邀请的大神就是阿里研究员福贝。

@技术福贝 晒出了如下代码:

我用一个小演示程序来解释一下 C++11/14 里的 closure 是可以多么的“爽” :-)

header

cpp

范例里面,我们要写的 DoSomething() 需要做两件事情,Calculate() 算出一个矩形的四个顶点,然后 DrawRect() 去画它。这样的情况在实际代码中很常见,一个函数因为复杂,要分几步去做,最好分成几个子函数。但是问题是需要传递好几个参数,头痛了!第一种写法,无奈之下只能把所有参数一一列出,然后 header 里就多了个 Calculate(......) 长长的子函数,需要传进传出多个变量。

有了 closure 就好办多了!我们可以在 DoSomething() 里直接定义 Calculate(), 用 [&] 把所有 variables on the stack 传进去。整个写法简洁很多,也易于维护,一方面参数的增删不再需要更多的工作,另一方面,更为重要的是,Calculate() 已经完全定义在 DoSomething() 里面了,从结构上直接告诉读者它们的从属关系!(NOTE: 当然也可以用一个 inner function 来写,可是参数传递不够爽)

现在,连 header 都显得如此整洁,只有 DoSomething() 这一个函数了。向代码致敬!

各位快来围观:https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.4.393518a8tcY4xr&order=score#answer-146875 

其他社区网友这样晒码,大家快来围观点评吧

1、@故事老神仙-接触建站开始一直玩到了现在的一个网站代码的第83行,是一行普通的代码,没有特别的地方,但不由让自己想起了当初的那份热爱,那份期待,那是初接触代码的小惊喜小激动。
https://yq.aliyun.com/roundtable/67516#answer-146773

2、@黄一刀-我的83行代码是注释
https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.115.438a18a844ewV0&order=score&type=&p=1#answer-146842

3、@微wx笑-十二年前写过一个流量统计,最近想把它改一改再用起来,随便打开一个类,没有任何注释,你们看得懂不?
https://yq.aliyun.com/roundtable/67516#answer-146527

4、@海洋的云-感觉确切来说应该是第83段,自从用了Jupyter Notebook,“代码行”就全部变成“代码段”了,/(ㄒoㄒ)/~~
https://yq.aliyun.com/roundtable/67516#answer-146546

5、@浮生递归-什么?居然暴露了自己的CSS命名不规范!不行,我得再贴段来证明下,有时候还是规范的~比如483行附近代码!
https://yq.aliyun.com/roundtable/67516#answer-146557

6、@gfriend_24-最初的代码片段(入门Android开发时的BMI计算程序代码)
https://yq.aliyun.com/roundtable/67516#answer-146498

7、@三忌-这是我12年写的代码……
https://yq.aliyun.com/roundtable/67516#answer-146590

8、@海阔天空yy-以下是我写的一个,用来测试redis集群的测试程序 https://yq.aliyun.com/roundtable/67516#answer-146532

9、@尼古拉斯雷-看了那个阿里巴巴的那个开发手册,然后就知道如何去优化这些代码,如何去规范的定义变量名之类的 
https://yq.aliyun.com/roundtable/67516#answer-146477

10、@黄道长-直接上代码
https://yq.aliyun.com/roundtable/67516/?spm=a2c4e.11154000.rtdmain.115.438a18a844ewV0&order=score&type=&p=1#answer-146845 



想知道“寻找你的83行”最终的大奖“多隆奖”会花落谁家吗?5月29日第二届研发效能嘉年华将直播颁奖典礼!饿了么CTO、飞猪未来酒店CTO也将在嘉年华分享技术心路,全天候技术盛典等你来看!点击此处免费报名

f2d4407ccd8dceb093925bf5d0046666146b832f

相关文章
|
25天前
|
存储 网络协议 Ubuntu
【C++网络编程】Socket基础:网络通讯程序入门级教程
【C++网络编程】Socket基础:网络通讯程序入门级教程
52 7
|
2月前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
129 0
|
2月前
|
编译器 Linux C++
3C++程序的编写和实现
3C++程序的编写和实现
21 2
|
2月前
|
C++ 开发者
2C++的程序的构成和书写形式
2C++的程序的构成和书写形式
16 2
|
1月前
|
C++ 计算机视觉 Windows
【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
【C++】由于找不到xxx.dll,无法继续执行代码,重新安装程序可能会解决此问题。(解决办法)
|
8天前
|
运维 Serverless Go
Serverless 应用引擎产品使用之在阿里云函数计算中c++模板,将编译好的C++程序放进去部署如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
10 1
|
13天前
|
安全 编译器 C++
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
|
13天前
|
存储 IDE 编译器
C++从入门到精通:1.3.1了解IDE与C++程序的编写、编译和运行
C++从入门到精通:1.3.1了解IDE与C++程序的编写、编译和运行
|
13天前
|
存储 程序员 数据库
C++从入门到精通:1.2.2简单程序与接收用户输入
C++从入门到精通:1.2.2简单程序与接收用户输入
|
13天前
|
存储 编译器 C++
C++从入门到精通:1.2.1简单程序编写与基本操作
C++从入门到精通:1.2.1简单程序编写与基本操作