oop — объектно-ориентированный анализ переполнения стека

Я учусь в колледже и занимаюсь информатикой. Я думал о создании проекта на C ++ (как это есть в моей учебной программе в этом семестре), который принимает файл программы c ++ в качестве входных данных и дает вывод о том, как объектно-ориентированная программа была задана в качестве входных данных. Как количественно, так и качественно. Но я не уверен, как это можно реализовать. Как я мог это сделать? Любые другие идеи проектов, основанные на С ++ ООП, приветствуются! Спасибо!

0

Решение

Вау, это сложный проект для себя!

Разбор C ++ не для слабонервных, но если у вас есть доступ к LLVM Люкс они могли бы написать LLVM Pass. Это позволяет вам проверять анализируемый код на гораздо более высоком уровне, таком как модули, функции, блоки, циклы, которые составляют код C ++.

2

Другие решения

Прежде чем они закрыли это как «субъективное мнение» …

Я полагаю, у вас будет достойный парсер, как LLVM.

Алгоритм Хорошая объектно-ориентированная и инкапсулированная программа получает оценку 0, за все плохое, что мы вычитаем, поэтому результат либо 0, либо отрицательный. Плохие вещи (стартер):

  1. Выставленные синглтоны и глобалы
  2. Классы с открытыми элементами данных +> N строк поведения с участием этих элементов данных

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

2

Предполагая, что вы берете более одного файла в качестве входных данных — потому что любая значительно большая программа на C ++, которая требует такого уровня анализа, будет больше, чем один файл, я надеюсь! Вы можете написать расширяемый проход LLVM, который может быть включен в систему сборки, такую ​​как gMake.

Это (технически) будет не анализировать фактический код C ++, а IR LLVM, созданный путем компиляции кода (но в любом случае они по существу изоморфны).

То, что вы можете искать, это пахнет кодом, такие как очень длинные методы, классы с большим количеством членов, переменные-члены, доступные для общественности и т. д.

0

Мой друг использовал для своей магистерской работы (среди прочих инструментов) Doxygen для реализации визуализатора обнаружения клонов. По сути, он позволяет Doxygen выводить структуру некоторой кодовой базы в XML и анализировать ее. Приятно то, что Doxygen также предоставит тип / file / etc. Информация и решить отношения между сущностями для вас. Поэтому вместо того, чтобы разбирать кодовую базу самостоятельно, вы используете хорошо проверенный инструмент, чтобы сделать это за вас.

Более того, после того, как вы установили его на C ++, добавление поддержки Java (например) не должно быть чрезвычайно сложным, так как Doxygen уже с радостью переварит это для вас, и полученный XML-результат действительно схож.

Если вам интересно, есть больше информации Вот

Чтобы ответить на ваш вопрос о самом анализе кода: на самом деле нет единого определения, что такое «хороший ООП», многие варианты дизайна могут быть хорошими или плохими в зависимости от контекста и использования. Кроме того, здесь часто задействовано немного вкуса и перебор ООП может быть так же плохо, как слишком мало.
Это будет очень сложное мероприятие (даже игнорируя часть синтаксического анализа), но не позволяйте этому пугать вас; Вы всегда можете открыть его с открытым исходным кодом 🙂

Если вам нужны простые метрики ООП, я бы посмотрел на такие вещи, как:

  • Количество статических переменных \ свободных функций относительно (нестатических) методов;
  • Дублирование кода (опять же ссылаюсь на ссылку выше); В общем, дублирование кода 1: 1 воняет;
  • Инкапсуляция: количество открытых членов (переменных и методов) во всех классах

Выше может быть полезным грубые показатели о ООП-ности кодовой базы.

0
По вопросам рекламы [email protected]