遺留系統重構工具:Coca

好的代碼是能夠重構出來的。java

如我在先前的文章所說,我最近的工做主要是在作架構重構、代碼重構。因此,一如既往地,我又寫了個工具來幫助我完成相關的工做。這樣一來,下次我能夠更快速地完成相關的工做。git

在這以前,已經有大量的工具能夠作相似的事情。如我司已有大佬開源了 Tequila ( github.com/newlee/tequ… ) 這樣的架構、依賴分析工具。只是呢,簡單的架構分析是沒法知足個人需求的。而且,本着寫了工具就是賺經驗的思想,我決定寫一個本身的工具。github

Coca 簡介

從按個人實踐經驗來看,我將重構分爲四種類型:spring

  • 分層架構重構。 在不改變業務邏輯的狀況下,進代碼架構進行調整。即根據單一職責和依賴倒置原則的思想,對系統進行模塊拆分與合併,以明確職責下降耦合度;對包進行從新規劃,劃分包之間的邊界,減小代碼間的耦合。
  • 模式重構。針對特定模式的壞味道,採用設計模式來提高可擴展性,增長可讀性。
  • 模型重構。在包含測試的狀況下,經過識別和發現模型的行爲,將行爲聚合到模型中。
  • 微重構。對於一些小的代碼壞味道,能夠經過 IDE 重構來快速改善即有代碼,而不會影響到業務功能。

而《重構:改善既有代碼的設計》一書主要針對的是微重構。由於重構項目的難度不是通常的大,對於經驗不足的我的、團隊來講,重寫每每比重構來得便捷。json

因此,根據個人須要我寫了本身的工具,以用於改善即有代碼的設計:後端

Coca 是一個用於遺留系統重構的瑞士軍刀。它能夠分析代碼中的 badsmell,行數統計,分析調用與依賴,進行 Git 分析,以及自動化重構等。設計模式

GitHub 地址:github.com/phodal/cocaapi

安裝:bash

  1. go get -u github.com/phodal/coca
  2. 直接從 GitHub 上下載可執行文件

在執行全部的命令以前,須要先執行 coca analysis 以生成對應的依賴關係數據。markdown

So,讓咱們看看 Coca 1.0 包含了哪些功能?

API 調用

這個功能目前主要針對的是 Spring 開發的,它彷佛已是 Java 世界的後端服務的標準。

REST API 生成

只須要執行 coca api 就能夠生成咱們想要的結果:

  1. 函數調用圖
  2. API 調用層級

下圖是 API 的統計信息:

SIZE METHOD URI CALLER
36 GET /aliyun/oss/policy controller.OssController.policy
21 POST /aliyun/osscallback controller.OssController.callback
17 GET /subject/list controller.CmsSubjectController.getList
17 GET /esProduct/search search.controller.EsProductController.search
17 GET /order/list controller.OmsOrderController.list
17 GET /productAttribute/list/{cid} controller.PmsProductAttributeController.getList
17 GET /productCategory/list/{parentId} controller.PmsProductCategoryController.getList
17 GET /brand/list controller.PmsBrandController.getList
17 GET /esProduct/search/simple search.controller.EsProductController.search

對應的全景圖:

固然了,你也能夠輕鬆經過參數過濾一下你想要的內容。

這個功能的目標是用於將來向 DDD 重構時,構建出限界上下文。

調用關係圖

也能夠只看某一部分的依賴關係圖:

coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
複製代碼

輸入對應的完整方法名,和想要去除的包含便可:

反向依賴關係圖

還能生成對應的反向調用關係圖:

coca rcall -c org.bytedeco.javacpp.tools.TokenIndexer.get
複製代碼

結果以下圖所示:

行爲分析

因爲代碼只是反應系統的另外一部分,咱們不得不從版本管理工具中獲取更多的信息,因而有了:

coca git
複製代碼

文件修改統計

排名靠前的文件,能夠幫咱們看到一些問題:coca git -t,因而乎,咱們就有了:

ENTITYNAME REVSCOUNT AUTHORCOUNT
build.gradle 1326 36
src/asciidoc/index.adoc 239 20
build-spring-framework/resources/changelog.txt 187 10
spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java 170 10
spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java 159 15

對,這是 Spring Framework 中最常修改的文件,前面三個文件看上去是合理的,可是 AnnotationUtils.java 顯然有問題。

對應的 DefaultListableBeanFactory.java 也有 2000+ 行左右的規模。

