用户投稿 I Eagle + PlantUML,轻松绘制源代码图表(下)

By

快速掌握大型代码文件的对象框架结构及各对象之间的调用关系,我们通常会用到类图和时序图。如何快速理解代码,并生成 UML 图表呢?

网友“车到山前必有路” 前阵子使用 Eagle 辅助画图。仅用了半个小时,就完成了一张类图和一张时序图的绘制。要知道这在过去有可能会消耗掉一个专家级软件工程师一整天甚至更多的时间

上周我们分享了“车到山前必有路” 用户投稿 I Eagle + PlantUML,轻松绘制源代码图表(上)

本周继续推送下篇,一起聊聊如何用 Eagle 辅助绘制时序图?

以下来自热心用户“车到山前必有路”的分享,原文略作修改

什么情况下会用到类图和时序图?

‌在了解面向对象编程的源代码时,我们经常会用到 UML 中的 Class Diagram(类图)和 Sequence Diagram(时序图)。

通过类图,我们可以清晰地了解不同对象之间的关系,比如继承、聚合和组合关系,这样就能快速掌握大型代码文件的对象框架结构,加快对代码原理的理解。

类图绘制文章详用户投稿 I Eagle + PlantUML,轻松绘制源代码图表(上)

而当我们搞不清楚对象之间方法的调用关系时,就很难正确掌握对象的使用方法,遇到问题也难以定位,这时候时序图就派上用场啦!

Eagle + PlantUML 实战,绘图效率翻倍

‌Eagle https://eagle.capitalren.com 支持基于自然语言的代码搜索,可解读项目整体框架、剖析深度原理、拆解技术实现路径,还能助力代码审查和编程辅助。

PlantUML https://www.plantuml.com/plantuml/uml 是一个开源的绘图工具,帮助用户创建各种类型的 UML 图表。

用 Eagle 生成代码,再将代码粘贴到 PlantUML 进行绘图。Buff 叠满,绘图原来如此简单!

时序图绘制

我们用一个较为复杂的 ORM/SOA/MVC 开源框架 m0RMot 的源代码来举例,这个源代码还是用 Pascal 语言写的,我们来考考 Eagle 对上古编程语言的理解能力。

开源项目地址:https://github.com/synopse/mORMot2

我们聚焦到一个具体源代码上:

https://github.com/synopse/mORMot2/blob/master/src/core/mormot.core.threads.pas

这是 mORMot 框架源代码中用来支持多线程能力的库,代码行数适中 3500 多行,但对象种类比较多。我们希望通过 Eagle 来掌握一下对象之间的调用关系,这时我们就需要绘制时序图。

接下来我们聚焦到 mormot.net.client.pas 和 mormot.net.sock.pas 两个源文件,我们借助 Eagle 来了解一下框架下基本的 HTTP Request 使用方法和内部实现细节。

首先我们从这里入手:

Round 1 ——  从 IHttpClient 入手

提问:举例介绍下 mormot.net.client 中的 IHttpClient 的主要用法

Round 2——了解 TSimpleHttpCient

通过举例,我们了解到了 IHttpClient 的实现对象为 TSimpleHttpClient。接下来我们深入了解一下这个类。

提问:介绍一下 TSimpleHttpClient 的主要属性和方法

Round 3—— fHttp 和 fHttps的依赖注入

提问:TSimpleHttpClient 中有两个私有属性 fHttp 和 fHttps,他们来承载真正的 HTTP Request 的动作,那么这两个对象是在哪个方法中被具体确定并赋值的?结合源代码进行说明。

Round 4—— 发现 RawConnect

通过以上分析我们得知 ,fHttp: THttpClientSocket 和 fHttps: THttpRequest 不是在构建函数中 Create 被创建的,而是在 TSimpleHttpClient.RawConnect 方法中被最终确定和创建的。这也是一种 Dependency Inject (DI) 依赖注入的方式 。根据你给出的代码和分析 ,fHttps := MainHttpClass.Create(…) 而 fHttp := THttpClientSocket.OpenOptions(…) 创建的 。

请回答 :MainHttpClass.Create 这种方法显然也是一种依赖注入的方式 ,那么 MainHttpClass  可以是哪几种类 /  对象呢 ?

Round 5 —— MainHttpClass 的依赖注入

提问:结合 THttpRequest源代码给出 MainHttpClass 在什么时候或在什么条件下被具体确定下来是哪种具体形态的?

Round 6 ——了解 THttpClientSocket

以上了解了 TSimpleHttpClient 实现 fHttp的方法,以及最终实现 TWinHttp,TWinINet,TCurlHttp的依赖注入的方法。接下来,我们了解一下 fHttps:THttpClientSocket 的实现细节。

提问:THttpClientSocket 的多层继承关系是什么?

Round 7 —— TLS/SSL

提问:结合源代码 ,列出 THttpClientSocket 及其父类当中跟 TLS/SSL 相关的属性有哪些?

Round 8 —— fSecure 的依赖注入

提问:fSecure既然是一个 INetTls 接口,结合源代码给出 fSecure 是 由谁创建的 ?

Round 9 —— 全局工厂函数 NewNetTls

提问:fSecure 既然是通过全局工厂函数 NewNetTls 创建的,那么结合源代码说明NewNetTls 是如何决定使用 OpenSSL 或 SChannel 作为 TLS 层的?这又是依赖注入的一种表现

Round 10 —— 绘制时序图

提问:下面结合以上问你的问题的答案,使用 PlantUML 语法,描述一下使用 TSimpleHttpClient 访问 https://z.cn的全过程,假设我们使用 HttpClientSocket 对象作为实现层,请在图中表现出 fSecure 的赋值过程,即如何判断使用 OpenSSL 或 SChannel 实现层的

最终效果,将上述PlantUML 代码复制到下面这个网址进行渲染:https://www.plantuml.com/plantuml/duml/,  最终得到如下时序图:

掌握了 Eagle 绘图的关键步骤,轻松完成时序图的绘制。

如果你也是在开发第一线冲浪的程序员,强烈推荐你关注 视频号:码力一哥

这里有最前沿的 AI 资讯和 AI 工具使用小技巧,不定期干货直播与大咖老师线上直接交流。助力程序员工作提效,升职加薪不再难!

程序员的 AI 提效神器

我们的网址:eagle.capitalren.com