动机
最近开始阅读项目源码,从其中一个模块开始看,奈何大项目中的一个模块,对于萌新而言,也太过于复杂。类和类之间的继承,接口的定义及回调时机,各种设计模式下的逻辑跳转。。。随着代码不断跟踪,回过头来已不知身处何处。因此想着,能把大致的类图框架绘制出来,在此基础上学习,无论是帮助自己理清逻辑,还是对于讲来给他人讲解都大有帮助,那么,开始UML吧!
UML介绍
统一建模语言(英语:Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言。UML是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。
UML类图基础
首先需要说明的是,UML可以干很多事,画各种各样的逻辑图,这里只关心它在类图中的使用。
下图是一个典型的类图,包括类名,类中有的属性和方法,也展现了响应的访问级别(虽然不是必需的):
当多个类图放置在一起时,通过各种连接线将类图之间的关系表示出来,就表达出了我们需要的类的结构信息,典型如下图:
上图每个类做了简化,只体现出其类名,我们重点关注的是类和类之间的连接。 图中有6中连接线,一般可以表达我们常见的类和类之间的关系。 标准的连接线内涵的定义可见此:http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html 这里我结合网上的说明,简化一下表达而更好的用于Java类图当中。
空心箭头实线: 表示类A继承于类B
空心箭头虚线:表示小汽车和自行车实现了“车”这个接口
带方向的实线: 表示A中具有B这个成员变量
带方向的虚线:表示A中的一般方法需要B作为传入参数
空心棱形实线: 表示B中的构造方法(或set方法)需要A作为传入参数
实心棱形实线: 表示B中构造函数中将A进行了实例化
OK,六种基本线的涵义大致如上,可能有偏差,具体还是以UML的定义为准,这里只是为了更好的理解和使用。
UML类图的绘制
Talk is easy, show me the code.
绘制UML类图的工具有很多,在线的、本地的、收费的、免费的。本文中使用的绘制UML类图的,是PlantUML,这实际上是一个java类库,能够将代码转化成UML类图。 因此我们绘制UML的过程,实际上就是一个编写代码的过程,相比于拖动控件,更为适合程序员?。? 在Android Studio中,需要做的准备有:
- 在file --> settings --> plugins中搜索UML,搜索结果中安装plantUML插件,重启AS;
- 安装plantUML绘图的依赖库,大名鼎鼎的贝尔实验室开发的一个工具包:Graphviz;
详细的安装请参考:http://blog.csdn.net/u013831257/article/details/50118461
PlantUML的使用
先来一幅图看看效果:
上图就是利用PlantUML代码编写的UML类图。实际上,PlantUML的语法非常简单,和Markdown语法有的一比。 先贴代码,然后分析:
Fragment <|-- BillMainFragment
class BillMainFragment{
+{static}CategorySelectorState
+{static}CategorySelectorChangeEvent
#ViewPager;
#DataSelectView;
}
ViewPager <--> DataSelectView
CategorySelectorState --> BillModule
BillMainFragment --> MonthPagerAdapter
BillMainFragment --> YearPagerAdapter
BillMainFragment --> CustomPagerAdapter
CalendarModel <|.. MonthPagerAdapter
CalendarModel <|.. YearPagerAdapter
CalendarModel <|.. CustomPagerAdapter
MonthPagerAdapter --|> FragmentStatePagerAdapter
YearPagerAdapter --|> FragmentStatePagerAdapter
CustomPagerAdapter --|> FragmentStatePagerAdapter
讲道理,自己对着代码和类图看看就能明白,这里大概总结一下:
- (“>")代表方向箭头,("--")代表实线,("..")代表虚线,("|>")代表封闭的空心箭头,(”*“)代表实心棱形,(”o“)代表空心棱形
- 箭头具有方向行,代码中的箭头方向和类图中的会保持一致
- 两端都可以有箭头或者其他标志,可以自由组合,试试就清楚
- 可以定义类,用class关键字;也可以不定义直接使用
- 相同名字的类会被认为是同一个
- 可以用+、#、-、等来定义一个类中的访问控制
- 代码中的先后顺序和绘制图中的顺序没有必然联系
-
更多的还是要参看plantUML的语法,本文中没有使用到更多的语法,附件里有plantuml的语法书
总结
内容不多,希望提供一个指引作用,要了解的更多还是使用一下就好。使用代码生成的好处是能更理解类之间的关系,但是坏处是当类关系复杂时,画出的UML类图不能排版, 特别乱。
工欲善其事,必先利其器。
画好UML类图后,再去看源码,再也不怕迷路了。
修改1
发现更简单的编写方式,class A extends B implements C plantUML支持这种写法!可以自动绘制类A、类B、接口C并生成连接关系!