【晒出你的第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

相关文章
|
5月前
|
存储 Linux 应用服务中间件
非985、211,C/C++校招学到啥程度才能进鹅厂、阿里、百度等大厂
非985、211,C/C++校招学到啥程度才能进鹅厂、阿里、百度等大厂
|
10月前
|
存储 安全 前端开发
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案(下)
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
477 0
|
10月前
|
存储 SQL 设计模式
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
C++面试题,阿里、百度、腾讯、华为、小米100道C++面试题目及答案
518 0
|
存储 缓存 Java
【阿里面试】C++多态和虚函数
2.1 现在假设有一个编译好的C++程序,编译没有错误,但是运行时报错,报错如下:你正在调用一个纯虚函数(Pure virtual function call error),请问导致这个错误的原因可能是什么?
269 0
【阿里面试】C++多态和虚函数
|
安全 Java C++
消灭“脑细胞杀手”,阿里专家带你深入C++对象的生命周期管理
C/C++的指针一直是令人又爱又恨的特性。围绕指针产生了许许多多优雅的数据结构和系统实现,但又滋生了不少“脑细胞杀手”——内存Bug。如何通过指针管理C++中对象,如何管理对象的生命周期呢?本文中,阿里巴巴高级开发工程师付哲就为大家分享《C++对象的生命周期管理》。
5537 0
|
C++ 编译器 C#
绕开“陷阱“,阿里专家带你深入理解C++对象模型的特殊之处
本文介绍了C++对象模型的特殊之处,包括与C兼容的朴素模型,以及能支持多态的虚表模型,同时还带大家了解了构造函数与析构函数相关的一些特性与陷阱。这些内容能够帮助大家更好地学习和使用C++。
3149 0
|
C++
4月18日云栖精选夜读:消灭“脑细胞杀手”,阿里专家带你深入C++对象的生命周期管理
 C/C++的指针一直是令人又爱又恨的特性。围绕指针产生了许许多多优雅的数据结构和系统实现,但又滋生了不少“脑细胞杀手”——内存Bug。如何通过指针管理C++中对象,如何管理对象的生命周期呢?本文中,阿里巴巴高级开发工程师付哲就为大家分享《C++对象的生命周期管理》。
3376 0
|
算法 Java 数据库连接
学生党成功拿到阿里技术offer:面Java开发,却是C++考官,几个意思?
这是我为大家分享的如何拿到阿里技术offer系列文章中的第一篇,今天分享的文章的作者是一位在2015年阿里的校招中成功得到offer的美女学姐,从学姐的这篇文章中我们能学到很多在阿里面试的宝贵的经验和技巧。接下来,让我们一起分享吧
41103 0
|
21天前
|
存储 C++ 容器
C++入门指南:string类文档详细解析(非常经典,建议收藏)
C++入门指南:string类文档详细解析(非常经典,建议收藏)
31 0
|
21天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
30 0