Понимание кода, обратный инжиниринг, лучшие концепции и инструменты. Джава - PullRequest
8 голосов
/ 17 апреля 2010

Одна из самых сложных задач для любого программиста - это понимание кода другого.

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

Из того, что я знаю: обратный код для создания объектных моделей (создание диаграмм для каждого пакета не очень удобно), создание диаграмм последовательности (инструмент подключается к системе в режиме отладки и генерирует диаграммы из среды выполнения). Некоторые методы визуализации, использующие некоторые инструменты для работы не только с .java, но также с, например, JPA Разработчики, такие как Hibernate. Создайте диаграмму не для всей кодовой базы, но добавьте некоторый класс и затем используемые им классы.

Является ли Sparx Enterprise Architect современным в области реверс-инжиниринга или это далеко не так? Любые другие лучшие инструменты? В идеале, этот инструмент заставляет меня понимать код, как если бы я написал его сам:)

Ответы [ 6 ]

11 голосов
/ 17 апреля 2010

Книга Объектно-ориентированные модели реинжиниринга подробно описывает это. К сожалению, нет серебряной пули: -)

Тем не менее, в нем перечислено много полезных методов для захвата унаследованного кода. Вкратце

  • опросите по крайней мере некоторых из первоначальных разработчиков (если они все еще существуют) о
    • история разработки: фазы, релизы
    • текущее состояние дел
    • командная социальная структура, политика, динамика: когда и почему люди присоединялись и уходили
    • ошибки: типичные, самые простые, самые сложные
    • качество кода: самые чистые / уродливые части
    • данные конфигурации: форма, содержание и использование
    • устройство / интеграция / руководство / ... контрольные примеры и данные
    • Структура и использование филиала SCM
    • документация: что и где документировано, является ли она актуальной
    • контактные лица для внешних интерфейсов
  • Смотрите разработчиков / пользователей во время демонстрации, чтобы найти
    • основные функции
    • типичные случаи использования
    • анекдоты об использовании
    • хороший / плохой, отсутствующий / лишний функционал
  • "прочитать весь код за один час"
    • получить общее представление об иерархиях классов, интерфейсах
    • при необходимости проведите несколько сеансов
    • идентифицирует большие структуры (они часто содержат важные функции)
    • искать шаблоны дизайна
    • проверить комментарии (они могут многое раскрыть, но могут вводить в заблуждение)
  • просмотр документации (если есть)
    • просто запишите наличие определенных типов документов, например, спецификация, UML-диаграмма, Wiki, Javadoc и т. д.
    • это полезно и почему (нет)
    • это актуально
6 голосов
/ 17 апреля 2010

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

Автоматически пересозданные полные модели UML, как правило, практически бесполезны, поскольку они не могут различать важные абстракции и детали реализации - вот в чем суть таких моделей.

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

2 голосов
/ 17 апреля 2010

Просто уточним упоминание Майклсом о хороших IDE, которые могут вам помочь:

Я часто использую следующие возможности Eclipse:

  • Shift-F2, когда курсор помещен в идентификатор, вызывает Javadoc для этого идентификатора, если таковой имеется. Хорошо для навигации.
  • При наведении курсора на идентификатор появляется окно с Javadoc, если оно есть. Хорошо для напоминания при написании, например, вызов метода.
  • Представление Декларация показывает источник, где определено ключевое слово, в котором находится курсор. Это обновляется, когда курсор перемещается.
  • F3 переходит к определению текущего идентификатора.
  • Ctrl-T на идентификаторе показывает все подклассы и реализации во всплывающем окне. Очень полезно при работе с интерфейсами.
  • F4 для идентификатора вызывает иерархию реализации этого идентификатора на панели, по которой можно перемещаться. Очень полезно узнать, как все связано. Это включает в себя как классы, так и интерфейсы.
1 голос
/ 29 апреля 2010

Не извлекает высокоуровневые архитектуры, но значительно облегчает обход вашего кода Java: наш Браузер исходного кода Java . Это читает исходный код (и поддерживает файлы классов) и создает документацию в стиле Javadoc плюс исходный текст с двунаправленной гиперссылкой на информацию Javadoc. (Я один из руководителей этого).

1 голос
/ 18 апреля 2010

EclipseUML Omondo - лучший инструмент для обратного инжиниринга Java. Он переворачивает весь код Java, все пакеты и даже взаимодействие классов с интерфейсом, если не в одном пакете. Просто удивительно. Вы также можете изменить: - .учебный класс - спящие аннотации - JPA аннотации

Что мне нравится в этом инструменте, так это то, что мой код чист, потому что вся информация о модели сохраняется в формате xmi, а не как тег в моем коде. Вы также можете создать небольшую документацию внутри каждого существующего пакета, используя диаграммы в качестве представления модели. Просто изумительно и соблюдая официальную спецификацию uml 2.2. Единственная проблема в том, что это действительно слишком дорого , поэтому цена для меня остановка !!

0 голосов
/ 19 апреля 2010

Я использую Enterprise Architect для всего UML (включая реверс-инжиниринг с Java), и он отлично работает.

...