Введение 5
Постановка задачи 6
1. Обзор существующих решений 7
1.1. Поиск паттернов проектирования в объектно-ориентированном коде 7
1.2. Поиск ошибок в объектно-ориентированном коде 8
1.3. Поиск и исправление ошибок архитектуры 8
1.3.1. Реструктуризация на уровне методов 8
1.3.2. Реструктуризация на уровне классов 8
1.3.3. Реструктуризация на уровне пакетов 9
2. Подход к реструктуризации кода на уровне классов 11
2.1. Построение моделей 11
2.2. Алгоритм на основе поиска сообществ 12
2.3. Алгоритмы на основе кластеризации 13
2.3.1. Модификация алгоритма ARI 14
2.3.2. Модификация алгоритма HAC 14
2.3.3. Алгоритм FMC 15
3. Особенности реализации 16
3.1. Реализация плагина для среды разработки IntelliJ IDEA 16
3.2. Архитектура 17
3.3. Рекурсивный обход элементов кода с помощью PSI 18
4. Апробация 19
4.1. Первый пример 19
4.1.1. Результат работы алгоритма CCDA 19
4.1.2. Результат работы алгоритма ARI 20
4.1.3. Результат работы алгоритма HAC 21
4.1.4. Результат работы алгоритма FMC 21
4.2. Второй пример 22
4.3. Третий пример 22
Заключение 24
Список литературы 25
Методы машинного обучения активно совершенствуются в течение последних десятилетий и применяются в разных областях, например, в медицине, экономике, компьютерном зрении, биоинформатике, информационном поиске и т.д. Однако, на сегодняшний день всё ещё существуют такие задачи, с которыми человек справляется намного лучше обученного алгоритма. Одно из таких направлений — анализ программного кода.
Можно выделить несколько конкретных задач, связанных с анализом кода, в которых применимо машинное обучение:
• поиск одинаковых участков кода;
• поиск паттернов и антипаттернов проектирования;
• поиск и исправление ошибок в коде;
• поиск и исправление ошибок архитектуры.
Объектно-ориентированный код наиболее интересен для исследований, так как этот подход к разработке сейчас является наиболее массово используемым. Кроме того, объектно-ориентированный код имеет относительно несложную структуру, и его компоненты легко поддаются анализу.
Ошибки проектирования при разработке программных продуктов усложняют переиспользование и дальнейшее сопровождение. На исправление таких ошибок может уходить много времени и сил, и в этом могли бы помочь средства автоматической реструктуризации программ.
В ходе выполнения данной работы были достигнуты следующие результаты.
1. Произведён анализ предметной области применения машинного обучения для анализа объектно-ориентированного кода.
2. Для реализации выбраны алгоритмы кластеризации и поиска сообществ в сложных сетях.
3. Реализован инструмент автоматической реструктуризации программ в виде плагина к среде разработки IntelliJ IDEA.
• Модифицированы и реализованы два алгоритма кластеризации сущностей исходного кода и алгоритм выделения сообществ в сложных сетях.
• Разработан и реализован алгоритм кластеризации методов и полей (FMC).
4. Произведена апробация алгоритмов на трёх примерах, в том числе на исходном коде проекта JHotDraw.
Результаты данной работы позволили расширить возможности алгоритмов автоматической реструктуризации посредством добавления нового типа рефакторинга ’’Перемещение поля”. Кроме того, благодаря введению новой сущности, соответствующей атрибутам классов, векторная модель сущностей исходного кода стала полнее отражать существующие в нём зависимости.
[1] Automated code metrics plugin for IntelliJ IDEA.— 2011.— URL: https://github.com/BasLeijdekkers/MetricsReloaded (online; accessed: 19.04.2017).
[2] Bishop C. M. Neural Networks for Pattern Recognition.— Oxford University Press, 1995.
[3] Breiman L. Random Forests // Machine Learning. — Vol. 45.— P. 5-32.
[4] Complete-linkage clustering.— 2016.— URL: https://en.wikipedia.org/wiki/Complete-linkage_clustering (online; accessed: 20.05.2017).
[5] Fowler Martin. Refactoring: Improving the Design of Existing Code. -Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 1999, 1999.
[6] G. John P. Langley. Estimating Continuous Distributions in Bayesian Classifiers // Eleventh Conference on Uncertainty in Artificial Intelligence. — P. 338-345.
[7] Gamma Erich. JHotDraw.— 2017.— URL: https://sourceforge. net/projects/jhotdraw/ (online; accessed: 07.04.2017).
[8] Hautus E. Improving Java software through package structure analysis // Proceedings of the 6th IASTED International Conference on Software Engineering and Applications, IEEE. -- 2002.
[9] Hierarchical clustering. — 2017. — URL: https://en.wikipedia.org/ wiki/Hierarchical_clustering (online; accessed: 20.05.2017).
[10] IntelliJ IDEA.— 2000.— URL: https://www.jetbrains.com/idea/ (online; accessed: 19.04.2017).
[11] J. Friedman T. Hastie R. Tibshiran. Additive Logistic Regression: a Statistical View of Boosting. — Stanford University, 1998.
[12] John G. Cleary Leonard E. Trigg. K*: An Instance-based Learner Using an Entropic Distance Measure // 12h International Conference on Machine Learning. — P. 108-114.
[13] Jureczko M., Spinellis D. Using object-oriented design metrics to predict software defects // Proceedings of the Fifth InternationalConference on Dependability of Computer Systems, Monographs of System Dependability. — 2010. — P. 69-81.
[14] Kannadhasan N., Maheswari B. Uma. Machine Learning based Methodology for Testing Object Oriented Applications // Journal of Engineering and Applied Sciences.— 2015.— Vol. 10, no. 17.— P. 7400-7405.
[15] Katsuhisa Maruyama Ken-ichi Shima. Automatic Method Refactoring Using Weighted Dependence Graphs // Proceedings of the 1999 International Conference on Software Engineering, 1999.— 1999.
...