Coca — это инструментарий, предназначенный для рефакторинга и анализа старых систем, включает анализ графа вызовов, концептуальный анализ, дерево API, предложения по использованию паттернов проектирования. Coca является инструментарием для системы рефакторинга, системной миграции и анализа систем. Он может анализировать тестовые плохие запахи в коде, модульный анализ, статистику строк кода, анализ вызова и зависимости, анализ Git и автоматическое рефакторинг.
Связанные инструменты: Coco — эффективный инструмент анализа DevOps и автоматических рекомендаций.
Руководство по миграции (китайская версия): 《Руководство по системному рефакторингу и миграции》
Переход с Ant на Maven: Merry
Моделирование рефакторинга:
- [ ] Поддержка языков
- [x] Java (полностью поддерживаются все возможности)
- [x] Golang (поддержка: анализ, todo, концепт, Git, рекомендации)
- [x] TypeScript / JavaScript (в процессе реализации)
- [x] Python (поддержка: анализ, todo, концепт, Git, рекомендации)Список возможностей:```
Доступные команды:
analysis анализ кода
api сканирование HTTP API с помощью аннотаций
arch визуализация пакетов проекта
bs генерация списка плохих запахов и рекомендаций
call отображение графа вызовов с конкретным методом
cloc подсчёт строк кода с оценкой сложности
concept создание доменного концепта из исходного кода
count подсчёт наиболее часто используемых функций
evaluate оценка состояния кода и усилий на рефакторинг
git анализ истории коммитов Git для подсчёта ревизий, сводки и рекомендаций
help получение справки по любой команде
rcall визуализация обратного графа вызовов
refactor автоматический рефакторинг кода
suggest поиск применимых шаблонов проектирования в коде
tbs генерация списка плохих запахов тестов
todo сканирование всех задач "todo" и вывод списка с временем
version версия
1. [graphviz](https://www.graphviz.org/) для преобразования файлов dot в изображения (например, svg, png)
## Начало работы
Самый простой способ получить Coca — использование одного из предварительно скомпилированных бинарников, доступных для macOS, Linux и Windows на странице с [релизами](https://github.com/phodal/coca/releases).
Вы также можете установить самостоятельно:
```bash
go get -u github.com/phodal/coca
coca analysis
coca arch
Модуль Android Studio Gradle DSL (слияние заголовков):
команда: coca arch -x "com.android.tools.idea.gradle.dsl" -H true
Элементы модуля Android Studio Gradle DSL:
команда: coca arch -x "com.android.tools.idea.gradle.dsl.parser.elements"
coca bs -s type
Примеры результатов:
{
"dataClass": [
{
"Файл": "examples/api/BookController.java",
"BS": "dataClass"
}
],
"lazyElement": [
{
"Файл": "examples/api/model/BookRepresentation.java",
"BS": "lazyElement"
}
]
}
coca cloc
``````markdown
───────────────────────────────────────────────────────────────────────────────
Язык Файлы Строки Пустые строки Комментарии Код Complexity
───────────────────────────────────────────────────────────────────────────────
Go 58 31763 7132 890 23741 2847
Java 44 971 208 21 742 62
Markdown 8 238 75 0 163 0
Gherkin Specification 2 32 2 16 14 0
Document Type Definition 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
───────────────────────────────────────────────────────────────────────────────
Общее 119 33776 7494 966 25316 2909
───────────────────────────────────────────────────────────────────────────────
Приближенная стоимость разработки $803,822
Приближённый временной объём работы 14. 120551 месяцев
Приближённое количество необходимых специалистов 6. 743156
───────────────────────────────────────────────────────────────────────────────
Результаты в JSON```
coca cloc --by-file --format json
coca cloc ~/intellij-community/android/ --by-directory --include-ext=java,kt --not-match=".*(Test|Tests)\.(kt|java)"
результаты CSV:
модуль,общее количество
adt-branding,169
adt-testutils,257
adt-ui,21987
adt-ui-model,3450
android,361270
android-adb,497
android-common,3280
android-debuggers,3030
android-kotlin,8816
android-lang,24796
android-lang-databinding,6392
android-layout-inspector,2533
...
coca cloc ~/intellij-community/android/designer/src/com/android/tools/idea --top-file --top-size 10
вывод в: coca_reporter/sort_cloc.json
и также:
| ДЛИНА | КОМПЛЕКСНОСТЬ | ЛОКАЦИЯ |
|-------|--------------|-----------------------------------------------------------|
| 1642 | 236 | ConstraintLayoutHandler.java |
| 1492 | 375 | ConstraintComponentUtilities.java |
| 1189 | 166 | CommonActions.java |
| 1184 | 325 | ConstraintWidget.java |
| 1169 | 129 | SingleWidgetView.java |
| 1115 | 213 | ScoutArrange.java |
| 1097 | 281 | ScoutWidget.java |
| 1081 | 224 | 3d/Rasterize.java |
| 1016 | 159 | LayoutlibSceneManager.java |
| 1014 | 220 | TimeLinePanel.java |
coca call -c com.phodal.pholedge.book.BookController.createBook -r com.phodal.pholedge.
Примеры результатов:
coca api -f
С подсчетом
coca api -r com.phodal.pholedge. -c
или несколько пакетов:```markdown `coca api -r com.macro.mall.demo.controller.,com.zheng.cms.admin.,com.phodal.pholedge -c````bash +------+--------+------------------------------------------------+------------------------------------------------------------------------+ | РАЗМЕР | МЕТОД | URI | ВЫЗОВ | +------+--------+------------------------------------------------+------------------------------------------------------------------------+ | 36 | GET | /aliyun/oss/policy | com.macro.mall.demo.controller.OssController.policy | | 21 | POST | /aliyun/osscallback | com.macro.mall.demo.controller.OssController.callback | | 17 | GET | /subject/list | com.zheng.cms.admin.controller.CmsSubjectController.getList | | 17 | GET | /esProduct/search | com.zheng.cms.admin.search.controller.EsProductController.search | | 17 | GET | /order/list | com.macro.mall.demo.controller.OmsOrderController.list | | 17 | GET | /productAttribute/list/{cid} | com.macro.mall.demo.controller.PmsProductAttributeController.getList | | 17 | GET | /productCategory/list/{parentId} | com.macro.mall.demo.controller.PmsProductCategoryController.getList | | 17 | GET | /brand/list | com.macro.mall.demo.controller.PmsBrandController.getList | | 17 | GET | /esProduct/search/simple | com.zheng.cms.admin.search.controller.EsProductController.search | +------+--------+------------------------------------------------+------------------------------------------------------------------------+
coca git -t
```bash
+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+
| 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 |
+------------------------------------------------------------------------------------------------------------------------+-----------+-------------+
```### Концепт анализатор``````
кока концепт
Примеры результатов:
+------------------+----------+
| СЛОВА | КОЛИЧЕСТВО |
+------------------+----------+
| контекст | 590 |
| решить | 531 |
| путь | 501 |
| содержание | 423 |
| код | 416 |
| ресурс | 373 |
| свойство | 372 |
| сессия | 364 |
| атрибут | 349 |
| свойства | 343 |
| заголовки | 330 |
+------------------+----------+
кока счет
```Результаты:
+------------+----------------------------------------------------------------------------------+ | Количество основанных на управлении | Метод | +------------+----------------------------------------------------------------------------------+ | 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 | +------------+----------------------------------------------------------------------------------+
### Обратный граф вызовов```
coca rcall -c org.bytedeco.javacpp.tools.TokenIndexer.get
Результаты:
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";
...
}
Поддержка:
coca refactor -R rename.coca -p src/main
coca refactor -m move.config -p .
coca evaluate
Результаты Arduino (Старая версия):
+--------------------------------+-------+-----------------------+-------+-----------+
| ТИП | КОЛ-ВО| УРОВЕНЬ | ВСЕГО | ДОЛЯ |
+--------------------------------+-------+-----------------------+-------+-----------+
| Nullable / Вернуть null | 0 | Метод | 1615 | 0.00% |
| Utils | 7 | Класс | 252 | 2.78% |
| Статический метод | 0 | Метод | 1615 | 0.43% |
| Среднее количество методов | 1615 | Метод/Класс | 252 | 6.41 |
| Стандартное отклонение количества методов / Стандартное отклонение | 1615 | Класс | - | 7.344917 |
| Средняя длина метода | 13654 | Без геттеров/сеттеров | 1100 | 12.412727 |
| Стандартное отклонение длины метода / Стандартное отклонение | 1615 | Метод | - | 20.047092 |
+--------------------------------+-------+-----------------------+-------+-----------+
ТИП | КОЛ-ВО ТИПОВ | УРОВЕНЬ | ВСЕГО УРОВНЕЙ | ЗНАЧЕНИЕ = КОЛ-ВО / ВСЕГО |
---|---|---|---|---|
Nullable / Вернуть null | 0 | Метод | 6 | 0.00% |
Utils | 0 | Класс | 14 | 0.00% |
Статический метод | 1 | Метод | 6 | 0.00% |
Среднее количество методов | 6 | Метод/Класс | 14 | 0.428571 |
Стандартное отклонение количества методов / Standard Deviation | 6 | Класс | - | 0.646206 |
Средняя длина метода | 0 | Без getter/setter | 0 | NaN |
Стандартное отклонение длины метода / Standard Deviation | 0 | Метод | - | NaN |
Оценка.json примеры json |
||||
{ |
"Nullable": {
"Items": [
"nonnull.Name.testNull",
"nonnull.Name.orElseNull",
"org.ofbiz.base.util.UtilURL.fromResource",
"org.ofbiz.base.util.UtilURL.getOfbizHomeRelativeLocationFromFilePath",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.toDomainModel",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.toDomainModel",
"study.huhao.demo.adapters.outbound.persistence.blog.BlogPO.of",
"study.huhao.demo.infrastructure.persistence.blog.BlogPO.convertDomain"
]
},
"ServiceSummary": {
"LifecycleMap": null,
"ReturnTypeMap": {
"BookRepresentation": [
"com.phodal.pholedge.book.BookService.getBookById",
"com.phodal.pholedge.book.BookService.updateBook"
]
},
"RelatedMethod": null
},
"UtilsSummary": {},
"Summary": {
"UtilsCount": 1,
"ClassCount": 64,
"MethodCount": 161,
"StaticMethodCount": 19
}
}
### Задачи
выполнить все задачи
результаты:
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| ДАТА | АВТОР | СООБЩЕНИЯ | НАЗВАНИЕ_ФАЙЛА | СТРОК |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| 2019-12-09 | Cristian Maglie | Происходит на macOSX, причины | app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java | 118 |
| | | неизвестны | | |
| 2019-12-09 | Cristian Maglie | Преобразуйте это в метод темы | app/src/cc/arduino/contributions/libraries/ui/ContributedLibraryTableCellJPanel.java | 233 |
| 2019-12-09 | Cristian Maglie | Улучшите обновление | app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java | 241 |
| | | только необходимых элементов | | |
| 2019-12-09 | Cristian Maglie | Улучшите обновление | app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java | 273 |
| | | только необходимых элементов | | |
| 2019-12-09 | Cristian Maglie | Преобразуйте это в метод темы | app/src/cc/arduino/contributions/libraries/ui/MultiLibraryInstallDialog.java | 149 |
| 2019-12-09 | Cristian Maglie | Происходит на macOSX, причины | app/src/cc/arduino/contributions/packages/ui/ContributedPlatformTableCellJPanel.java | 183 |
| | | неизвестны | | |
| 2019-12-09 | Cristian Maglie | Отображение ошибки | app/src/processing/app/Base.java | |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+
| 2019-12-09 | Cristian Maglie | Ошибка при импорте. игнорировать | app/src/processing/app/Base.java | 2423 |
```| | | :-( | | |
| 2019-12-09 | Cristian Maglie | Улучшить / переместить обработку ошибок | app/src/processing/app/Editor.java | 1541 |
| 2019-12-09 | Cristian Maglie | Должна ли это быть тема значения? | app/src/processing/app/EditorHeader.java | 78 |
| 2019-12-09 | Cristian Maglie | Должна ли это быть тема значения? | app/src/processing/app/EditorStatus.java | 73 |
| 2019-12-09 | Cristian Maglie | Улучшить декомпозицию | app/src/processing/app/EditorTab.java | 465 |
+------------+-----------------+--------------------------------+--------------------------------------------------------------------------------------+------+```### Предложения```
coca suggest
результаты:
+--------+------------------+--------------------------------+
| КЛАСС | ШАБЛОН | ПРИЧИНА |
+--------+------------------+--------------------------------+
| Насекомое | фабрика | слишком много конструкторов |
| Пчела | фабрика, строитель | сложный конструктор, слишком много конструкторов, слишком много параметров |
+--------+------------------+--------------------------------+
coca tbs
результаты```bash +---------------------+---------------------------------------------------------------+------+ | ТИП | ИМЯ ФАЙЛА | СТРОКА | +---------------------+---------------------------------------------------------------+------+ | Дублирующий тест утверждения | app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java | 107 | | Дублирующий тест утверждения | app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java | 41 | | Дублирующий тест утверждения | app/test/cc/arduino/i18n/ExternalProcessOutputParserTest.java | 63 | | Избыточный тест вывода | app/test/cc/arduino/i18n/I18NTest.java | 71 | | Избыточный тест вывода | app/test/cc/arduino/i18n/I18NTest.java | 72 | | Избыточный тест вывода | app/test/cc/arduino/i18n/I18NTest.java | 77 | | Дублирующий тест утверждения | app/test/cc/arduino/net/PACSupportMethodsTest.java | 19 | | Дублирующий тест утверждения | app/test/processing/app/macosx/SystemProfilerParserTest.java | 51 | | Дублирующий тест утверждения | app/test/processing/app/syntax/PdeKeywordsTest.java | 41 | | Дублирующий тест утверждения | app/test/processing/app/tools/ZipDeflaterTest.java | 57 | | Дублирующий тест утверждения | app/test/processing/app/tools/ZipDeflaterTest.java | 83 | | Дублирующий тест утверждения | app/test/processing/app/tools/ZipDeflaterTest.java | 109 | +---------------------+---------------------------------------------------------------+------+
coca deps -p _fixtures/deps/maven_sample
результаты:
+---------------------------+----------------------------------------+---------+ | ГРУППА | АРТИФАКТ | ОБЛАСТЬ | +---------------------------+----------------------------------------+---------+ | org.flywaydb | flyway-core | | | mysql | mysql-connector-java | runtime | | org.springframework.cloud | spring-cloud-starter-contract-verifier | test | +---------------------------+----------------------------------------+---------+
## Примеры использования
Примеры анализа Android Studio. Вызов с помощью `lookup`: `coca call -l`
## План развития — Поддержка плохого запаха кода
- [x] сортировка размера метода
- тип
- [x] длинный список параметров
- [x] длинный метод
- [x] повторяющиеся операторы switch
- [x] сложный if
- [x] большой класс
- [x] отклонённый запрос
- [x] класс данных
- CLOC
- Визуализация HTTP API
- [x] поддержка Spring
- [x] поддержка @Service
- [x] размер вызова API
- Git
- [x] количество ревизий
- [x] сводка
- [ ] [git-quick-stats](https://github.com/arzzen/git-quick-stats)
- Концепция
- [x] слова NLP
- [ ] до домена
- Граф вызовов и rcall
- [x] подсчёт ссылок
- Автоматическое рефакторинг
- [x] удаление ненужного
- [x] перемещение файлов
- Оценка
- [x] подсчёт nullable
- [x] подсчёт статического
- [x] подсчёт количества методов / длины метода
- Обзор задач
- [x] задачи с историей и автором
- Предложение API для шаблонов проектирования
- [x] фабричный шаблон
- [x] стратегия
- [x] билдер
- [ ] циклические зависимости -> адаптер / агентство
- [ ] плохие шаблоны
- [ ] Singleton
- Оценка API
- [x] средняя длина метода
- [x] среднее количество методов в классе
- Тесты
- [ ] Тестируемость?
- [x] тестовый плохой запах -> список [https://testsmells.github.io/pages/testsmells.html]
- [x] игнорируемые тесты: @Ignore
- [x] пустые тесты: нет вызова в тесте
- [x] избыточные печатные тесты: System.out.println
- [x] спящие тесты: Time.sleep
- [x] избыточные утверждения тестов: assertTrue(True) - [x] неизвестные тесты: нет утверждений
- [x] повторяющиеся утверждения тестов: assert > 5
- [ ] тесты только для тестирования: метод вызывается только тестами
- [ ] границы тестирования: тестовый метод, который не находится в системе
- [ ] общее оборудование: классы JUnit, имеющие хотя бы один метод, не использующий полное тестовое оборудование, определённое в методе setUp()
- Архитектура
- [x] визуализация архитектуры
- [ ] защита архитектуры
- [ ] дизайн DSL
- Долги в коде
- [ ] автоматическое создание истории
- TBD
- Анализ комментариев
- [ ] неверный комментарий? <http://das.encs.concordia.ca/uploads/2018/02/Maldonado_thesis.pdf>
- ~~Онлайн анализ кода~~
- [x] ~~поддержка WASM~~
- [ ] ~~экспонирование API WASM~~
- [ ] ~~поиск кода GitHub~~
- [ ] ~~Плагины~~
- [ ] ~~поддержка плагинов (вопросы Windows)~~
- [x] Анализ зависимостей
- [ ] связанные счетчики зависимостей
- [x] анализ третьих сторон XML или Groovy скриптов
- [x] поддержка Groovy
- [x] миграция в стиль Go
- [ ] Команда истории
- [ ] автоматическое создание истории рефакторинга
- [ ] Советы по чистому коду
- [ ] Версия на JavaScript [clean-code-javascript](https://github.com/ryanmcdermott/clean-code-javascript)
- [ ] Больше CodeSmells
- [ ] Исходник [DesigniteJava](https://github.com/tushartushar/DesigniteJava)Документы Todo: - [ ] Документация
- [ ] Цикл жизни новых проектов: оценка (cloc, плохой запах, API, git, todo) -> проектирование -> паттерны (предложения) -> рефакторинг ()
- Коллекция данных
- [ ] монолитная
- [ ] микросервисная
- [ ] большие данные
Финансовый долг
- Тест для Windows
- Дублирование кода
- cmd/ -> использовать конструктор пользователя для рефакторинга
## Разработка
Установка Go
```bash
brew install go
Среда
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
Клонирование
git clone https://github.com/phodal/coca
Тестовые фреймворки
go get github.com/onsi/ginkgo
go get github.com/onsi/gomega
Архитектура основана на Tequila
Анализ Git вдохновлен Code Maat
Примеры нежелательных тестовых ароматов вдохновлены Test Smell Examples
© 2019 A Phodal Huang's Idea. Этот код распространяется под лицензией MPL. Смотрите LICENSE
в этой директории.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )