2012-06-04 2 views
3

Можно создать дубликат:
C++ code dependency/call-graph “viewer”?C++ график функции зависимости

Я работаю на огромной C++ код базы и в настоящее время я застрял с проблемой модульности моего кода. Мне нужно разделить мой код на отдельные независимые модули.

Один из подходов, о котором я могу думать, состоит в том, чтобы сгенерировать граф зависимостей, а затем выполнить классификацию более высокого уровня. Другой подход - начать с точки входа (некоторая функция abc()) и генерировать дерево вызовов функций, каждый из которых будет содержать имя файла, в котором находится эта функция. После этого я могу использовать некоторый скрипт для извлечения этих функций в отдельные модули.

Мой вопрос в том, есть ли какой-либо инструмент, который может помочь мне выполнить эту задачу? Раньше кто-то сталкивался с такой проблемой. Или вы можете предложить какой-либо подход для достижения того же?

+2

Определить «огромный». Кроме того, есть ли какая-то модуляция, присутствующая в базе кода? – wolfgang

+0

Что случилось с doxygen? – bitmask

+0

@wolfgang: У меня есть более 1 миллиона строк кода и около 30000 файлов в моей базе кода. В настоящее время нет модуляции как таковой. – mukesh

ответ

5

Первый уровень модульности - и я надеюсь, что вы уже это сделали - структурирует ваш код в классах. Если ваш код представляет собой всего лишь набор функций - т. Е. C плюс некоторый синтаксический рекомендатор, - тогда настало время переписать ваш код, потому что никакое количество построений графа зависимостей не спасет вас от адского обслуживания.

Если есть классы, модульности должны быть предметом поиска классов, которые тесно сотрудничают друг с другом (как Customer, Order и Invoice) и отделить их от классов, которые только losely связанных с ними (например, Employer или Facility). Тогда возьмите его оттуда.

Модифицирующий код - это то, что требует, прежде всего, мысли. Никакая автоматическая процедура не заменяет этого. Собственно, из того, что мало вы писали, я опасаюсь, что любой автоматизированный процесс сделает вещи хуже, потому что, судя по всему, в этот проект уже слишком мало думалось. I.e., вы написали 1 миллион строк кода, не задумываясь о модуляции, и теперь вы хотите, чтобы модуляция произошла, а все еще на самом деле не думал об этом. Вы направляетесь к эпической неудаче.

+0

Да, мой код уже организован в виде классов, но проблема в моей базе кода настолько велика, что очень сложно найти классы, которые работают вместе. – mukesh

+0

@ ученого: Тогда мой второй абзац правдой. Должна быть возможность сформировать «логические группы» классов. Логика на самом деле важнее частоты вызова функции. Если у вас есть графическая программа, у вас должны быть фильтры ввода/вывода в одном модуле, фильтры преобразования в другом, элементы GUI в третьем и так далее. Как часто они называют друг друга, не имеет значения - компилятор * легко находит код в других модулях. Идея модуляции заключается в том, что * помощник * кода легко находит определенную функцию. Инструмент анализа кода не может заменить здравый смысл. – DevSolar

1

Я регулярно использую «Понять для C/C++» для изучения этих зависимостей.

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

  • Cytoscape (который может взять на себя выход «Поймите для C/C++»для визуализации зависимостей
  • Lattix
4

Чтобы получить представление doxygen может помочь. Но вам нужно немного поиграть с настройками doxyfile для генерации графиков зависимостей, и если ваша база кода огромна, вы должны отключить динамический материал из сгенерированных методов. Doxygen может создавать диаграммы включения, наследования, вызова и звонящего, используя graphviz.

Здесь просто examples, но он также работает для больших. Но doxygen предоставит вам обзор и возможности рефакторинга.

0

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

Смежные вопросы