代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6349 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞

范学雷 2019-01-11
我们在上一讲中讨论了一个优秀的程序员都需要具备哪些良好的品质,第一点就是要熟练掌握一门编程语言。
作为每天都要和代码打交道的人,光是熟练掌握还不够。我们需要像文字写作者一样,对代码有一种“洁癖”,那就是强调代码的规范化。

什么是编码规范?

要回答为什么需要编码规范,我们首先要了解编码规范指的是什么。
编码规范指的是针对特定编程语言约定的一系列规则,通常包括文件组织、缩进、注释、声明、语句、空格、命名约定、编程实践、编程原则和最佳实践等。
一般而言,一份高质量的编码规范,是严格的、清晰的、简单的,也是权威的。但是我们有时候并不想从内心信服,更别提自觉遵守了。你可能想问,遵循这样的约定到底有什么用呢?
编码规范可以帮我们选择编码风格、确定编码方法,以便更好地进行编码实践。 简单地说,一旦学会了编码规范,并且严格地遵守它们,可以让我们的工作更简单,更轻松,少犯错误
这个问题弄明白了,我们就能愉快地遵守这些约定,改进我们的编程方式了。

规范的代码,可以降低代码出错的几率

复杂是代码质量的敌人。 越复杂的代码,越容易出现问题,并且由于复杂性,我们很难发现这些隐藏的问题。
我们在前面已经讨论过苹果公司的安全漏洞(GoToFail 漏洞),接下来再来看看这个 bug 的伪代码。这个代码很简单,就是两个 if 条件语句,如果判断没问题,就执行相关的操作。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(21)

  • Carlos 置顶
    我感觉我就是一个有代码洁癖的人,写代码时有自己的原则和规范方法,其中做到易读和结构简洁是首要原则,这里面像命名,缩进,空行这种静态规则,有IDE的帮助还算比较容易做到。对于不少人来说比较难做到的可能是代码逻辑的组织。前几天刚看了个同事写的代码,关于视频课程管理的,表结构设计也是他做的。业务上要求课程需要属于某个等级,等级属于类别,类别属于厂商,为了做到同一个课程向不同客户展示不同的价格,又设计了个课程价格关系模型。这几个子项都有对应的业务模型和业务接口类。问题来了,添加课程时,在课程的某一个controller方法里,分别通过getparameter获取参数,构造数据对象,然后调用业务逻辑接口执行插入,最终完成多个业务模型的操作,有的是一对多再来个循环。一个方法里干这么多事情,我都接受了,居然把获取参数和给对象赋值无规律的穿插进行,偶尔还穿插来个参数校验,并且还在方法内部把获取过来的参数加个中文注释。删除课程数据时,需要把关联子模型数据也删除掉,他把各个子模型的删除方法都写到课程的service里。另外还存在A引用B,B又引用A,同时A又被其他好几个地方引用,不同引用之间通过不同参数走不同分支,并且有些参数在哪个场景下传过来的,他自己也弄不清了。带来这样问题就是写代码前,没把逻辑脉络梳理清楚,完全跟着感觉走,就一个简单的增删改查能写成这样,真怀疑要是把一个后端数据服务的代码给他写不知道能给写成啥样。

    作者回复: 如果逻辑没有理清楚,就开始写代码,就有可能后面越改越乱。

    我想起来前面有人说的小黄鸭的办法,把代码逻辑讲给小黄鸭听。能讲出来,逻辑就被梳理了一遍。

    我在评审代码的时候,如果看到太复杂的代码,我就问作者问题,问为什么这样,问什么不那样做。几个问题下来,代码就会顺利些。

    2019-01-11
    2
  • 👽
    读烂代码就想抽人。
    类似于new一堆对象。然后在几十行以后才使用 如果命名规范还好,如若不规范就要点回去看。
    还有这样奇怪的代码,写了个循环便利集合,但是循环中只有
    if(list.get(0)!=null){
    return list.get(0);

    每次读这样的代码。全都要研究一下这个循环是干啥的。
    还有这样的,解决异常。try包了一大串代码,找哪一行抛的异常很费劲。
    还有实体类型字段,String state=“1”;
    然后后面备注。1代表啥,2代表啥,3代表啥。
    不老老实实写个枚举或者常量嘛?
    还有代码里的无端空行。写一行,空一行......一个半屏幕滚动能看完的代码,硬是看了两个半屏幕。
    关键是还没法去说,毕竟同事之间。只是默默祈祷,不要让自己维护他的代码就好。

    作者回复: 😂我看这个留言,满是欢乐啊。

    为什么没办法说呢? 一般这种问题,说了就是帮助他提高啊。 当然,我也理解有些公司文化不开放。

    我替你想两个办法,一个是琢磨琢磨怎么说他会愉快滴接受,并且感谢你。或者,琢磨琢磨怎么搞个规范,让流程帮助他。 他变好了,你也工作轻松,心情愉快,对吧? 多赢! 这种事情,也能给你带来成就感,不信你就试一试😄。

    2019-01-11
    6
  • richey
    范老师,阿里的代码规约检查插件已经有了,还挺好用的

    作者回复: 谢谢你! 我要记得下次把这个修订了。

    2019-01-11
    5
  • 极客不落🐒
    阿里巴巴 java 开发规范,官方已提供了 idea、eclipse 插件,详情可以访问官方链接:https://github.com/alibaba/p3c/blob/master/README.md

    此外还有FindBugs、PMDPlugin、CheckStyle
    、JavaNCSS、sonarlint,可以多管齐下,为你保驾护航。

    作者回复: 谢谢提供这么多资源🙏

    2019-01-13
    4
  • cocoa
    1.属性明确加上private
    2.泛型赋值的时候自动判断类型,不用显示加
    3.if的第一个或条件不需要
    4.if使用大括号
    5.map一般用来转换,这块用迭代foreach就行了
    6.不用使用顺序迭代,本来集合list就有顺序
    7.toSring显示标明override

    作者回复: > 1.属性明确加上private
    如果是个公开类,需要使用private修饰符。 如果是内部类,使用缺省的修饰符也可以。

    > 2.泛型赋值的时候自动判断类型,不用显示加
    是的。

    > 3.if的第一个或条件不需要
    如果把缺省的无参构造函数补上,这个条件就明显地不需要了。

    > 4.if使用大括号
    对的。

    > 5.map一般用来转换,这块用迭代foreach就行了
    > 6.不用使用顺序迭代,本来集合list就有顺序
    是的,foreach足以。

    > 7.toSring显示标明override
    是的,这是一个违反规范的地方。

    2019-01-11
    3
  • 槛外人
    希望能多点最佳实践,最近几期好像有点重复了

    作者回复: 好的,以后多考虑加点实践。

    2019-01-14
    2
  • Linuxer
    看自己的代码不顺眼,看别人的也是,开源代码很多就看着赏心悦目。总感觉那方面还需要加强,总是不得其法

    作者回复: 我们这个专栏就是讨论怎么写好代码的。我们慢慢来。 讨论区有很多高手,多参与讨论,多做练手题。一定会有收获的。

    2019-01-12
    2
  • ownraul
    代码首先是给自己看的,然后是给别人看的,最终还要给以后的自己看的
    只有让人一眼望去,其中想要表达的逻辑能清晰明了,一览无遗,这才是好代码
    2019-01-18
    1
  • 秦凯
    分享两条简单、有价值的实践:
    在编辑器中设置使用指定的空格数(一般四个)替换tab键;
    范老师之前提到的,用if else 替换三目运算符,以及用 i += 1; 替换 ++i;等,可以让代码逻辑更易于理解,降低阅读成本。

    作者回复: 好使😊,tab键,可以在IDE设置好,vi也可以设置,把tab换成四个空格。

    2019-01-11
    1
  • 编码规范除了个人要有良好的编码习惯外,最好还是能有一些工具来辅助,比如阿里的编码规范插件,还有团队协作编码,基础的规则,可以使用EditorConfig制定。
    2019-08-27
  • Sisyphus235
    代码不是写给自己看的,也没有代码不需要迭代开发,规范的代码能提高协作的效率
    2019-05-21
  • 👽
    “我替你想两个办法,一个是琢磨琢磨怎么说他会愉快滴接受,并且感谢你。或者,琢磨琢磨怎么搞个规范,让流程帮助他。 他变好了,你也工作轻松,心情愉快,对吧? 多赢! 这种事情,也能给你带来成就感,不信你就试一试😄。”
    为了看到规范代码。我做了以下的事:
    1. 自己先更加严格要求自己的代码。
    2. 参加了阿里巴巴代码规范的认证考试,并拿到了证书。
    3. 把证书给领导看一眼(证明我自己是规范的),然后说规范很有用。
    4.领导表示,嗯,他也觉得是这样。
    5.领导在群里通知,建议大家考一下,费用公司报销。
    5几个月过去了,我还是唯一一个我们单位执证上岗的。
    6. 报了范老师的课程。无法要求别人,但是更不能停止精进自己!最起码不能让别人骂我的代码!
    希望这段留言不会被我同事或者领导看到,紧张。
    不过,被看到了,貌似也有好处,没准我们公司的代码明天就规范化了呢。

    作者回复: 赞! 领导和同事看到你的留言也没问题的,规范是多赢的局面,大家都进步。规范这东西,用的人越多力量越大,效率越高。

    同事们没有规范,大概率是还没有意识到规范的好处。前几篇文章我自己都觉得都有点啰嗦。但是我就是要把这些基本的理念,翻过来调过去的讲,从不同的角度讲。有了这些意识以后,技术的东西就都是小事了。我也建议你分享一下专栏的这几篇文章给同事们。

    我想一想有什么形式,可以让三五个小伙伴组成一个小组,把代码规范就启动起来,还不增加大家的工作负担。也许后续我们可以写一个专题文章。专栏的小伙伴们,也帮着想想办法。

    2019-01-14
  • 小田
    代码规范是协作的基础,质量的保证,因此促成了开发的高质量、高效率
    2019-01-12
  • 往事随风,顺其自然
    为什么后面追加要改成流逝的数据?

    作者回复: 这就是要找的问题呀😄

    2019-01-12
  • yaya
    这个课程是以java作为基础的吗?虽然还是可以读懂,但是有些细节比较模糊

    作者回复: 虽然是通用的原则,但是主要是用Java代码示范。 非常抱歉,我需要把这些意识的东西,用一门编程语言展示出来,我刚好对Java比较熟,就使用了Java语言。

    要是代码不明白,留言区留言,我在回复里给解释下。

    2019-01-11
  • yaya
    现在有什么统一的规范吗,我对于变量命名,方法命名,对于英语不是很好词汇量不是很多的人感觉有点困难,有什么ide可以用吗

    作者回复: 我建议在一个广泛使用的规范上拓展,比如Java的编码规范,Google的Java编码风格,阿里巴巴的Java编码指南。

    一般的编码规范会提供IDE插件。有人留言阿里巴巴的Java编码指南就已经有插件了。你找找看。

    另外,IDE插件,并不能解决所有的编码规范问题。 我们第一篇会讨论很多编码规范,但是篇幅限制,也不全,偏重的是让大家养成基本的意识和习惯。所以,找一个业界广泛接纳的规范吧,如果你的公司没有自己的规范。也试着把规范在团队、公司推广,利人利己利公司😄

    2019-01-11
  • yaya
    现在有什么统一的规范吗,我对于变量命名,方法命名,对于英语不是很好词汇量不是很多的人感觉有点困难,有什么ide可以用吗

    作者回复: 在你的上一条留言回复了,你找找看。

    2019-01-11
  • adang
    编码规范没有绝对的好与坏,最重要的是大家要遵守,目的就是为了高效率的协作,就像范老师所说的流水线要顺畅

    作者回复: 你这个总结好,就是的,流水线要顺畅👍,顺畅就有效率。

    2019-01-11
  • 王智
    刚开始工作,感觉自己写的代码好low,时间复杂度很高,自己写的都不想看,(╥╯^╰╥),还得磨练,这个需要加强,加油.

    作者回复: 加油,时间它是你的朋友。我们的进步就是来自于我们知道自己知道的不多。 Stay stupid, stay hungry!

    2019-01-11
  • Kai
    我觉得每个公司都可以有一套自己的或者fork当前流行的代码规范,这样做code review也会更容易。另外设置一个lint自动帮助格式化代码,提出警告也是十分必要的

    作者回复: 应该有一套规范,不然,看到烂代码,都不好意思开口帮助编码的小伙伴。

    2019-01-11
收起评论
21
返回
顶部