LINUX.ORG.RU

Поиск инструмента визуализации зависимостей между классами с++

 


1

7

Не первый раз пытаюсь найти, но ничего не выходит, последняя надежда на вас :)

В общем есть папка с кодом, писавшимся математиком протяженное время. Внутри нее часто одни алгоритмы сменялись другими, некоторые просто устарели и нигде не используются, в общем содержимое папки превратилось в изрядную помойку.

Я хочу навести там порядок. Для начала хочу просто изучить зависимости между классами. Для этого мне нужна программа, которая на вход принимает папку, рекурсивно внутри нее изучает все существующие сущности и в качестве выхлопа выдает в идеале UML.

Можно конечно и самому реализовать данную программу, задача выглядит на первый взгляд не столь сложной, однако с визуализацией придется попотеть и ей заниматься крайне не хочется

Кто какие средства знает на эту тему??



Последнее исправление: CYB3R (всего исправлений: 1)

В общем есть папка с кодом, писавшимся математиком протяженное время

Сочувствую, сам с подобным сталкивался.

Я хочу навести там порядок.

Даже не пытайся - легче будет с нуля переписать.

задача выглядит на первый взгляд не столь сложной

Как раз таки для C++ она сложна. Готовых тулзов даже не знаю - попробуй clang для получения AST заюзать, а дальше в AST копайся.

cherry-pick
()

Готовых решений не встречал.

Можно конечно и самому реализовать данную программу, задача выглядит на первый взгляд не столь сложной, однако с визуализацией придется попотеть и ей заниматься крайне не хочется

Я бы взял ASTMatchers из clang или аналогичное для парсинга (например gcc-xml, но там XML, с которым не очень удобно работать по сравнению с объектной моделью; подозреваю, что плагином к GCC тоже можно сделать, просто опыта с ними пока совсем мало), а визуализацию отдал GraphViz, которому только граф надо на вход.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

Кто какие средства знает на эту тему??

Попробуй doxygen, он умеет рисовать зависимости для каждого класса.

Vinick ★★
()
Ответ на: комментарий от xaizek

Спасибо за наводку, но это отдельная задача разобраться в ASTMatchers. Очень надеялся, что будет что-то, запускающее в одну команду и не требующее времени для особого изучения. Насколько я понял, то ли AST, то ли ASTMatchers имеет достаточно широкий функционал и изучить его, точнее вспомнить теорию языков компиляции и сопоставить лексеммы с деревом разбора AST* будет затратно по времени. А потом задача парсинга исходного кода понятного мне превратится в парсинг текста, понятного clang разработчикам и не совмем понятного мне.

Мне сейчас нужно всего лишь, например, что

класс A используется в классe B и классе С

класс C унаследован от класса D

классы В и D нигде не используется

Надо почитать GraphViz, что он там умеет и наверно начать как-нибудь самостоятельно велосипедить в эту сторону. Уж распарсить то классы - дело, думаю, одного дня. Далее скормить graphViz результат парсинга и будет мне наверно счастье

Burns
() автор топика
Ответ на: комментарий от Vinick

Никогда не пользовался, но насколько я знаю, doxygen требует для своей работы полного документирования кода. Если документирования нет, то это хозяйство работать не будет. Или я что-то о нем не знаю?

Burns
() автор топика
Ответ на: комментарий от cherry-pick

Даже не пытайся - легче будет с нуля переписать.

Было желание с нуля переписать, но поскольку алгоритмы проверяются на видеоизображении страшно представить, сколько времени снова уйдет на их тестирование.

Как раз таки для C++ она сложна. Готовых тулзов даже не знаю - попробуй clang для получения AST заюзать, а дальше в AST копайся.

Сложностей пока не вижу. Чтение в стринг, удаление всех комментариев, далее поиск лексемм class, struct, enum и т.д. Запоминание их имен и типов, а далее второй проход и поиск использования

Burns
() автор топика
Ответ на: комментарий от Vinick

ан нет, нашел, вроде бы что-то сильно похожее на то, что мне нужно, огромное спасибо))

Burns
() автор топика
Ответ на: комментарий от Burns

Нет, не требует.

Сам пользуюсь им для копания в легаси-добре.

fmdw
()

doxygen

/thread

anonymous
()
Ответ на: комментарий от Vinick

Нашел, как заставить doxygen выписать все классы и показать наследования... А вот включения, включения, Карл?? Не подскажете, как их показать?

Burns
() автор топика
Ответ на: комментарий от Burns

Эх, на каждый класс тыкать и смотреть использование. Интереснее было бы на всю картину сразу поглядеть, но и так пойдет. Всем огромное спасибо))

Burns
() автор топика
Ответ на: комментарий от Burns

А вот включения, включения, Карл?? Не подскажете, как их показать?

флаги EXTRACT_ALL, EXTRACT_PRIVATE, установлены в Doxyfile ?

Vinick ★★
()

Doxygen тебе поможет. Он в документации рисует зависимости и граф вызовов.

