代碼分析與自動化重構工具集:Modernizing(代碼結構分析工具)

遺留系統的現代化演進是一門藝術。

Why 開源 遺留系統現代化工具

在日常的軟件開發里,我們經常會遇到一系列的問題,諸如于:

  • 如何解決人類智商不夠的問題?模式、原則和工具

  • 誰應該去解決代碼的問題?代碼

  • ……

應對于這些問題,其中的一個解決方案就是:自動化的工具,有些人喜歡稱之為。支撐這些工具的便是一系列的原則模式,將它們融入到工具之中。另外一個解決人成長的方案就是:元元(meta-meta),這是另外一個故事。

遺留系統是常態。多數時候,我們所遇到的系統里多數是遺留系統,來到一個新項目時,可能就需要對他們快速的分析,以提供洞見 —— 寫 PPT 匯報。所以,在過去的幾年里,咨詢團隊也沉淀了一系列的遺留系統分析和重構的工具,比如新哥的 Tequila、正在開源的架構分析和守護工具 ArchGuard 等等。除此,在有些重構項目里,還要編寫定制的工具來進行分析。

技術熱情發電。主要的挑戰是,我們需要拿自己的業余時間來完善工具。

既然要用自己的時間來開發,還和項目沒有關系,這種用愛發電的事情,用開源的方式最合適了。

我們需要怎樣的工具?

從對于使用工具的結果來看,我們需要這個現代化工具是:

  • 可視化驅動??焖偕身椖康姆治鼋Y果,并展示出來給開發人員了解現狀,還有編寫 PPT。

  • 必要的交互性。用于在重構的過程中,尋找合適的切入點。

  • 定制化開發。

    • 特定壞味道。不同的開發團隊會有不同的壞味道,有些壞味道是無法由 Sonarqube 這樣的工具識別的。

    • 自動化重構。基于已知的壞味道,對應的代碼位置信息,對代碼進行自動化重構。

  • 適當的語法精準度。更高的語法精準度,意味著更高的開發成本,需要有針對地平衡它們。

  • 多平臺。我們用的是 macOS,而多數時候,客戶使用的是 Windows。

如何開發這樣的工具?

這里定義的遺留系統現代化工具包含了這么幾部分:語法分析、結果及可視化、自動化重構、架構守護。

代碼分析與自動化重構工具集:Modernizing(代碼結構分析工具)

語法分析

對代碼進行語法分析,生成特定的語言的數據結構。常用的工具有:Antlr、Ctags、TreeSitter、Doxygen、CodeQuery 等。一個大致的對比(拍腦袋訂的)如下表所示:

代碼分析與自動化重構工具集:Modernizing(代碼結構分析工具)

結果及可視化

通常來說,我們會出于以下的一些情況,來對遺留系統進行可視化:

  • 數值化。如針對于特定的 smell 進行自動化重構,類似于 Sonarqube,常見的模式和原則源自于《重構》一書。在 Coca 里,還引入了在一些論文里看到了測試的 bad smell,諸如于沒有斷言的測試等。

  • 可視化依賴。如針對于代碼中的類、包等的依賴情況進行可視化,主要用于分析分層架構等。常用的工具有:PlantUML、Graphviz、D3.js、Echarts 等。

  • 代碼屬性可視化。如針對于文件的修改頻率、大小等屬性進行可視化,可以獲取諸如于單位時間內的文件變化頻率。一個文件經常修改,還大量被引用,那說明它是一個不穩定的類、文件,除了業務變化,最有可能就是設計不合理。

  • 其它。

自動化重構

這一步是可選的,它取決于我們的場景。通常來說,編寫這樣的功能主要彌補是現代化的 IDE 無法完成的工作,諸如于:

  • 多代碼庫間的未使用類刪除。

  • 多代碼庫間的聚類。

  • 針對于 CSS 顏色的重構。

架構守護

編寫架構的守護規則,以對于系統的架構進行守護,用的工具有:ArchUnit、ArchGuard 等。在參考了 ArchUnit 的語法之后,我們也設計了一個多語言的架構守護工具:Guarding。

在開發這些工具的過程中,它們也不斷地 push 著我進一步學習語言背后的東西,如編譯原理(語言的前端部分),理解構建系統(build system)等。

遺留系統現代化工具集

為了更有針對性地對遺留系統進行現代化,最近我們創建了一個新的組織:Modernizing,集合了先前開發的一系列工具。并創建了:awesome-modernization 用于對其它的一系列相關的工具進行收集。

