最近打算再看一遍UGUI源码。发现还是有些茫然无绪。
在突然面对大量 官方源码/他人代码 时,大多数人恐怕都是这样。
所以,了解或探究 “如何科学地阅读源码?” 是有意义的!
零、准备。
1、明确自己阅读源码的原因。能解决自己的问题。
2、戒急戒躁,做好长期阅读的准备。
3、黑盒体验,重度使用、熟读文档。明白系统需求、痛点、重点、难点。
4、做好笔记、总结。可以纳入版本管理,长期注解保存。
5、疑问点可以自己动手实例验证、调试。
一、从整体出发
1、看类设计
①、 利用 VS的 类设计器 直接生成类图。
可以查看到,系统中存在哪些类?
类的字段、属性、方法以及嵌套类型有哪些?
类的继承关系是怎么样的?
类分别实现了哪些接口?
等等。。
② 、自己手动按功能绘制局部类图。
注意!类设计器也只是罗列了类的基本关系,并没有指明类间的具体交互关系(如 组合/聚合/关联等)。
(事实上这很复杂,几乎不可能在一张图上展示全部)
想要确定类的关系,必须按功能绘制局部类图。
步骤:“确定待研究功能点 => 寻找关键类 => 确定类之间的关系 => 画出类图”。
2、看接口设计
对于整个程序系统,有哪些接口?接口可以按功能分为哪些组?
对于每组接口,这组接口制定了怎样的规范?这组接口要实现怎样的功能?
对于每个接口,谁实现了这个接口?谁调用了这个接口?
3、从接口或抽象父类开始
通常,接口或抽象父类定义了其子类的行为规范,子类也正是围绕着这些行为规范填充具体逻辑。
可以认为 接口和抽象父类是骨骼,而子类就是附与骨骼之上的皮肉。
所以对于接口和抽象父类,一定要理解透彻。否则接下来看子类时可能会看得迷迷糊糊不知所云。
二、如何看具体类
可以看核心类(重点)、看独立的类(简单明确)、看关心的类(带着目的)。
打开一个类文件,一定要先把代码全部折叠!先浏览类的所有成员,对类有一个整体认识。
------------------------- NRatel割 -------------------------
对于每个类的成员,都要注意其修饰符。
成员属于类还是对象?(静态修饰符 static)
成员的访问等级是怎样的?(访问性修饰符 public/private/protected/internal/protected internal/private protected)
成员的扩展性是怎样的?(扩展性修饰符 sealed/abstract/virtual)
1、看类的字段
对于一个实体类,字段是类的核心,类通过行为修改字段,又通过字段影响行为,类在序列化后也会只剩字段。
要看类中有哪些字段?
对于每个字段,字段存储了什么类型的数据(字段类型)?字段可能的功能是什么(根据字段名猜测)?字段在何处被赋值和使用(验证字段功能)?
2、看类的属性(字段的set/get访问器)
这是理解类字段含义的重点。
------------------------- NRatel割 -------------------------
属性具有许多用途:(摘自 C#官方文档属性部分)
① 、可以先验证数据,再允许进行更改;
②、可以在类上透明地公开数据,其中数据实际是从某个其他源(如数据库)检索到的;
③、可以在数据发生更改时采取措施,例如引发事件或更改其他字段的值。
3、看类的生命周期方法
主要看类在其生命周期的各个阶段做了什么?
包括构造函数、析构函数、Unity的生命周期函数、重写的父类的生命周期方法。
4、看类重写的父类的方法。
5、看类实现的接口。
6、看类的常规方法
先看暴露给外部的public方法。再看自身细节private方法。
7、看类的关联类
了解关联类具备怎样的功能?
看关联类如何与本类协作?
看关联类与本类共同实现了怎样的功能?