代码精进之路
范学雷
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讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

06 | 代码整理的关键逻辑和最佳案例

范学雷 2019-01-16
写一篇文章,要层次清楚、段落分明,写代码也是这样。杂志排版,要布局合理,阅读舒适,代码的编排也要这样。
可是很多人想的是,代码能工作就行,不用讲究格式;时间紧,哪有时间整理代码。
可事实上,干净整洁的代码带给我们的,远远不止格式上的赏心悦目,它更可以减少错误,提高我们的编程速度与效率。因为代码的层次结构、格式部署,是我们对自己思维的整理,也是我们思考逻辑的展现。
很多人不愿意整理代码,觉得这项工作很麻烦。其实代码的整理并不复杂,也不需要什么高深的技巧。有效地使用空行、空格和缩进,简单的分割与对齐,就可以使得代码的视觉效果甚至质量发生巨大的变化,理顺编码的思路,提高编码的效率。这是一个付出少、收获大,值得养成的好习惯。

给代码分块

其实整理代码,就是给代码分块。我们的大脑接收信息是按照分块的模式进行的。一块就是一个可识别的信息,它被安放到短期记忆的“插槽”里。信息块的实际信息量是可变的,但是越简单、越具体的信息块越容易被记住和理解。
一份好的报纸或者杂志,文章本身往往很简短,或者被分割为简短的块。使用小段落、子标题,大量留白,版面切割,尽一切可能分解文章、版面,让眼睛舒适,让大脑有时间停留下来接受每个信息快。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • 草原上的奔跑
    今天这篇内容很实用,我现在也有整理代码的习惯,但是只是用的都比较零散,不像本篇中这么系统,而且范老师给出了理论依据。代码块,人体接受信息的方式。有实践方法,有理论支撑,以后整理代码也会更有目标性,同时,在要求别人整理代码时,也会有理有据。最后说一句,看到写的排版很乱的代码,很影响阅读代码的心情,以及理解代码的速度。

    作者回复: 知道为什么乱,才好改。

    这一篇的最后一节,我们会总结一些编码规范方面的一些心理学知识。到时候,你在回头看看这一篇的文章,可能会有新的收获。

    编码规范比较杂,知道了背后的道理,运用的就自如些,方便些。

    2019-01-16
    6
  • Dream
    总感觉给出的一些理论,在现实开发有一些是没有必要的。如果每一篇就讲针对性很强的一段代码,不好吗,理论性的东西太多了,对实践转换率不强,

    作者回复: 嗯,我理解你的看法。这也是这个专栏不讨巧的地方。如果讲代码的话,我写的也轻松,你学的也带劲。其实,这也是我一直想和大家讨论的一个问题。

    讲代码很重要。但是,看再多的代码,就这一节来说,我觉得都不如知道“大脑按块接受信息”这个行为模式重要。理解了基础的理论,所有的规范都不用死记硬背,你还可以创造新规范、改进旧规范。

    有时候,我们对于一些规范很纠结,比如使用四个空格的缩进问题,比如if语句后要跟个括号的问题,也很难再实践中被遵守。为什么哪? 说白了,就是不知道不这样做的危害。很多公司有一套一套的规则,就是执行不了。为啥呢?大家根本不知道规则对自己有什么好处。

    编码规范这东西,随便网上找找,都是一大堆的规范。阿里的规范,Google的规范,Java的规范的规范,都可以找到,讲的比我们这个专栏要全要多。当我开始筹划这个专栏的时候,我给自己定下的目标,是让大家了解为什么;然后给一些例子,说明怎么办。理解了为什么,好多事情你自然就知道怎么办了,这样好多东西才可能成为你自己的东西,而不是我塞给你的东西。

    很可惜的是,这样做的确存在很大的问题:理论成了我要硬塞给你的东西。所以,理论这一块,有人可能就有点抗拒。🤣又让我学没用的理论!

    我们在看代码的时候,很少有人说,这是代码规范规定的,你必须这样改、那样改,按照规范改。这样说,可能没人愿意搭理我们。我们常说的是,这样看着不舒服,那样容易出问题,说的更多的是为什么。如果让我找一找为什么给出理论重要,也许更愉快地工作,算是一点吧。

    2019-01-17
    1
    4
  • 虢国技匠
    打卡
    我有一个自己在实践且感觉不错的经验,分享一下:
    举个栗子,我现在准备写一个控制器方法,我会先仔细想想要做一点什么?怎样的顺序?多想几次在脑袋里过一下,但是我不会深想到底怎么做,想好以后,我会先写注释(更准确说应该是提纲),以注释作为思路的引子同时也是一种代码实现思维的分块

    作者回复: 这个办法不错。我是在纸上各种画。

    2019-01-20
    3
  • _CountingStars
    因为每一个编辑器的制表符显示出来不一样 有点编辑器 把制表符展示为4个空格 有的编辑器把制表符展示为8个空格 不统一 不同编辑器显示效果不同 使用4个空格就没有这个问题
    2019-01-16
    3
  • hua168
    老师,像我这种没有项目经验,知道类、接口及其修饰符、方法,但不知道什么情况下使用:
    1. 接口:是抽象方法的集合,一个实现接口的类,必须实现接口内所描述的所有方法。
             理解是当有些方法规定死的就要用接口,比如人的身份证,设置名字、地址、性别等

    2. 类:类是一个模板,它描述一类对象的行为和状态。对象是类的实例化。
           访问控制修饰符:default、private、public、protected
           非访问修饰符:static、final、abstract(只能继承)、synchronized、transient
                         volatile
           继承、多态、
    3.方法: 语句的集合,它们在一起执行一个功能。

    这些基础概念都懂,但是就不知道怎么在项目中应用的,说懂好像又不懂,感觉基础不是很扎实一,我这种情况怎搞?有没有相关文章或书推荐一下,非常感谢?

    作者回复: 先要区分类和方法。在面向对象的设计中,类表示的是一个对象。比如人,身份,铅笔,钱包等。一般地,名词或者可以看作名词的词,需要用类来表示。

    方法,一般表示的是行为,也就是你说的执行一个功能。比如买菜,拖地,钓鱼,吃没吃过晚饭,有没有购房资格,都可以看作是行为或者判断。一般地,动词和形容词,或者类似的词,要用方法来表示。

    通常地,一句话,有主语、谓语、宾语,主语和谓语一般表示为类,而谓语就是连接两个类的方法。

    举个例子,“授权的用户可以登录服务系统”这句话里的词语有“授权的", “用户”,“登录”,“服务系统”。那么,“用户”和“服务系统”就可以设计成类,而“授权的”是“用户”这个类的一个方法。“用户”和“服务系统”这两个类里,要分别有方法处理“登录”这个行为。

    而Interface呢,一般用在高度抽象的场合。什么是高度抽象呢? 比如说,我们知道资源的使用最后应该关闭,那么“关闭”就可以是一个高度抽象的方法。 不管是什么资源,什么类,都可以有一个“关闭”的方法。实现了“关闭”接口的类,都可以调用“关闭”这个方法。 这里面有一个小问题就是,房屋的门可以实现“关闭”,下水管道也可以实现“关闭。可是,房屋和下水管道之间,并没有可以继承的关系。这时候,Interface就可以突破class的继承限制,多个没有继承关系的类,都可以实现Interface。一个类,只能继承一个父类,但是可以实现多个Interface。 比如说,class MySubClass extends MyClass implements Closeablse, Comparable {// snipped}。

    不知道市面上还有没有"面向对象软件构造"这本书。太厚了,可以当作工具书查阅。 另外,多看看、琢磨琢磨Java标准类库的设计。这些API的设计,用“苛刻”这个词形容一点都不过分。这些API的背后,有着大量的权衡和考量,大部分都经得住了时间的考验。琢磨琢磨这些API的设计方式,也是一个学习设计的好办法。

    2019-03-10
    2
  • 背着吉他的大漠狼
    老师,有的时候,在一个代码块里面逻辑较多,远远超过了25行,这个时候我们是在这个块里写完,还是再分块,分块了又使得同一个目标不同的代码块了,希望老师能看到

    作者回复: 一般来说,一个大的逻辑可以分成更小的逻辑,并列的小逻辑或者下层的小逻辑。这些小逻辑,可以分割成代码块,或者包装成方法。所以,一个大块里,你还可以再分小块。

    2019-01-21
    2
  • 蓝色波浪
    // conventional indentation
    int runningMiles = runningSpeedOne * runningTimeOne +
                       runningSpeedTwo * runningTimeTwo;
    这个是不是违背了在操作符前换行这个原则?

    作者回复: 是的。

    2019-01-18
    2
  • lianlian
    哈哈哈,我发现我写得很规范
    2019-01-16
    1
  • 空知
    老师可不可以多出些题目,可以结合实际练练手~~

    作者回复: 嗯,我找找实际的代码。

    就规范这一部分来说,你可以看看OpenJDK的String类的代码,或者其他基础类的代码,看看有什么可以改进的地方。 发现了问题,就给OpenJDK提交bug,提交补丁。

    JDK用的太广泛了,每一个微小的修改,都会用到几十亿台设备上,都很有价值。还能成为OpenJDK成员😊

    2019-01-16
    1
  • pyhhou
    专栏看到现在,很有收获,规范了自己之前没有想到的很多地方,满满的干货,谢谢老师~

    作者回复: 不谢,有收获就好。

    2019-01-16
    1
  • 听雨
    1)
    if (hiTail == null) {
        hiHead = e;
    }
    else {
        hiTail.next = e;
    }
    2)
    if (hiTail == null) {
        hiHead = e;
    } else {
        hiTail.next = e;
    }

    老师,这两种写法,哪种好呢

    作者回复: 我通常使用第二种。第二种规范推荐的多些。

    2019-10-23
  • 听雨
    感觉Oracle JDK在代码规范做的很差,基础集合里面方法都是一大片一大片的,if或者for不加花括号等等,看的心累

    作者回复: 收到;-)

    2019-10-23
  • hshayq
    我写Python一般都是在括号后换行,比如
    a = get(
        arg1,
        arg2,
        arg3
    )
    老师怎么看?

    作者回复: 挺好的。我建议在括号后换行,便于阅读和搜索,看到括号就知道这是一个方法或者函数。每个参数一行,这也是容易理解、视觉效果好的编排方式。

    2019-07-08
  • Sisyphus235
    留言里没有一条讨论习题的。。。

    Line 2 后面习惯空两行,表示 import 和代码块之间的区分;
    Line 8 后面空一行,表示注释的区分;
    Line 10 后面空一行,表示初始化的区分;
    Line 17 后面空一行,表示异常的区分;

    空格、空行、缩进都是很好的视觉手段,加上 IDE 提供的收起和展开功能往往能让开发者很直观的看到代码的意图。整理代码逻辑就能很好的分块,我一般代码会分为“基础校检”,“初始化”,“核心代码逻辑” *n,“LBYL”的异常处理等

    作者回复: “整理代码逻辑就能很好的分块”! 这个总结很棒!

    2019-05-21
  • 浅吟且行的未来
    赞老师,理论结合实际的方式很好!学到了原因,更容易理解规范!
    2019-04-04
  • hua168
    一个代码块只能有一个目标,有点疑问:
    1. 代码块是不是可以是类、接口、方法(函数)?

    2. 如果类和方法的话,是不是可以理解类是实现大目标,方法实现小目标?
       我实现一个类,要使用几好个方法,方法一定要独立的吗?

    3.方法和类的使用一直有点判断不了,在什么情况下使用类什么情况使用方法?
      我一个东西可以使用方法实现,也可以使用类实现,是不是能用方法就不用类?

    作者回复: 一个大目标可以分解为小目标,大问题分解为小问题,这就是为什么会有缩进的逻辑。

    方法独立的问题,我们后面还会谈到。 如果方法不独立,会有很多问题; 但是也做不到所有软件的所有方法都独立。

    类一般是一个名词,表示一个对象;而方法一般可以使用动词,表示一种行为。从需求中找名词、动词(主语、谓语、宾语,形容词)这是一个常用的面向对象设计的办法。比如,一个授权的客户可以查询他的账户余额,客户、账户、余额,都是对象,可以考虑设计成类,而授权、查询,都是行为,可以考虑设计成方法。该怎么授权呢? 又是一大堆的描述,这就是把大问题分解成小问题。

    行为也可以设计成类,比如授权当作名词看,就可以是个类。这种情况,需要复用设计,分离出抽象行为的时候用的比较多。

    2019-03-08
  • 湮汐
    老师,有些时候,因为方法名太长比如aaa.bbb().ccc().ddd()这种结构,换行是应该在“.”前面还是后面?

    作者回复: 两种方式都很常见,“.”前面换行的稍微多一点。

    2019-02-20
  • CGL
    Idea的ctrl shift enter了解一下

    作者回复: IDEA看来很多人爱啊

    2019-02-19
  • 黄朋飞
    换行后应该和表达式的哪部分对齐呢?

    作者回复: 如果有空间,双倍缩进或者缩进更多到和同级别的表达式对齐。只要多于双倍缩进,怎么好看怎么来。

    2019-01-23
  • xavier
    感谢老师的讲解。规范的目的是提高代码可读性,便于交流。这些规范不是死板的,每个人可以根据自己的喜好,在不违背基本要求的前提下,选择自己认可的编码方式。不要过于纠结用哪一种方式。比如方法的{}花括弧,我就喜欢每个单独一行。另外可以使用一些代码格式化的插件,实现老师文中提到的一些基本编码格式。

    作者回复: 是的,认为写好代码只有一种规范是不对的。所以,我们要理解规范要求背后的一些东西,这样就计较容易写出别人看的顺眼的代码。不过,如果一个项目有规范,还是要遵守的。审美偏好太难协调,每个人一套规范也很麻烦。

    插件是个好东西。有些规范,也是我们思考的逻辑的延展。要是编写代码的时候,就主动使用规范,也能帮助我们写好代码。

    2019-01-22
收起评论
30
返回
顶部