Шаблоны проектирования обычно не появляются непосредственно в коде;обычно код содержит реализацию шаблона проектирования.
Чтобы выполнить такое распознавание образов, вам потребуется:
- Возможность надежного анализа исходного языка
- Возможностьраспознавать низкоуровневые кодовые шаблоны, которые намекают на высокоуровневый шаблон
- Возможность связывать наборы низкоуровневых шаблонов вместе с помощью близости или, как правило, потока управления и данных
Существует не так много инструментов, которые могут это сделать.В то время как мы явно не охотились за общими шаблонами проектирования, мы создали инструмент, отвечающий указанным выше критериям: наш DMS Software Reengineering Toolkit .DMS может анализировать C, Java и COBOL на том же уровне точности, что и их компиляторы, может сопоставлять шаблоны с использованием явных шаблонов и вычисляет контроль и анализ потока данных для этих языков.
Одним интересным применением DMS было распознавание«шаблон проектирования» для производства интерактивных экранов в приложении на 35 миллионов строк C.Вам известен этот шаблон проектирования: «используйте printf для создания фрагментов вывода на экран».Хотя фрагменты шаблона легко распознать (большинство вызовов printf являются примерами), реальная проблема заключается в распознавании самого изображения экрана из запутанной стопки кода, который его реализует.Задача, которую мы выполнили, заключалась в извлечении изображения печатного вывода на экран (представленного в виде XML-файла, содержащего текст на экране и XML-теги, представляющие выходные данные с переменным содержимым) путем связывания отдельных вызовов printf.Детали для выполнения этого довольно сложны;Вы должны найти последовательности printfs, которые обычно пересекают вызовы функций и управляются множеством условных выражений (XML также записывает условную часть экранов).Инструмент генерировал изображения экранов для всех экранов, которые можно распечатать с помощью кода, начинающегося с main .
Если вы надеетесь найти простое решение для распознавания шаблонов дизайна, думаю, у вас не будет многоудачи, но это возможно.