從代碼的行數和修改次數來看,它們都是上帝類,而且常常出現 Bug。

代碼年齡統計

嗯,還有諸如於 coca git -a 這樣的普通功能:

+-------------------------------------------------------------------------------------------------------------------------+-------+
|                                                       ENTITYNAME                                                        | MONTH |
+-------------------------------------------------------------------------------------------------------------------------+-------+
| helloworld.go                                                                                                           |  2.04 |
| README.md                                                                                                               |  2.04 |
| imp/imp.go                                                                                                              |  2.04 |
| .gitignore                                                                                                              |  2.01 |
| cmd/root.go                                                                                                             |  2.01 |
| test/coca_suite_test.go                                                                                                 |  1.94 |
| learn_go_test.go                                                                                                        |  1.94 |
| core/languages/java/JavaLexer.tokens                                                                                    |  1.84 |
| core/languages/java/java_lexer.go                                                                                       |  1.84 |
| examples/step2-Java/domain/ValueObjectD.java                                                                            |  1.84 |
複製代碼

其它功能

還有諸如基本的分析功能等: coca git -b

+-----------+--------+
| STATISTIC | NUMBER |
+-----------+--------+
| Commits   |    350 |
| Entities  |    514 |
| Changes   |    255 |
| Authors   |      2 |
+-----------+--------+
複製代碼

有興趣能夠本身去探索。

知識提煉

嗯,這也是我計劃在明年實踐的功能。

方法提取

做爲此功能的第一步,我想的是先從代碼中提取單詞:coca concept

+------------------+--------+
|      WORDS       | COUNTS |
+------------------+--------+
| context          |    590 |
| resolve          |    531 |
| path             |    501 |
| content          |    423 |
| code             |    416 |
| resource         |    373 |
| property         |    372 |
| session          |    364 |
| attribute        |    349 |
| properties       |    343 |
| headers          |    330 |
+------------------+--------+
複製代碼

做爲第一個簡單的版本,我只是作了分詞和統計,下一步即是專業性的統計。然後,用於生成領域專用的特定語言。

提交信息提取

你懂的,這裏面的信息纔是足夠的豐富。

TBD

提取中文註釋

下一步,我應該作相似的事情,哈哈哈

壞味道識別

這是一個很是通用的功能,你能夠在各類各樣的工具裏找到。因此,我並無特地地去加強裏面的功能,也沒有添加太多的功能——由於我知道他們比個人工具專業。

只須要:coca bs 就會獲得一個建議修改的 JSON 文件:

{
   "lazyElement": [
      {
         "File": "examples/api/model/BookRepresentaion.java",
         "BS": "lazyElement"
      }
      ...
   ]
}
複製代碼

結合我寫的 fanta 工具,能夠生成對應的修改建議。

批量重構

主要是用於結合上述工具的分析結果,經過人工 + 智能的方式來實現批量化自動修正。

當前 API 處於試驗階段,請不要在生產環境使用。支持如下功能:

  • 批量重命名
  • 批量移動文件
  • 批量刪除未使用的 import
  • 批量刪除未使用的類

使用的方式也很是簡單:

coca refactor -m move.config -p .
複製代碼

你能夠試試,哈哈

代碼統計分析

代碼統計工具,採用的是 SCC:

scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go

愉快地: coca cloc,而後:

───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
Go                          58     31763     7132       890    23741       2847
Java                        44       971      208        21      742         62
Markdown                     8       238       75         0      163          0
Gherkin Specificati…         2        32        2        16       14          0
Document Type Defin…         1       293       36         0      257          0
License                      1       201       32         0      169          0
SQL                          1         2        0         0        2          0
SVG                          1       199        0        34      165          0
Shell                        1         3        1         1        1          0
XML                          1        13        0         0       13          0
gitignore                    1        61        8         4       49          0
───────────────────────────────────────────────────────────────────────────────
Total                      119     33776     7494       966    25316       2909
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop $803,822
Estimated Schedule Effort 14.120551 months
Estimated People Required 6.743156
───────────────────────────────────────────────────────────────────────────────
複製代碼

其它功能能夠見 scc 工具的官方文檔。

重構適合度評估

TBD

其它

這是我第一個使用 Golang 寫的工具,但願個人用法足夠的 Go Style。

首頁:coca.migration.ink/

GitHub 地址:github.com/phodal/coca

愉快地:go get -u github.com/phodal/coca

相關文章
相關標籤/搜索