Есть ли какой-либо инструмент или надстройка для Delphi, которые я могу использовать для поддержки кода рефакторинга, который не является объектно-ориентированным?

У меня есть большая база кода, с которой я работаю, у которой есть такие единицы:

unit myformunit;

interface
type
  TMyForm = class(Form)
  end;

  procedure not_a_method1;

  procedure not_a_method2;

  var
     global1,global2,global3:Integer;
  ...

Короче говоря, авторы кода не писали методы, они писали глобальные процедуры. Их десятки тысяч. Внутри этих процедур они ссылаются на один экземпляр MyForm:TMyForm.

Я рассматриваю возможность написания утилиты анализатора/перезаписи, которая превратит этот код в "по крайней мере минимально объектно-ориентированный код". Стратегия состоит в том, чтобы перенести глобалы раздела интерфейса и реализации в форму в начале. Я понимаю, что едва ли элегантный ООП. Но это шаг вперед от глобальных.

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

В принципе, что я буду делать, если ничего подобного не существует, напишите парсер, основанный на парсере Castalia Delphi. Я надеюсь, что, возможно, ModelMakerCodeExplorer, или castalia, или какой-либо другой подобный инструмент имеет то, что, по крайней мере, будет частью того, что мне нужно для меня, поэтому мне не нужно самостоятельно создавать эту утилиту. Даже если мне придется строить его самостоятельно, я считаю, что он может автоматизировать для меня от тысячи до двух тысяч часов работы. Я могу хотя бы запустить его, а затем посмотреть, сколько разрывов, а затем вернуться или зафиксировать после того, как я решился на уровень усилий по рефакторингу этого кода.

Альтернативные стратегии, которые достигают одной и той же цели (перейдите от нулевой инкапсуляции и нулевого ООП к более инкапсуляции и немного больше нуля ООП, поэтапно, на большой неструктурированной базе данных delphi, которая использовала только объекты, когда это было неизбежно, и никогда не имели представления о реальном ООП) приветствуются.

Ответ 1

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

Затем используйте ModelMaker Code Explorer, чтобы переместить процедуры и функции в форму, которая только вырезана и вставляется в представление элемента.

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

Или я что-то пропустил?

Ответ 2

Плагин Delphi Sonar (с открытым исходным кодом) не исправляет код, но его можно использовать и настроить для поиска 'bad code':

Плагин Delphi Sonar позволяет анализировать проекты, написанные с использованием Delphi или Pascal. Он был протестирован с проектами, написанными на Delphi 6, 7, 2006 и XE. Этот плагин является пожертвованием Sabre Airline Solutions. это тесты включают: подсчет строк кода, операторов, количество файлов, классы, пакеты, методы, аксессоры, общедоступный API (методы, классы и поля), отношение комментариев, CPD (дублирование кода, количество строк, блок и количество файлов), сложность кода (по методу, классу, файл; сложность распределения по методам, классам и файлам), LCOM4 и RFC, отчеты об испытаниях модулей, правила, отчеты о покрытии кода, исходный код подсветка для модульных тестов, распознавание кода "Dead", неиспользуемые файлы признание.