如何阅读框架源代码

不管对于那个段位的 Developer 来说,读源码都是一件好处颇多的事情,特别于初学者而言,这能迅速的吸纳优秀框架精华代码营养,迅速成长。不巧的是,晦涩难懂的源码,很容易让人心生怯意。今天分享就来谈一谈读源码的方法,希望能帮到一些有心读源码的朋友。

一、了解框架解决了什么问题

这不光对读源码有帮助,对整个学习都很有帮助。思考一个问题:你学习 Vue\React 的原因,除了它们如日中天,再不学习都不好意思找工作了,还掺杂了一些它们的某些优秀特性能给我带来某某好处的思考么?

新潮的框架,开发者需要而且也应该去了解,用人单位需要当然是本能的驱动力,什么火学什么也无可厚非,但是在闷声学习之前,需要加上一层思考,相比之前的技术体系,这个框架到底解决了什么问题,优势在哪,怀着目的去学习才不至于迷茫,例如
Vue\React 最大的优点是什么呢?组件化吧,带着框架是如何解决这个问题的疑问去学习,定能事半功倍

对于读源码来说,这一步就更关键了,如果都不了解代码是要干什么的,怎么会清楚它为什么这么写呢?再细分一下,在仔细阅读某个模块的文件的时候,也应当对模块的功能有个整体的把握

二、了解框架的设计思想

这一步尤为关键,我们看不懂源码(或者看起来举步维艰),并不是因为不懂某一句语法,而是不明白作者的思路。举一个简单的例子:

    //这个方法可以获得point2顶角的弧度值
    function getAngle(point1, point2, point3) {
        var bb = (point2.y - point1.y)*(point2.y - point1.y) + (point2.x - point1.x)*(point2.x - point1.x);
        var aa = (point3.y - point1.y)*(point3.y - point1.y) + (point3.x - point1.x)*(point3.x - point1.x);
        var cc = (point3.y - point2.y)*(point3.y - point2.y) + (point3.x - point2.x)*(point3.x - point2.x);
        var cosa = (bb + cc - aa)/(2*Math.sqrt(bb)*Math.sqrt(cc));
        return Math.acos(cosa);
    }

getAngle方法接收三个坐标参数,可以计算出 point2 顶角的弧度值,如果不告诉你这使用了运用三角形的余弦定理,恐怕你看半天也看不出来这是怎么算出来的

那么我们可以通过什么渠道去了解框架的设计思想:

  • 到框架的官网看文档,开源的框架,甭管详不详细,这肯定是第一手权威资料
  • 到网上搜别人的分析总结(源码分析也不会少),大多数情况下,都会有大神已经研究过了,站在巨人的肩膀上,能省不少事

另外,设计思想是整个框架层面的,对于每一个实现细节,又会使用不少设计模式,例如函数式编程(Js
中最为常用)、单例模式、代理模式、工厂模式等等,这就需要平时的积累了。有一定代码量的积累之后,建议阅读一些设计模式类的书籍,对自己的代码设计,以及阅读别人的源码,都很有益处。

三、搭建调试环境,摸清执行主脉络

第一节我们提到,细分到每个模块,要对模块功能有个整体的把握,如何去做到这个“把握”?除了官方文档和网上查阅的资料,最好的办法就是写一个简单的

Demo,搭建好测试环境,增加一些调试信息,自然能理清除框架的生命周期中,每一步需要调用那个模块(对于目录结构很清晰的优秀框架,有时候也可以凭直觉猜测,打印日志确认)

四、分清主次

框架源码就是一颗枝繁叶茂的参天大树,而你要做的事情是从根部网上爬。树要这么多分支,时间又是这么昂贵,阅读的策略很重要。我们的阅读路径,要以主要流程为主(也就是树的主驱赶,这样才能尽可能快的到达顶点),对于一些细枝末节,再这之后再来慢慢啃(或者有必要的时候)
例如,要去阅读 Vue 的源码,有个目录是解析模板,生成语法树 AST 从而最终生成 Render Function 的,
其实这一步最关键的是这个 Render Function
的生成结果,对于如何去解析模板、生成语法树,可以先放一放,回头需要的时候再回头看。否则你很容易卡死在某个点上出不来,从而产生放弃的念头

五、坚持不放弃

技术策略得当,遇到棘手过不去的问题也很正常,这个时候考验的就是毅力了,继续调试、搜索资料、或者找个大神来问一问都行,只要不放弃就好~~

作者:小虫巨蟹

来源:51CTO

时间: 2024-10-27 16:02:50

如何阅读框架源代码的相关文章

分享一个简易的ORM框架源代码以及基于该框架开发的一个简易论坛源代码

框架源代码以及基于这个框架开发的论坛源代码下载地址: 下载地址:http://files.cnblogs.com/netfocus/Forum.rar 论坛演示地址:http://www.entityspider.com/ 如何使用该框架的一篇文章:http://www.cnblogs.com/netfocus/archive/2010/01/10/1643569.html 下载后,请读readme.txt文件.  简要说明:  经过我的不懈努力,我的数据处理框架终于又上了一个新的台阶了.今天我

