如何高效、优雅、愉快地阅读项目源码?
Java资料站
共 4923字,需浏览 10分钟
· 2021-09-12
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
引子
能够读懂独立类和基本容器的实现; 能够读懂小型的基础库和框架; 通过源码阅读来调试和解决实际中的问题。
预思考
需求是什么?用一句话说清楚; 设计目标是什么?用一句话说清楚; 核心优势和适用场景是什么?分别用一句话说清楚; 基本原理是怎样的?先自己思考怎么实现,然后阅读框架原理文章; 整体设计是怎样的?先自己思考怎么设计,然后阅读架构设计的文章; 技术难点是什么?先自己思考其中的难点及解决方案,然后阅读相关文章; 数据结构及算法流程是如何设计的?阅读框架的源码解析文章。
需求:有一套通用机制去创建和装配应用所需要的完整的 Bean 实例,使得应用无需关注 Bean 实例的创建和管理,只要按需获取; 设计目标:根据指定的配置文件或注解,生成和存储应用所需要的装配完整的 Bean 实例,并提供多种方式来获取 Bean 实例; 核心优势:支持多种装配方式、自动装配、依赖关系自动注入;支持不同作用域的 Bean 实例创建和获取;稳定高效; 适用场景:有大量的 Bean 需要创建,这些 Bean 存在复杂的依赖关系; 基本原理:反射机制 + 缓存; 算法流程:创建 bean 工厂对象 -> 扫描资源路径,获得 bean 的 class 文件 -> 生成 bean 定义的 beanDefinition 实例 -> 根据 beanDefinitioin 实例创建 bean 实例并缓存到 bean 工厂对象 -> 依赖自动注入 -> 执行钩子方法 -> 完整的 bean 实例准备就绪。 技术难点:依赖自动装配、循环引用;解决自动依赖注入和循环引用问题需要用到缓存机制。
需求是宽泛的,目标是具体的; 目标是需求的一种实现途径,往往是设计一个具备某些关键特性的系统或产品。
方法
确立目标,通常是理解某个模块的原理、设计或者为了解决实际问题; 写个 demo,能够将主流程运行起来; 找到框架运行的入口点,通过静态代码分析,大致了解整个实现流程; 在预估会经过的关键地方打断点,单步调试; 仔细查看主流程经过的主路径、每一个主要对象及其成员变量的值及变化,细细揣摩其设计意图和方法技巧; 绘制整体流程框图和类的交互图; 学习和理解关键类及关键方法及实现(代码)。
首先把主流程及涉及到的主要类弄透彻; 理解其扩展机制; 理解主要扩展实现(需要的时候徐图之)。
接口调用有多个实现,难以确定是哪个是具体实现时; 查看某个比较复杂的具体类的成员时; 理解实现细节时。
框架解析
问题域及解决方案构成的抽象层,解决问题的核心部分; 封装和交互构成的设计层,确保灵活性、可扩展性和应用集成; 各种细节构成的实现层,用于保证性能和容错等。
有哪些子模块,子模块的设计意图是什么; 子模块之间的关联是怎样的,如何串联成一个完整的设计意图。
常用设计模式:工厂、单例、外观、策略、适配器、装饰、代理、模板、组合、观察者、迭代器; 不同问题域可能会用到的设计模式,比如 DB 驱动接口实现会用到生成器模式和桥接模式,web 请求处理用到职责链模式。
如果需要创建实例,则通常离不开工厂和单例模式; 如果涉及较为复杂的算法流程,部分算法需要在子类实现,则会用到模板方法模式; 如果需要多种实现,并依据特定场景来选取使用,则会用到策略模式; 如果要将客户端接口及实现与框架的调用隔离,则会用到动态代理模式; 如果要灵活叠加多种功能,则会用到装饰器模式; 如果涉及到事件机制,则离不开观察者模式; 如果需要在库实现的基础上提供简洁接口,则通常用到外观模式; 如果要将多种实现与多种接口定义进行连接,则会用到桥接模式; 如果需要涉及大量配置(规格)并生成实例,则通常用到生成器模式; 如果涉及容器元素访问,则离不开迭代器模式; 如果需要以统一接口访问整体与部分的行为,且整体由部分组成,则通常用到组合模式。
克服障碍
原材料 => 子部件 => 组合与集成。 原材料:砖、石、木、铝、铜、玻璃等; 子部件:墙、窗框、窗户、门、地板、楼梯、锁、通道等; 房子:由子部件进行组合和集成而成; 机制:子部件的组合与集成的原理支撑,比如形状的组合与契合、承压计算等。
如何理清其中的复杂交互关系,从而理解其中蕴含的设计思想呢?需要先理清楚框架的概念图景。
由于接口定义了具体类的行为规范,可以通过阅读接口定义及文档来了解其设计思路和骨架; 查看具体类的实例成员(暂不涉及方法),根据经验揣摩其设计意图。
按快捷键 Alt+7,可以查看该类的所有成员及方法,概览一下,大致猜测其意图; 首先只关注那些对核心问题求解有重要影响的成员,暂时忽略那些用来提升性能、可扩展性等方面的成员; 单步调试,仔细看看运行时的成员对象如何,这样会更加直观具体一些。比如 DefaultListableBeanFactory 这个类,单步调试后得到如下图示:
数据结构与算法:比如 HashMap 用到了哈希表和红黑树,需要先阅读文献(比如《算法导论》)理解其结构与算法; 原理机制:比如 IO 读写、内存管理、文件系统、编译原理、网络协议,先学习相关的原理机制,夯实基础; 编程模型:特别的编程手法和技巧,比如读 hystrix 源码,就要先熟悉函数式编程和响应式编程。
经典书籍:比如数据结构与算法,就有《算法导论》、《算法》、《计算机程序设计艺术》(排序与查找)等; 经典论文:一些还没来得及写入书籍的论文解读,比如 Raft 算法等; 技术书籍:比如 Linux 操作系统内核实现,TCP 协议详解等; 官方文档:优秀项目主页的文档部分,往往有相关原理机制的介绍,比如 ES 的官方文档; JavaDoc:优秀源码的 Java Doc 往往会引用相关出处,比如 AQS 的源码; 优秀博文:优秀博文往往有一些文献引用,可以阅读相关文献引用; 百科与搜索:在维基百科上搜索出处和引用来源;或者使用搜索引擎。
边听音乐边阅读代码; 拉取代码分支,边读边做标记并提交; 阅读原理、架构及源码分析文章。
小结
作者 | 琴水玉
来源 | cnblogs.com/lovesqcc/p/14403497.html
评论
偷偷告诉你如何一台电脑开多个微信!
大家好,我是轩辕。前几天在粉丝群里,有人问我是怎么在一台电脑上同时登录两个微信的?正好之前写过一篇文章,分析过原理,分享给没看过的小伙伴学习一下。手机端多开微信估计很多人都知道,像华为、小米等手机系统都对此做了支持,不过在运行Windows系统的电脑上怎么启动两个微信呢?其实很简单,你只需要写一个批
编程技术宇宙
0
阿里的同事,写的代码真 TMD 优雅!
通过这篇文章你将了解到整洁的代码对项目、公司和你的重要性,以及如何书写整洁的代码.通过命名、类、函数、测试这四个章节,使我们的代码变得整洁.1、为什么要保持代码整洁?不整洁的代码随着时间的增加而增加时,生产力会随之降低.导致的结果就是:代码不易扩展或扩展容易引发其他问题程序崩溃加班增加公司成本(加人
Java专栏
1
测试新人,如何快速上手一个陌生的系统!
大家好,我是狂师!作为刚入行不久的测试新人,面对一个陌生的系统时,可能会感到有些手足无措。面对一个全新的系统系统,如何快速上手并展开有效的测试工作是一个重要的挑战。本文将探讨测试新人如何通过一系列步骤和策略,快速熟悉并掌握新系统的测试要点,从而提高测试效率和质量。本文旨在为测试新手提供一份指导,帮助
测试开发技术
0
光纤详解:光纤跳线如何分类,多向单模转换?
本文来自“光纤详解:光纤跳线如何分类,多向单模转换?”,光纤跳线作为光网络布线最基础的元件之一,被广泛应用于光纤链路的搭建中。如今,光纤制造商根据应用场景的不同推出众多类型的光纤跳线,如MPO/LC/SC/FC/ST光纤跳线,单工/双工光纤跳线,单模/多模光纤跳线等,它们之间各有特色,且不可替代。本
架构师技术联盟
0
如何计算数据中心的冷却需求?
今日分享 【导读】数据中心的冷却要求受多种因素影响,包括设备的热量输出、占地面积、设施设计和电气系统功率额定值等等……众所周知,环境因素会严重影响数据中心设备。过多的热量积聚会损坏服务器,可能导致其自动关闭。经常在高于可接受的温度下运行服务器会缩短其使用
数据中心运维管理
0
5000w+ 的大表如何拆?亿级别大表拆分实战复盘
前言笔者是在两年前接手公司的财务系统的开发和维护工作。在系统移交的初期,笔者和团队就发现,系统内有一张5000W+的大表。跟踪代码发现,该表是用于存储资金流水的表格,关联着众多功能点,同时也有众多的下游系统在使用这张表的数据。进一步的观察发现,这张表还在以每月600W+的数据持续增长,也就是说,不超
码农编程进阶笔记
0
微软开源MS-DOS操作系统源码,冲到GitHub第一了!
大家好,我是轩辕。这两天逛GitHub的时候,突然发现一个叫 MS-DOS的项目冲到Trending榜首了!定睛一看,微软官方啊,搜了一下才知道,原来前两天,微软把MS-DOS 4.0系统开源了!关于这个系统,估计现在很多程序员都不知道了,或者只在古老的教科书上看过这玩意儿。MS-DOS,全称为Mi
编程技术宇宙
6
多人同时导出 Excel 干崩服务器!新来的阿里大佬给出的解决方案太优雅了!
点击关注公众号,Java 干货及时推送↓推荐阅读:面试辅导,我们出大成果了!来源:juejin.cn/post/7259249904777838629前言 业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,
Java技术栈
1