README.md 13.9 KB
Newer Older
P
Phodal HUANG 已提交
1
# Coca
P
Phodal HUANG 已提交
2

P
Phodal Huang 已提交
3
[![Build Status](https://travis-ci.org/phodal/coca.svg?branch=master)](https://travis-ci.org/phodal/coca)
P
Phodal Huang 已提交
4 5
[![Maintainability](https://api.codeclimate.com/v1/badges/d5a5e060522403b1f79b/maintainability)](https://codeclimate.com/github/phodal/coca/maintainability)
[![codecov](https://codecov.io/gh/phodal/coca/branch/master/graph/badge.svg)](https://codecov.io/gh/phodal/coca)
P
Phodal Huang 已提交
6

P
Phodal Huang 已提交
7 8
> Coca 是一个用于遗留系统重构的瑞士军刀。它可以分析代码中的 badsmell,行数统计,分析调用与依赖,进行 Git 分析,以及自动化重构等。

P
Phodal Huang 已提交
9 10 11 12 13 14 15
重构的四级模型:

 - **分层架构重构**。 在不改变业务逻辑的情况下,进代码架构进行调整。即根据单一职责和依赖倒置原则的思想,对系统进行模块拆分与合并,以明确职责降低耦合度;对包进行重新规划,划分包之间的边界,减少代码间的耦合。
 - **模式重构**。针对特定模式的坏味道,采用设计模式来提升可扩展性,增加可读性。
 - **模型重构**。在包含测试的情况下,通过识别和发现模型的行为,将行为聚合到模型中。
 - **微重构**/**代码重构**。对于代码中的坏味道,可以通过 IDE 重构来快速改善即有代码,而不会影响到业务功能。

P
Phodal Huang 已提交
16 17 18 19
## Usage

install 

P
Phodal Huang 已提交
20
```bash
P
Phodal Huang 已提交
21
go get -u github.com/phodal/coca
P
Phodal Huang 已提交
22 23
```

P
Phodal Huang 已提交
24 25
help:

P
Phodal Huang 已提交
26
```bash
P
Phodal Huang 已提交
27 28 29
Usage:
  coca [command]

P
Phodal Huang 已提交
30

P
Phodal Huang 已提交
31 32 33
Available Commands:
  analysis    analysis package
  api         scan api
P
Phodal Huang 已提交
34
  bs          bad smell analysis
P
Phodal Huang 已提交
35
  call        call graph api
P
Phodal Huang 已提交
36
  cloc        cloc [FILE or DIRECTORY]
P
Phodal Huang 已提交
37
  concept     concept api
P
Phodal Huang 已提交
38
  count       count code
P
Phodal Huang 已提交
39
  evaluate    evaluate refactor effort
P
Phodal Huang 已提交
40
  git         git analysis
P
Phodal Huang 已提交
41
  help        Help about any command
P
Phodal Huang 已提交
42
  rcall       reverse call
P
Phodal Huang 已提交
43
  refactor    auto refactor code
P
Phodal Huang 已提交
44

P
Phodal Huang 已提交
45 46
```

P
Phodal Huang 已提交
47
### Analysis
P
Phodal Huang 已提交
48 49

```
P
Phodal Huang 已提交
50
coca analysis
P
Phodal Huang 已提交
51 52
```

P
Phodal Huang 已提交
53 54
### Find Bad Smells

P
Phodal Huang 已提交
55
```bash
P
Phodal Huang 已提交
56
coca bs -s type
P
Phodal Huang 已提交
57 58
```

P
Phodal Huang 已提交
59 60
Examples Result:

P
Phodal Huang 已提交
61
```json
P
Phodal Huang 已提交
62
{
P
Phodal Huang 已提交
63 64 65 66 67 68 69 70 71 72 73 74 75 76
   "dataClass": [
      {
         "File": "examples/api/BookController.java",
         "BS": "dataClass"
      }
      ...
   ],
   "lazyElement": [
      {
         "File": "examples/api/model/BookRepresentaion.java",
         "BS": "lazyElement"
      }
      ...
   ]
P
Phodal Huang 已提交
77 78 79
}
```

P
Phodal Huang 已提交
80 81 82
### Code Line Count

```
P
Phodal Huang 已提交
83
coca cloc
P
Phodal Huang 已提交
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
```

Results:

```
───────────────────────────────────────────────────────────────────────────────
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
P
Phodal Huang 已提交
109
───────────────────────────────────────────────────────────────────────────────
P
Phodal Huang 已提交
110 111
```

P
Phodal Huang 已提交
112 113 114 115 116 117
Results to json

```
coca cloc --by-file --format json
```

P
Phodal Huang 已提交
118 119 120
### Build Deps Tree

```
P
Phodal Huang 已提交
121
coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
P
Phodal Huang 已提交
122 123
```

P
Phodal Huang 已提交
124 125
Examples Results:

P
Phodal Huang 已提交
126 127 128 129 130
![Call Demo](docs/sample/call_demo.svg)

### Identify Spring API

```
P
Phodal Huang 已提交
131
coca api -f
P
Phodal Huang 已提交
132 133
```

P
Phodal Huang 已提交
134 135
![API Demo](docs/sample/api.svg)

P
Phodal Huang 已提交
136 137 138
With Count

```
P
Phodal Huang 已提交
139
coca api -r com.phodal.pholedge. -c 
P
Phodal Huang 已提交
140 141
``` 

P
Phodal Huang 已提交
142 143
or multi package:

P
Phodal Huang 已提交
144
`coca api  -r com.macro.mall.demo.controller.,com.zheng.cms.admin.,com.phodal.pholedge -c` 
P
Phodal Huang 已提交
145

P
Phodal Huang 已提交
146
```bash
P
Phodal Huang 已提交
147 148 149 150 151 152 153 154 155 156 157 158 159
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
| 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                           |
+------+--------+------------------------------------------------+------------------------------------------------------------------------+
P
Phodal Huang 已提交
160 161
```

P
Phodal Huang 已提交
162 163 164
### Git Analysis

```
P
Phodal Huang 已提交
165
coca git -t
P
Phodal Huang 已提交
166 167
```

P
Phodal Huang 已提交
168 169 170
Results: 

```bash
P
Phodal Huang 已提交
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
|                                                     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 |
| src/docs/asciidoc/web/webmvc.adoc                                                                                   |       121 |          24 |
| spring-context/src/main/java/org/springframework/context/annotation/ConfigurationClassParser.java                   |       118 |           9 |
| src/dist/changelog.txt                                                                                              |       118 |           9 |
| spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.java       |       116 |          15 |
| spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java        |       113 |          15 |
| spring-web/src/main/java/org/springframework/http/HttpHeaders.java                                                  |       111 |          18 |
| src/docs/asciidoc/web/webflux.adoc                                                                                  |       108 |          21 |
| spring-core/src/main/java/org/springframework/core/annotation/AnnotatedElementUtils.java                            |       107 |           9 |
| spring-test/spring-test.gradle                                                                                      |       105 |           7 |
| spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java |       105 |          13 |
| spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompBrokerRelayMessageHandler.java         |       101 |          12 |
| spring-web/src/main/java/org/springframework/web/client/RestTemplate.java                                           |        98 |          17 |
| spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceHttpRequestHandler.java                |        96 |          14 |
| org.springframework.core/src/main/java/org/springframework/core/convert/TypeDescriptor.java                         |        93 |           4 |
| spring-core/src/main/java/org/springframework/core/ResolvableType.java                                              |        92 |          10 |
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
P
Phodal Huang 已提交
195 196
```

P
Phodal Huang 已提交
197 198 199
### Concept Analyser

```
P
Phodal Huang 已提交
200
coca concept
P
Phodal Huang 已提交
201 202 203 204 205
```

Results Examples:

```
P
Phodal Huang 已提交
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
+------------------+--------+
|      WORDS       | COUNTS |
+------------------+--------+
| context          |    590 |
| resolve          |    531 |
| path             |    501 |
| content          |    423 |
| code             |    416 |
| resource         |    373 |
| property         |    372 |
| session          |    364 |
| attribute        |    349 |
| properties       |    343 |
| headers          |    330 |
+------------------+--------+
P
Phodal Huang 已提交
221 222
```

P
Phodal Huang 已提交
223 224 225
### Count Refs

```
P
Phodal Huang 已提交
226
coca count
P
Phodal Huang 已提交
227 228 229 230 231
```

Results:

```
P
Phodal Huang 已提交
232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
+------------+--------------------------------------------------------------------------+
| REFS COUNT |                                  METHOD                                  |
+------------+--------------------------------------------------------------------------+
|          2 | com.phodal.pholedge.book.BookRepository.byId                             |
|          2 | com.phodal.pholedge.book.model.Book.toRepresentation                     |
|          2 | com.phodal.pholedge.book.BookRepository.save                             |
|          2 | com.phodal.coca.analysis.JavaCallApp.parse                               |
|          2 | com.phodal.pholedge.book.BookRepository.save                             |
|          2 | com.phodal.coca.analysis.JavaCallApp.parse                               |
|          1 | com.phodal.pholedge.book.model.Book.save                                 |
|          1 | evolution.analysis.jv.calls.JavaCallVisitor.parseNewType                 |
|          1 | evolution.analysis.jv.calls.JavaCallVisitor.isNotSpecialNewWord          |
|          1 | com.phodal.pholedge.book.BookMapper.byId                                 |
|          1 | com.phodal.pholedge.book.BookService.updateBook                          |
|          1 | com.phodal.pholedge.book.BookService.getBooksLists                       |
|          1 | com.phodal.pholedge.book.BookService.getBookById                         |
|          1 | com.phodal.pholedge.book.BookMapper.doSave                               |
|          1 | com.phodal.pholedge.book.BookMapper.list                                 |
|          1 | com.phodal.pholedge.book.BookService.createBook                          |
|          1 | com.phodal.pholedge.book.BookFactory.create                              |
|          1 | com.phodal.pholedge.book.BookRepository.list                             |
|          1 | com.phodal.pholedge.book.model.Book.create                               |
+------------+--------------------------------------------------------------------------+
P
Phodal Huang 已提交
255 256
```

P
Phodal Huang 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
### Reverse Call Graph

```
coca rcall -c org.bytedeco.javacpp.tools.TokenIndexer.get
```

Results:

```
digraph G { 
edge [dir="back"];

"org.bytedeco.javacpp.tools.Parser.extern" -> "org.bytedeco.javacpp.tools.Parser.declarations";
"org.bytedeco.javacpp.tools.Parser.declarations" -> "org.bytedeco.javacpp.tools.Parser.extern";
...
}
```

![RCall Demo](docs/sample/rcall.svg)

P
Phodal Huang 已提交
277
### Auto Refactor
P
Phodal Huang 已提交
278 279 280 281 282 283 284

support: 

 - rename
 - move
 - remove unused import
 - remove unused class
P
Phodal Huang 已提交
285 286

```
P
Phodal Huang 已提交
287
coca refactor -R rename.coca -p src/main
P
Phodal Huang 已提交
288 289 290
coca refactor -m move.config -p .
```

P
Phodal HUANG 已提交
291 292
## Dev

P
Phodal Huang 已提交
293
Install Go
P
Phodal HUANG 已提交
294 295 296 297 298

```bash
brew install go
```

P
Phodal Huang 已提交
299
Env
P
Phodal HUANG 已提交
300 301 302 303 304 305 306

```bash
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

P
Phodal Huang 已提交
307
clone
P
Phodal HUANG 已提交
308 309

```
P
Phodal Huang 已提交
310
go get https://github.com/phodal/coca
P
Phodal HUANG 已提交
311 312
```

P
Phodal Huang 已提交
313
Test Frameworks
P
Phodal HUANG 已提交
314 315 316 317

```
go get github.com/onsi/ginkgo
go get github.com/onsi/gomega
P
Phodal HUANG 已提交
318 319
```

P
Phodal Huang 已提交
320 321 322 323 324
License
---

[![Phodal's Idea](http://brand.phodal.com/shields/idea-small.svg)](http://ideas.phodal.com/)

P
Phodal Huang 已提交
325
@ 2019 A [Phodal Huang](https://www.phodal.com)'s [Idea](http://github.com/phodal/ideas).  This code is distributed under the MPL license. See `LICENSE` in this directory.