代码精进之路
范学雷
前 Oracle 首席软件工程师,Java SE 安全组成员,OpenJDK 评审成员
37886 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
结束语 (1讲)
代码精进之路
15
15
1.0x
00:00/00:00
登录|注册

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

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

给代码分块

其实整理代码,就是给代码分块。我们的大脑接收信息是按照分块的模式进行的。一块就是一个可识别的信息,它被安放到短期记忆的“插槽”里。信息块的实际信息量是可变的,但是越简单、越具体的信息块越容易被记住和理解。
一份好的报纸或者杂志,文章本身往往很简短,或者被分割为简短的块。使用小段落、子标题,大量留白,版面切割,尽一切可能分解文章、版面,让眼睛舒适,让大脑有时间停留下来接受每个信息快。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《代码精进之路》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 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的设计方式,也是一个学习设计的好办法。

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

    作者回复: 嗯,我理解你的看法。这也是这个专栏不讨巧的地方。如果讲代码的话,我写的也轻松,你学的也带劲。其实,这也是我一直想和大家讨论的一个问题。 讲代码很重要。但是,看再多的代码,就这一节来说,我觉得都不如知道“大脑按块接受信息”这个行为模式重要。理解了基础的理论,所有的规范都不用死记硬背,你还可以创造新规范、改进旧规范。 有时候,我们对于一些规范很纠结,比如使用四个空格的缩进问题,比如if语句后要跟个括号的问题,也很难再实践中被遵守。为什么哪? 说白了,就是不知道不这样做的危害。很多公司有一套一套的规则,就是执行不了。为啥呢?大家根本不知道规则对自己有什么好处。 编码规范这东西,随便网上找找,都是一大堆的规范。阿里的规范,Google的规范,Java的规范的规范,都可以找到,讲的比我们这个专栏要全要多。当我开始筹划这个专栏的时候,我给自己定下的目标,是让大家了解为什么;然后给一些例子,说明怎么办。理解了为什么,好多事情你自然就知道怎么办了,这样好多东西才可能成为你自己的东西,而不是我塞给你的东西。 很可惜的是,这样做的确存在很大的问题:理论成了我要硬塞给你的东西。所以,理论这一块,有人可能就有点抗拒。🤣又让我学没用的理论! 我们在看代码的时候,很少有人说,这是代码规范规定的,你必须这样改、那样改,按照规范改。这样说,可能没人愿意搭理我们。我们常说的是,这样看着不舒服,那样容易出问题,说的更多的是为什么。如果让我找一找为什么给出理论重要,也许更愉快地工作,算是一点吧。

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

    作者回复: 知道为什么乱,才好改。 这一篇的最后一节,我们会总结一些编码规范方面的一些心理学知识。到时候,你在回头看看这一篇的文章,可能会有新的收获。 编码规范比较杂,知道了背后的道理,运用的就自如些,方便些。

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

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

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

    作者回复: 是的。

    4
  • 空知
    老师可不可以多出些题目,可以结合实际练练手~~

    作者回复: 嗯,我找找实际的代码。 就规范这一部分来说,你可以看看OpenJDK的String类的代码,或者其他基础类的代码,看看有什么可以改进的地方。 发现了问题,就给OpenJDK提交bug,提交补丁。 JDK用的太广泛了,每一个微小的修改,都会用到几十亿台设备上,都很有价值。还能成为OpenJDK成员😊

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

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

    3
  • Sisyphus235
    留言里没有一条讨论习题的。。。 Line 2 后面习惯空两行,表示 import 和代码块之间的区分; Line 8 后面空一行,表示注释的区分; Line 10 后面空一行,表示初始化的区分; Line 17 后面空一行,表示异常的区分; 空格、空行、缩进都是很好的视觉手段,加上 IDE 提供的收起和展开功能往往能让开发者很直观的看到代码的意图。整理代码逻辑就能很好的分块,我一般代码会分为“基础校检”,“初始化”,“核心代码逻辑” *n,“LBYL”的异常处理等

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

    2
  • 学无涯
    1) if (hiTail == null) { hiHead = e; } else { hiTail.next = e; } 2) if (hiTail == null) { hiHead = e; } else { hiTail.next = e; } 老师,这两种写法,哪种好呢

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

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

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

    1
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部