如何高效的阅读hadoop源代码?

这篇文章的内容是从知乎的帖子上摘抄下来的,是董西成的经验之作,虽然我还没有来的及通读源码,但觉得这经验有些意义就转载来与大家共享. ============ 首先,不得不说,hadoop发展到现在这个阶段,代码已经变得非常庞大臃肿,如果你直接阅读最新版本的源代码,难度比较大,需要足够的耐心和时间,所以,如果你觉得认真一次,认真阅读一次hadoop源代码,一定要有足够的心理准备和时间预期. 其次,需要注意,阅读Hadoop源代码的效率,因人而异,如果你有足够的分布式系统知识储备,看过类似的系统,则

如何研习框架源代码

问题描述 我最近在看一个关于压缩的java框架源码,我通常都是用ctrl加鼠标左键从入口一步一步的往下看,但有的时候看到他调用的是接口就没发点下去了.接口具体的实现不知道怎么看.大家都是怎么看源代码的啊 解决方案 看框架源码 最开始需要找本书带你读源码是最容易上手的.上手之后 自己再看源码就会清楚多了..lz第一次看到话 建议找本相关的书,用书带着你读好了... 并不是读了源码就牛B. 先找本书入入门 这样最好.解决方案二:eclipse在接口上crtl+t可以看到接口的实现我建议你设置个断点

php框架codeigniter框架源代码分析,注释中文化,类库分析(一)

最近这几天决定看 ci框架的源代码的,因为它是轻量级的,代码文件的结构比较清晰,又index.php作为 入口,在codeigniter.php文件中加载所有的基础类,于是我挨个类滴看下去,并且在看的时候分析了每一步 关键的进程,而且对原来的英文注释进行了翻译,现在主要文件已经翻译完成,稍候会翻译并分析一些其他 的重要的类,敬请期待 这里的是 它的详细的执行过程,从入口到最后结束,进行了完整的记录,大家先看着,其他的分析,例 如,CI超类的结构,如何实现MVC模式,数据库类的实现,xss过滤类的

阅读 Docker 源代码的神兵利器

Golang开发环境的安装 阅读Go源码之前,安装Go语言的开发环境是必不可少的.下面我们介绍下载和安装的步骤. 1. 下载官方的Go语言安装包 请根据操作系统的版本(FreeBSD.Linux.Mac OS X或者Windows)以及处理器的架构(386.amd64或者arm)进行选择.下载地址为:https://golang.org/dl/ ,是Google提供的服务,可能需要使用VPN才能访问. 2. 安装Go语言安装包 选择合适的版本下载完成后,就可以开始进行Go语言安装包的安装了,过程

其无前例的springmvc+mybatis后台漂亮框架源代码

说明:JAVA SpringMVC+mybatis(oracle 和 mysql) HTML5 全新高大尚后台框架 bootstrap 内置功能 1.     用户管理:用户是系统操作者,该功能主要完成系统用户配置. 2.     组织管理:配置系统组织机构(公司.部门.小组),管理其中角色,配置访问权限 3.     菜单管理:树结构展现,配置系统菜单图标个性化等,配置按钮权限标识等. 4.     字典管理:分为系统字典和数据字典,系统字典对系统一些重要字段进行维护,数据字典对系统中经常使用

设计模式开篇

提到设计模式,我们会经常这样听说:"我也看过很多的设计模式,但在实际的项目中从来没有用过".这的确是我以及很多人遇到的情况,那些设计模式都能看懂,但就是在项目用不到,总感觉纸上谈兵,落实不到我们具体的项目上.  我的个人观点:  (1) 对设计模式的理解还不够深入      首先我们要对设计模式所要解决的问题要理解透彻,即什么样的场景适合用这个设计模式.然后就是这个设计模式是如何解决的?解决方式的亮点在哪里?如需求增多时,如何更好地扩展.设想一下,给出一个设计模式,你闭上眼睛能完整的说

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1. 设置应用程序环境 define("ENVIRONMENT", "development"); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch

使用maven解决两个开源框架的包冲突,必须下载它的源代码版本来自己编译吗?

问题描述 使用maven解决两个开源框架的包冲突,必须下载它的源代码版本来自己编译吗? 最近下载了两个相互配合的开源框架,都是编译好的二进制版本,但运行时报错提示jar包冲突. 自然想到了使用maven来解决包依赖.包冲突等问题. 但我对maven的理解是:它根据pom.xml文件来依次完成下载.编译.测试.打包等工作. 那我的问题就是,若要使用maven来管理包,是不是不能下载二进制版本的程序,只能下载源代码版本的来自己编译?因为如果下载编译好的二进制版本,每个框架其中的lib文件夹下已经有很