Ⅰ 如何高效阅读源代码
下面是之前写的一篇文章:《如何快速阅读源码》
本文探讨在需要了解一个开源项目时,如何快速的理清开源项目的代码逻辑!
以下是个人认为行之有效的方法:
本文以Mybatis为例来进行演示!
先“跑起来”程序界有个老传统,学习新技术时都是从“Hello World”开始的!无论是学习新语言时,打印“Hello World”;还是学习新框架时编写个demo!那为什么这里的“跑起来”要打个引号呢?
实际上,当你想要阅读一个开源项目的源码时,绝大部分情况下,你已经能够使用这个开源项目了!所以这里的“跑起来”就不是写个“Hello World”,也不是能跑起来的程序了!而是能__在你的脑子里“跑起来”__!什么意思?
Mybatis你会用了吧?那么请问Mybatis是如何执行的呢?仔细想想,你能否用完整的语句把它描述出来?
这里是Mybatis的官方入门文章!你是如何看这篇文章的?读一遍就行了吗?还是跟着文章跑一遍就够了吗?从这篇文章里你能获得多少信息?
我们来理一下:
回答出了上面这些问题!你也就基本能在脑子里把Mybatis“跑起来”了!之后,你才能正真的开始阅读源码!
当你能把一个开源项目“跑起来”后,实际上你就有了对开源项目最初步的了解了!就像“ 书的索引 ”一样!基于这个索引,我们一步步的进行拆解,来细化出下一层的结构和流程,期间可能需要深入技术细节,考量实现,考虑是否有更好的实现方案!也就是说后面的三步并不是线性的,而是__不断交替执行__的一个过程!最终就形成一个完整的源码执行流程!
自顶向下拆解继续通过Mybatis来演示(限于篇幅,我只演示一个大概流程)!我们现在已经有了一个大概的流程了:
虽说每个点都可以往下细化,但是也分个轻重缓急!
很明显,SqlSession去执行 sql才是Mybatis的核心!我们先从这个点入手!
首先,你当然得先下载Mybatis的源码了(请自行下载)!
我们直接去看SqlSession!它是个接口,里面有一堆执行sql的方法!
这里只列出了一部分方法:
SqlSession就是通过这些方法来执行sql的!我们直接看我们常用的,也是Mybatis推荐的用法,就是基于Mapper的执行!也就是说“SqlSession通过Mapper来执行具体的sql”!上面的流程也就细化成了:
那SqlSession是如何获取Mapper的呢?Mapper又是如何执行sql的呢?
深入细节我们来看SqlSession的实现!SqlSession有两个实现类SqlSessionManager和DefaultSqlSession!通过IDE的引用功能可以查看两个类的使用情况。你会发现SqlSessionManager实际并没有使用!而DefaultSqlSession是通过DefaultSqlSessionFactory构建的!所以我们来看DefaultSqlSession是如何构建Mapper的!
它直接委托给了Configuration的getMapper方法!
Configuration又委托给了MapperRegistry类的getMapper方法!
在MapperRegistry类的getMapper中:
在这里knowMappers是什么?MapperProxyFactory又是什么?mapperProxyFactory.newInstance(sqlSession)具体做了什么?
其实很简单,knowMappers是个Map,里面包含了class与对应的MapperProxyFactory的对应关系!MapperProxyFactory通过newInstance来构建对应的Mapper(实际上是Mapper的代理)!
快接近真相了,看mapperProxyFactory.newInstance(sqlSession)里的代码:
这里干了什么?
最终实际还是委托给了sqlSession去执行具体的sql!后面具体怎么实现的就自行查看吧!
延伸改进现在我们的流程大概是这样的一个过程:
现在我们大概知道了:
那么,
这个问题列表可以很长,可以按个人需要去思考并尝试回答!可能最终这些问题已经和开源项目本身没有什么关系了!但是你思考后的收获要比看源码本身要多得多!
再循环一轮结束后,可以再次进行:
不断的拆解->深入->改进,最终你能__通过一个开源项目,学习到远比开源项目本身多得多的知识__!
最重要的是,你的流程是完整的。无论是最初的大致流程:
还是到最终深入的细枝末节,都是个完整的流程!
这样的好处是,你的时间能自由控制:
而不像debug那样的方式,需要一下子花费很长的时间去一步步的理流程,费时费力、收效很小,而且如果中断了就很难继续了!
总结本文通过梳理Mybatis源码的一个简单流程,来讲述一个个人认为比较好的阅读源码的方式,并阐述此方法与传统debug方式相比的优势。
阅读源码是每个优秀开发工程师的必经之路,那么这篇文章就来讲解下为什么要阅读源码以及如何阅读源码。
首先来说下为什么要读源码,有学习源码的必要吗?
为什么要阅读源码?
关于为什么阅读和学习源码,我个人认为可能有以下几点:
(一)吊打面试官,应对面试
为了找到更好的工作,应对面试,因为在面试中肯定会问到源码级别的问题,比如:为什么 HashMap 是线程不安全的?
如果你没有阅读过源码,面试官可能会对回答的结果不满意,进而导致面试结果不太理想,但如果你对源码有所研究,并能够很好地问答面试官的问题,这可能就是你的加分点,可以形成自己独特的竞争力,吊打面试官,升职加薪不是梦。
(二)解决问题(bug)
在开发过程中,我们或多或少会遇到 bug,比如:在 foreach 循环里进行元素的 remove/add 操作,为啥有可能会报 异常?
我们可以先在 Google、Stack Overflow 以及对应项目的 Issues 里看有没有类似问题以及解决办法,如果没有的话,我们只能通过阅读源码的方式去解决了。如果我们对相关源码有所涉猎,就可以快速定位到问题所在。
(三)提升编程能力
和阅读一本好书一样,阅读源码就是和编程大牛面对面交流的机会,在许多优秀的开源项目中,它们的编码规范和架构设计都是很棒的,另外在设计上也使用了大量的设计模式,通过阅读和学习源码,能够快速提升我们的编码水平,以及对设计模式有更深的理解。
同时,在我们阅读完一个源码后,可以触类旁通,能够快速地对其他框架的源码进行阅读和学习,减少时间成本。
除了上述提到的原因之外,可能还有许多,在这里就不一一赘述了,那么在确定了要阅读源码之后,就让我们看下如何阅读源码吧!
如何阅读源码?
如何阅读源码取决于你为什么要读源码,比如:
下面大概说下阅读源码的几点建议:
在阅读之前,可以先从开源项目的官网上看它的架构设计和功能文档,了解这个项目的 整体架构、模块组成以及各个模块之间的联系 。
如果没有对应的项目文档,可以根据代码的模块进行梳理,以形成对项目的初步了解,或者 查看已有的源码解析文章或者书籍 ,在阅读源码之前,了解项目的架构和思路会使阅读源码事半功倍。
在了解一个类的时候,可以使用 ctrl+F12 来查看类中的成员变量和方法。
可以通过 IDEA 的 Diagrams 功能去了解一个类的继承关系。
多打 断点调试 ,断点追踪源码是很好的阅读源码的方式,可以先通过 debug 了解下调用逻辑,都和哪些类有关联,有大致了解后再通过 debug 了解整体代码的功能实现,各个类都起到了什么作用,有没有涉及到设计模式等。
另外,优秀的开源项目中肯定会有许多地方应用到了 设计模式 ,建议在阅读源码之前,需要对常用的设计模式有大致的了解,不然阅读源码的效率会大大降低。
如果遇到读不懂某部分源码的时候,可以先跳过,之后再回来看,如果属于搞不懂这部分就茶不思饭不想的人,可以在网上找是否有该部分源码的解析或者文档,也可以自己通过 源码注释和测试用例 去阅读学习。
一般优秀的开源项目都会有 单元测试 ,可以通过对应类的单元测试去了解方法的含义和用法,加深对源码逻辑的理解。
在阅读源码的时候,可以在代码上加上 注释和总结 ,同时还可以画出 时序图和类图 ,这样对阅读源码有很大的帮助,可以很清楚地知道类之间的调用关系和依赖关系,也方便以后回顾,重新阅读。
在这里推荐大家一个 IDEA 插件 SequenceDiagram,可以根据源码生成调用时序图,便于阅读源码。
刚开始阅读源码,不建议直接看框架源码,可以先从 jdk 源码看起:
jdk 源码也是非常庞大的,可以分模块来阅读,下面是建议的阅读顺序:
其他包下的代码也可以做下了解,JDK源码阅读笔记:https://github.com/wupeixuan/JDKSourceCode1.8
再有了一定的源码阅读经验后,可以再去学习 Spring、Spring Boot、Dubbo、Spring Cloud 等框架的源码。
总结主要介绍了为什么读源码以及如何读源码,供大家参考,每个人都有适合自己的阅读源码的方式,希望可以在学习中去摸索出一套属于自己的方式。
阅读源码不是一蹴而就的,这是持久战,只要你能够坚持下来,肯定受益匪浅。阅读源码的过程比较枯燥,可以在社群里一起讨论学习,这样可能效率更高些。
没看过源代码,都不好意思出来说了,最近刚好在看一些,来说一个。
先看使用 https://element.eleme.cn/#/zh-CN/component/installation
先看一下这个库是做什么用的,然后提供了哪些功能。
看GitHub https://github.com/elemefe
一般会看下项目最新的情况,然后没有关闭的issue,看下wiki,大家在讨论什么。
再看代码
clone 一份到本地,然后先看下目录结构,然后根据文档看几个简单的组件的时候,一边看掘金上的分析,一边自己看下实现。
e le
饿了么这个框架代码结构还是很清楚的,基本上每个组件都是分开的,所以你只要看其他的一个文件夹就行。然后一些工具的都在src文件夹。
要学会看issue,一般开源的项目都有人会来提建议,有些是bug,有些是功能,你可以看看自己是否有能力去解决,如果可以的话,你可以去fork代码,然后自己修改,再提pr。
我最近恰好找摸索出一个梳理遗留系统架构的技巧:自底向上 找到一个典型的切面 沿着调用和回调的路径 在代码中添加结构化注释(比如eclipse中加//TAG 流程A1.1 甲->>乙),这样便得到了一个code地图,并且在tasks视图中看起来很直观(看起来跟书的目录一样)可快速跳转。将目录到有道云笔记的markdown序列图中 就自动生成了一个序列图。
我觉得这基本上就是可缩放的可视化架构地图了,对维护一个比较乱和庞大的遗留系统非常有帮助,定位代码 修改维护都方便多了。
1、需要过硬的基础知识,这个前提。不然基本语法、常用的模式都不晓得怎么读。
2、多参考 历史 版本和更新变化,好的源码都是反复迭代出来的精华,开始就读精华是很不明智的,所以看看版本更新说明,版本的 历史 演变。就想人一样是怎样进化过来的。
3、参考别人阅读注释,想必在你读源码之前也有人读过了源码,并且总结,注释。和分享原理,可供你参考,毕竟每个人读一篇文章,理解的东西是有差异化的。
4、直接买书,有些作品直接出书就是源码精解
5、找个大神给你慢慢分析,这个最快。娓娓道来,直接面授比啥都强。缺点是,你容易跟着他的思维走下去。
我觉得阅读代码就不应该高效,而应该像看小说一样,看的过程就像是在和作者交流,有趣才是看代码的动力。
画图,看数据走向,逻辑走向
先弄清楚这些代码实现了哪些功能,然后从主线开始往下看,好的代码光看变量和接口名称就能明白是什么意思?扒出源码实现的整体框架逻辑,然后再对自己感兴趣的模块进行剖析,还是从整体把握,细节深入,慢慢地整个框架就被丰满了。
接下来是思考为什么要如此设计,这样设计的好处是什么?如果是你来做应该怎么设计,把你觉得源码缺点的地方进行仔细研究,了解里面是否包含自己不清楚的细节,避免遗漏。
接下来就是根据代码改造或者是调试错误,对于源码中遇到的不理解的地方一定要弄明白,有的确实是画蛇添足,有的有独特的作用。
多多学习,对每一种主流框架铭记于心,对主流设计模式了如指掌,万变不离其宗,源码看多了,跟看一个电视机遥控器的操作说明一样。
1、一边阅读代码一边写注释。这是我用过的最好的方法,对代码理解得更深入,看一些重要代码或者特别难懂的代码时挺有用。更何况,注释也是一种文档嘛。
2、一边阅读代码一边绘制UML。这个方法适用于类之间的关系较复杂和调用层次较深的情况,我一般都是先绘制顺序图,然后为顺序图中的类绘制关系图。
3、通过Debug来跟踪程序的主要执行过程,这样就可以分清主次了,阅读的时候更有针对性。
4、类的快速阅读。先弄清楚它在继承链中的位置,看看它的内部状态,也就是成员变量,一般来说,类的对外接口都是对成员变量的访问、加工、代理等,然后看看它的对外接口,也就是公有成员函数,识别核心的一个或多个函数,这时候你应该可以大概了解这个类的职责或作用了。可能这个类是某个设计模式中的一个组成部分,所以,设计模式的掌握对代码的快速阅读也是很有帮助的。
5、带着问题去阅读。比如想了解android中的消息机制,那么看看Looper、Handler、MessegeQueue这几个类就可以了,其他的不要去看,要不然就跑题了。
下面列几个阅读源码时所处的情景,在特定场景下用哪些方法: 不太熟悉业务逻辑,还不是很清楚它是干啥的,可以用3、5。 代码量很大,有几十万行,甚至百万行,可以用2、3、5。 你无法看见程序的运行过程,比如没有用户界面,也有可能是无法运行的,可以用3、5。 设计复杂,用了大量的设计模式,调用链很深,可以用1、2、3、4、5。 时间有限,没有那么多时间让你看源码,可以用3、5。
画出逻辑流程图,先了解整体流程,再详解具体函数
Ⅱ 网站源码怎么用
问题一:网站源码怎么使用 一般下载的网站源码,都有后台管理系统的。没必要在本地修改。
你直接去不复制上传到你的空间上去。进入后台添加文章类的管理。你想做动态的话要看你的源码支持不支持。
问题二:怎么用源码建立网站 源码建站的具体操作步骤:
申请虚拟主机(即空间)成功后,就会从官网得到FTP主机名、FTP用户名和FTP密码信息,该信息将是上传网站至内容的唯一凭证;
在网络中搜索“FTP”上传工具;
安装并运行“ftpzilla”程序,在程序主界面顶端输入虚拟主机相关信息,然后点击“快速连接”按钮;
此时进行与FTP服务器之间的通信工作,待连接成功后,就会显示“连接成功”的提示,同时在“远程”窗口乱笑中会显示远程FTP服务器目录结构及文件列表信息;
接下来根据FTP服务器存储网站文件的相关声明,进入远程FTP服务器“Public-html”目录,并将该目录下的所有文件删除;
在“本地站点”哗陵含窗口中,定位到网站源码所在的上传目录,选中所有待上传的文件,右击从弹出的右键菜单中选择“上传”项;
此时所有的网站源码文件将排队上传至远程服务器“Public-html”目录下,且可以在状态窗口中查看当前文件传输情况;
当文件上传完成后,整个上传网站源码至空间操作完成,当本地网站源码被更新后,为了第一时间实现远程服务器端数据的同步更新。
问题三:下载的网站源码怎么用 30分 网站源码到空间首目录。这样就可以使用了。(触:index.asp/php是首页文件)采纳给分
问题四:网站源码怎么用, 可以直接拿来修改使用,
源代码就是程序和软件的一切,
问题五:后台源码是什么啊?怎么用它做网站? 以下是我自己的理解,并不是什么标准答案!
一般企业里用的行业软件都有一台服务器有若干台客户机。每台客户机都可以分不同的权限去更新服务器上的内容,这是所谓的C/S的软件!而我刚才所说的成套的系统是指网站,也就是B/S的软件!C/S软件由客户端和服务器组成,B/S软件由浏览器和服务器组成!到这里应该就能明白B/S/C这些分别代表什么……browser(浏览器)/server(服务器)/client(客户端)。
网站就是B/S软件,而所谓的软件应该还具备一些管理功能,如更新,添加,删除等。后台源码,其实不应该叫后台源码,应该说是后台程序,这个后台程序就是实再整个网站的更新,添加,删除等常用的管理功能!但有一点不得不提一下,两个反义词,前/后。前台同样也具备了这些功能,与后台所不同的只是权限。如用户注册模块,新用户注册时其实是添加数据,注册完后修改资料这是修改数据……所以说前台也同样具备管理功能……
至于前台和后台具体的定义是什么我也不能很肯定的说,在我的理解当中后台只是面对的对象是管理员,前台面对的对象是所以网站的浏览者,但是有些网站就没有我所说的那种后台,或者说前后台根本就很难区分!
如果硬是要说前台跟后台的区别,我只能说,前台像硬件,看得见,后台像程序,是的,程序,而不是软件!因为软件还有界面,这个界面对于软件来说就是前台!
那么或者可以这么理解哗前对是面对客户的,后台是面对管理员的!
问题六:我自己有网站 请问下怎么用网站源码建网站 就是在后台怎么操作 谁有源码的网站给分享下 谢谢啦 可以将此模板加在dedecms上,这个需要修改一下html文件,将相关信息替换为dede的标签调用。具体操作可以网上搜一下dedecms添加模板和dedecms仿站教程。
问题七:怎么改网站源码里的图片 可以在源码里面的图片文件夹里找到对应图片直接替换,或找到源码里面找到图片位置直接修改数据调用路径。
网站源码里面有一个专门的文件夹是用来放图片的,网站里面用的图片基本上都是从这个文件夹调用。
替换的时候,请注意图片的属性要完全相同才能进行替换。
问题八:我在网上下载了一个html代码 我的网站怎么使用? 那把相对应的文件上传到你的空间里面,然后那个无标题文档是调用的部分,可以把订码拷贝出来,放到你想放置的页面底部就行了。
问题九:如何编写汪氏网站源码 HTML是最基本的,其次也需要javascript用于校验,css用于设置统一样式,PhotoShop也必不要少,你不可能永远都用网上down的图片吧,总得自己做个整体柜架模板,然后生成个html静态页面,再对其进行修改,刚开始你可以弄弄FrontPage,因为它跟Office一样简单,充分理解怎么用表格来定位,然后再用Dreamweaver,理解怎么用表格和层来定位,主要还是用表格定位,还有其它很多知识,像Fireworks和Flash都是起辅助作用的,以上说的都是静态页面,像动态就更多了,asp asp jsp php等技术至少会一样,推荐jsp,基于java语言,还有一些其它技术像servlet javabean ejb 柜架有struts j2ee hibernate等,不说那么多了,你先把静态弄明白吧!
来看一下HTML基本概念
1、标记
HTML用于描述功能的符号称为“标记”。如“HTML”、“BODY”、“TABLE”等。标记在使用是必须用方括号“”括起来,而且是成对出现,无斜杠的标记表示该标记的作用开始,有斜杠的标记表示该标记的作用结束。如表示一个表格的开始,表标一个表格的结束。在HTML中,标记的大小写作用相同,如和都是表示一个表格的开始。
标记可以包含标记,如:表格中包含表格或其它标记,如下面这样的HTML代码结构是正确的:
hjk
但是标记不能交叉嵌套,如下面这样的代码是错误的:
这是不正确的代码
2、特殊字符
由于方括号和英文双引号被用来提示HTML的标记及参数值,那么在网页中要显示方括号和英文引号只能用其它的符号来代替,下面是常见特殊字符所代表的正常字符:
或>对应字符 >
或――对应字符
à――对应字符 A
3、语法
一个标记,为了明确它的功能,往往用一些属性参数来描述......>>
问题十:网站源码怎么用phpstady 提供 php 某个源码下载地址,此处我们以thinkphp 框架为例
注意:通过其他途径下载,可能会因为文件不全,致使源码部署运行之后出现异常错误。所以推荐您使用我为您提供的软件和源码。
php 源码 thinkphp_3.2.3_full.zip下载之后,解压并改文件名为:thinkphp。
phpstudy.zip 下载之后,解压得到:phpStudy2014.exe,manual.chm,使用说明.txt 等文件,请双击打开解压到D:\phpstudy 即可,
完成之后,phpstudy会自动开启mysql,apache系统服务,此时可用360加速求查看正在运行的服务
双击打开桌面上的 phpstudy 图标,即可开启php运行环境。
如果 你的 apache mysql 显示红色按钮,那么表示没有启动成功,请点击 启动或者重启 按钮,直到全部绿色为止。如果一直启动不了。这是属于apache mysql系统服务器异常, 请尝试使用注册表清理软件清理之后,再重新解压phpstudy 软件。
完成以上步骤之后,phpstudy+php源码 基础情况已经OK,接下来 进行 部署代码 和 运行代码。
把前面的源码文件夹thinkphp 复制到D:\phpStudy\WWW 下
根据如下图。点击:My HomePage ,我们打开网站根目录和mysql数据库(点击:phpMyAdmin)。
欢迎使用 ThinkPHP!
版本 V3.2.3
那么表示 部署成功
之后,您可以通过修改 D:\phpStudy\WWW\thinkphp 目录下的 php文件代码,实现php程序 的运行。
7
【10】,如果您的程序是需要连接mysql数据库的,那么您必须创建相应的数据库。
(1)首先是登录
( 2 ) 接着是创建数据库
(3)一般的程序有安装程序,根据安装步骤,再数据库安装环节,填写下图中提到的用户名 密码 数据库名即可
Ⅲ 易语言多线程快速访问网页不出错,且没有内存错误的源码!
全局变量写入的时候使用 许可证来处理。多线程里只要是程序集或者全局的变量要修改都要用进入许可区处理,否则多线程 读取变量错误后就崩溃啊
还有就是多线程访问的时候和网络情况有关,网速不好会出现获取内容丢失,需要加判断重新获取,否则最后得到的数据不全。