好的代碼是能夠重構出來的。java
如我在先前的文章所說,我最近的工做主要是在作架構重構、代碼重構。因此,一如既往地,我又寫了個工具來幫助我完成相關的工做。這樣一來,下次我能夠更快速地完成相關的工做。git
在這以前,已經有大量的工具能夠作相似的事情。如我司已有大佬開源了 Tequila ( github.com/newlee/tequ… ) 這樣的架構、依賴分析工具。只是呢,簡單的架構分析是沒法知足個人需求的。而且,本着寫了工具就是賺經驗的思想,我決定寫一個本身的工具。github
從按個人實踐經驗來看,我將重構分爲四種類型:spring
而《重構:改善既有代碼的設計》一書主要針對的是微重構。由於重構項目的難度不是通常的大,對於經驗不足的我的、團隊來講,重寫每每比重構來得便捷。json
因此,根據個人須要我寫了本身的工具,以用於改善即有代碼的設計:後端
Coca 是一個用於遺留系統重構的瑞士軍刀。它能夠分析代碼中的 badsmell,行數統計,分析調用與依賴,進行 Git 分析,以及自動化重構等。設計模式
GitHub 地址:github.com/phodal/cocaapi
安裝:bash
go get -u github.com/phodal/coca
在執行全部的命令以前,須要先執行 coca analysis
以生成對應的依賴關係數據。markdown
So,讓咱們看看 Coca 1.0 包含了哪些功能?
這個功能目前主要針對的是 Spring 開發的,它彷佛已是 Java 世界的後端服務的標準。
只須要執行 coca 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 處於試驗階段,請不要在生產環境使用。支持如下功能:
使用的方式也很是簡單:
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。
GitHub 地址:github.com/phodal/coca
愉快地:go get -u github.com/phodal/coca