在 Modernizing 里,針對于單個編程語言的工具有:

  • 針對于 Java 語言的系統重構、系統遷移和系統分析的工具:Coca,Go 語言,GitHub stars:691。Coca 是一個“全功能”的重構工具,基于 Antlr 進行語法分析的,除了常規的可視化、調用分析,還可以進行自動化重構。Coca 一名的由來是:對標新哥寫的 Tequila —— 龍舌蘭酒 vs 快樂水。

  • 針對于 CSS/LESS/CSS 的分析和自動化重構工具:LemonjTypeScript 語言,GitHub stars:128。當時設計的主要目的是:用來對 CSS 中的顏色進行提取,基于 Antlr 的語法樹分析,可以用于進行自動化的重構。

  • 針對于 MySQL 代碼進行自動化分析,并從中構建中 UML,并生成其關系的:SQLing,Go 語言,使用 PingCapSQL 解析器解析。當然了,還有一個初始化的針對于 PL/SQL 的版本:pling。

  • 適用于 Ant 轉 Maven 的半自動化工具:Merry,Go 語言 Antlr。

  • 前端規范化改造工具:Clij,用于一鍵添加 eslint、husky、lint-staged 等,TypeScript 語言。

針對于多語言的工具,我們有:

  • 基于 Antlr 的多語言的語言模型分析工具:Chapi,Kotlin 語言。其設計的初衷是用于生成 Coca 相同的數據結構,以接入更多的可視化工具。在語法分析上,采用的是 Antlr 進行分析。

  • 基于 Doxygen 的多語言分析和可視化工具:Go mod 版本的新哥的 Tequila。其中,還有一系列的迷之代碼,需要重構掉。

  • 基于 Ctags 的多語言模型分析和可視化工具:Modeling,Rust 語言。分析源碼,并生成基于模型的可視化依賴。

  • 基于 TreeSitter 的多語言架構守護工具:Guarding,Rust 語言。通過自制的 DSL,來對系統架構進行守護。

除此,還有一個在 Inherd 開源小組下開源的:Coco,它主要是通過代碼的物理屬性:修改頻率 目錄 行數來分析系統的工具。以及現在緊鑼密鼓開源中的 ArchGuard。

我們使用一系列不同的語言和工具來開發這些軟件,因為不同的場景之下,都會有不同的選擇。

下一步?

現有的工具都是分散的,不同工具之前的數據格式不盡相同,缺乏統一的數據格式。在輸出格式不統一時,我們就難以進行標準的可視化,諸如于我們正在構建 codecity 用于在元宇宙里,對遺留系統進行可視化,又或者是正在從 ArchGuard 中拆分的前端可視化部分,以用于復用。理想的情況下,它應該像是一個 pipeline 架構的系統,由一系列的 pipe 和 filter 所構成。

歡迎訪問我們的 GitHub:https://github.com/modernizing

也歡迎成為這一系列工具的核心開發者 ~ 。

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

(0)
上一篇 2022年5月29日 上午9:39
下一篇 2022年5月29日 上午9:48

相關推薦

视频在线观看一区二区三区| 看黄软件免费看在线观看| 成人毛片无码一区二区三区| 亚洲免费观看在线视频| 欧美一区二区三区四区视频| 伊人久久精品无码麻豆一区| 绿巨人黑科技地址入口| 国产AV人人夜夜澡人人爽麻豆 | 红楼遗梦成人h文完整版| 国产1000部成人免费视频| 精品久久久久久无码专区不卡| 又黄又爽的视频免费看| 美女黄18以下禁止观看| 国产99re在线观看只有精品| 精品久久久久久久久久中文字幕| 再深点灬舒服灬太大了快点h视频 再深点灬舒服灬太大了添a | 国产精品国三级国产av| 黄+色+性+人免费| 国产在线视频网站| 美女教师一级毛片| 午夜网站免费版在线观看| 爱情岛论坛亚洲永久入口口| 午夜在线社区视频| 浪潮AV色综合久久天堂| 亚洲激情综合网| 日韩高清在线高清免费| 亚洲免费色视频| 日本熟妇人妻xxxxx人hd| 久久青青草原国产精品免费| 日本一区二区三区不卡在线视频 | 日本免费一区二区三区最新| 久久久久久久久蜜桃| 好吊妞在线观看| 99久久婷婷国产综合精品| 在线精品国精品国产不卡| 91亚洲欧美国产制服动漫| 国产成人综合亚洲| 青青国产成人久久91| 国产国语一级毛片在线视频| 青青草国产三级精品三级| 国产一区二区三区在线看|