热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

如何阅读别人的代码

读代码这事,先要分是精读还是泛读。从学习的目的来看,一定要精读一定量的经典代码。而精读是指每行都读懂,不看代码脑子里就能勾画出程序的基本结构。这里有个很形象的状态,精读代码时会满脑子都是代码,放不下,甚至睡觉前脑子里也是代码。但这一篇里主要不是关注如何精读代码的,而是关于如何在工作中掌握既有代码的,等价于泛读。

读代码这事,先要分是精读还是泛读。

从学习的目的来看,一定要精读一定量的经典代码。而精读是指每行都读懂,不看代码脑子里就能勾画出程序的基本结构。这里有个很形象的状态,精读代码时会满脑子都是代码,放不下,甚至睡觉前脑子里也是代码。

但这一篇里主要不是关注如何精读代码的,而是关于如何在工作中掌握既有代码的,等价于泛读

现存的很多系统往往很大,几十万行的可能也只算普通。这时候一旦加入了这样一个项目,那么如何去读代码?下面说点个人体会。

读这类代码前,先得把规格大致弄清楚,而不能上来就读,比如:对于应用型程序,你要先大致整清楚它的使用方法。如果其中有涉及到领域知识,比如:流程、财会等,那也最好预先有些认识。这类东西从代码里反推回来是不太可能的。

我个人感觉这对读程序是个很大的障碍,你不知道编码规则,却去读编码的程序,总是会云里雾里,这时候反倒不是因为程序难,而是因为不知道程序中所包含的专业知识。在这一步里,最好能抽取出来几个典型的应用场景,这在后面有用。

一旦开始接触代码,那要先弄清楚代码的基本静态结构。如:包构成、类构成等。这里涉及一个层次问题。一下子把层次探的太深,就容易盯在细节上出不来。

有设计文档的项目,大致上可以通过包来界定这个层次。没设计文档的就可怕了,只能靠自己划分,最好不要超过10个,超过了真记不住。在静态结构这步,要弄清楚每个部分的核心职责,可以简单,最好能记住。

接下来就要用到上面的典型场景了。要在典型场景下考察上面的静态结构是如何发挥作用的。典型场景下用到的接口往往就是关键的接口,要整清楚,他们的定义和作用。也要整清楚,典型场景下数据流的变迁。

这步骤算是弄清楚代码的时序。很像UML里的Sequence图。但牵涉到数据的时候,一般需要对数据的规格有所了解。

接下来要关注进程、线程的结构。比如:都是什么时候开始、什么时候结束的,在上述典型场景下都负责干什么。

上述四步(规格、静态结构、典型场景、进程线程)完成后,对程序的第一次泛读完成。

检验标准很简单,这时应该能够单靠纸笔描述出程序典型场景的Sequence图。干这事儿的时候,要抑制自己的求知欲,因为总是很想在调试器里通过call?stack把一个功能的实现细节整清楚,但至少在第一个层次里,可以先不要这样。

?第一次泛读后,就要进入深掘的过程,针对的对象应该是自己会负责的部分。这部分功能往往会隐藏在某个接口之下。这时候一般来讲可以放过功能型的模块,比如:XML解析的模块等。其他部分可以认为是需要把之前所说的四个步骤再重复一下。但这时候要关注细节和调用堆栈了。

不管是在那个读代码的层次,有两个基本技巧总是需要的,一个是要掌握具体程序里内嵌的Log机制,要能看Log,必要时可能还得加Log;一个是基本调试方法。调试很难展开,《软件调试》一书写了1000多页。

但只停留在设个断点等他停下来这个层次上还是会有点欠缺的。条件断点、多线程调试、多进程时的调试还是要知道一点的。

程序类型太多,因此估计读程序的方法也很多。上面只是个人的一点经验,欢迎补充。

本文地址:http://www.nowamagic.net/librarys/veda/detail/2417,欢迎访问原出处。


推荐阅读
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 理解UML的重要性及其应用
    探讨为什么大多数开发人员难以成为架构师,介绍从现实世界到业务模型的抽象过程,并详细解释UML在软件设计中的关键作用。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • SpringMVC RestTemplate的几种请求调用(转)
    SpringMVCRestTemplate的几种请求调用(转),Go语言社区,Golang程序员人脉社 ... [详细]
  • ListView简单使用
    先上效果:主要实现了Listview的绑定和点击事件。项目资源结构如下:先创建一个动物类,用来装载数据:Animal类如下:packagecom.example.simplelis ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • 本文详细介绍如何使用 Python 集成微信支付的三种主要方式:Native 支付、APP 支付和 JSAPI 支付。每种方式适用于不同的应用场景,如 PC 网站、移动端应用和公众号内支付等。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 优化Jenkins首次启动速度
    本文详细描述了在启动Jenkins后遇到的长时间加载问题,并提供了一种通过修改更新中心配置文件来显著提升启动速度的有效解决方案。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了 Android 开发中 layout_gravity 属性的使用方法及其在不同布局下的效果,旨在帮助开发者更好地理解和利用这一属性来精确控制视图的布局。 ... [详细]
  • 本文探讨了如何在Java中使用JAXB解组两个具有相同名称但不同结构的对象。我们将介绍一个抽象类Bar及其具体实现,并展示如何正确地解析XML文档以获取正确的对象实例。 ... [详细]
  • Python3 中使用 lxml 模块解析 XPath 数据详解
    XPath 是一种用于在 XML 文档中查找信息的路径语言,同样适用于 HTML 文件的搜索。本文将详细介绍如何利用 Python 的 lxml 模块通过 XPath 技术高效地解析和抓取网页数据。 ... [详细]
  • springMVC JRS303验证 ... [详细]
author-avatar
仰望天空TL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有