A picture is worth a thousand words.

我们在阅读博客和文档的时候,通常倾向于阅读配有图形的这些文章。如果一篇技术类文章从头到尾都是文字,将十分影响读者的阅读体验, 也不便于读者理解。还有我们在进行一些项目源码分析时,边阅读代码,边绘制一些图形能够极大的提升效率,同时也能加强自己理解。 这片博文我将介绍我是如何绘制调用图'类图'(不是面向对象语言中的类图)帮助自己更好地理解Golang项目的。

Golang目前还没有关于调用图和类图的官方标准,有一些工具能够静态分析能够生成项目调用图和类图,不过也不是很成熟。 而且自动生成的图形美观性很差,也不便于调整。不过这些工具定义了一些如何可视化Golang元素的规则, 我借鉴了这些规则,同时结合UML类图的语法定义,形成了一套规则。

go-callvis

go-callvis是用于可视化 Go 程序之间的调用拓扑和包关系的的开发工具。 这个库定义了一些规则,用于统一的表示Golang项目元素。

Golang 代码元素及规则

规则目前参考 go-callvis

Package/Type

大型项目中结构很复杂,这时候我们只需关注核心的包和类型。

类型(Represent) 样式(Style)
业务核心(focused) 自定义颜色
标准库(stdlib) green color
其他(other) yellow color

Method/Function

类型 样式
公开(Exported) 边框加粗
私有(UnExported) 正常边框
匿名(anonymous) 虚线边框

Calls

类型 样式
内部调用 黑色线
外部调用 棕色线
静态调用 实线
动态调用(接口) 虚线
正常调用 简单箭头
并发调用 箭头加愿
延迟调用 箭头加菱形

例子

下图是分析kubernetes项目对象校验的调用图。其中我们只关注apiserver/registry/rest,pkg/registry, pkg/apis这三个包, 所以这些包的颜色我们自定义为白色,而apimachinery这个库我们不需要关注,所以标记为黄色。

总结

关于绘图工具,我是通过draw.io在线工具进行绘图的,后续我会开发一个draw模板给大家使用,当然你也可以使用自己喜欢的工具, 自己定义这些规则。关键是形成统一的规则,这样可以降低不同开发者之间的成本。

参考

  1. PlantUML 快速绘制语法定义