Xintrea ★★★★★
()
Ответ на: комментарий от MKuznetsov

попробовал... ну, вы знаете..

Сначала пришлось везде поменять шрифт, потому что там стоит дико мелкий и он сливается... долго не мог понять, почему в одном месте изменив шрифт он поменялся(файлы), а вот шапка меню не захотела меняться... проставил шрифты везде и только потом решил перезагрузить..

Далее не совсем очевидно, как выводить файлы директорией, а не списком. Есть в меню вид, но кнопка применить недоступна. Зачем-то добавляет кучу CMakeLists.txt

В общем первое мнение - по юзабилити doxygen удобнее

Burns
() автор топика

Если это организация и есть возможность платить деньги - Enterprise Archotect: https://www.youtube.com/watch?v=hT_Rs-fOttE

P. S. Если заинтересует, и будете смотреть демки по остальным фичам, то смело делите на 3: кроме как для рисования диаграмм, программа неудобная.

Kroz ★★★★★
()
Ответ на: комментарий от Burns

но поскольку алгоритмы проверяются на видеоизображении страшно представить, сколько времени снова уйдет на их тестирование.

В смысле, проверяются вручную? Это хуже всего. В таком случае, я бы вместо «наведения порядка» начал с написания тестов. А потом и остальное проще будет.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Да вот и проблема то. Я не представляю, как правильно подойти к тестам. Оценка работы идет чисто на глаз - лучше или хуже. С помощью тестов можно сделать также, как было раньше.. но есть одно но: не факт, что раньше было правильно :) Любой результат можно улучшить.

Что может дать тест? То, на что сейчас обращаешь внимание, при запуске приложения ты все-таки больше будешь делегировать тесту (ну выдает результат в пределах заданной погрешности и ладно), а в следствие этого, по моему скромному мнению, могут на уровнях обработки выше скапливаться приличные ошибки.

Нет, я не против тестов. Даже почти близок к их использованию, вот только проблема, что не понимаю, как правильно наложить тесты на такую сложную штуку, как обработка видеоизображений.

Burns
() автор топика
Ответ на: комментарий от Burns

Что может дать тест?

Я не в теме твоей задачи так что советовать не могу. Просто дал работающую в большинстве случаев рекомендацию. Уместна она или нет - решать тебе. (:

DarkEld3r ★★★★★
()
Ответ на: комментарий от Elyas

http://www.sourceinsight.com/

1. win only

2. кривой парсер. Первое, что бросилось в глаза - ключевое слово override распознается как данные.

3. В отличие от doxygen что-то толковое из него вытащить не осилил я за 10 мин. Картинки изображены красивые в описании, на деле такой вереницы зависимостей я не увидел. Изучать нюансы недопиленной платной виндовой реализации совсем нет желания.

4. Попросил пути к стандартным заголовочкам. Я не помню, где они в винде и не понимаю, зачем они ему нужны.

P.S. Тема уже давно закрыта. Хотя если кто-то новых ссылок накидает, я с удовольствием рассмотрю альтернативы. Благодарю))

Burns
() автор топика
Ответ на: комментарий от Gorthauer

Создать файл проекта для QtCreator, он умеет все включения показывать.

Да, я часто этим пользуюсь. Однако creator показывает зависимости конкретного элемента. Doxygen в добавок показывает зависимости конкретного .h / .cpp файла относительно других файлов.

Burns
() автор топика
Ответ на: комментарий от Kroz

Вот это именно то, что нужно. Строго по описанию полностью решает поставленную задачу. Очень признателен, спасибо)

Что не понравилось:

1) win only

2) не нашел возможности изменения масштаба диаграммы

3) проблемы с планарностью. Некоторые стрелки наезжают на описание, при пересечении стрелок друг с другом то рисуется дуга, то нет

Burns
() автор топика
Ответ на: комментарий от Burns

1) win only

Увы...

2) не нашел возможности изменения масштаба диаграммы

Ctrl+Mouse Scroll
Двигать - Drag средней кнопкой мыши.

3) проблемы с планарностью. Некоторые стрелки наезжают на описание, при пересечении стрелок друг с другом то рисуется дуга, то нет

Вот со стрелками и расположением элементов там как раз всё хорошо.

ПКМ на стрелку > Line Stype
Я чаще использую либо Direct, либо Laterial Verical (может рисовать строк вертикальную стрелку, которая не меняется даже если один из элементов двигаешь или изменяешь в размерах; иногда глючит (: ), либо Custom Line. Custom Line - можешь двигать начало/конец стрелки, а Сtrl+Сlick поставит на стрелке точку, посредством которой можно делать угловые стрелки.

Ну, и выбери более одного элемента и нажми правой кнопки. Align*, Same* и Space Evently позволяет делать очень красивые диаграммы.

P. S. Del на элементе его не удаляет, а скрывает. Удаляет Ctrl+Del.

P. P. S. Если таки будешь в нем работать, обязательно посмотри EA Kung Fu.

Kroz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.