Инструменты Lazarus IDE. Часть II. Рефакторинг. |
27.04.2005 Сергей Смирнов |
За основу статьи взят документ из Lazarus-ccr
Рефакторинг - это очень мощное средство улучшения исходного кода. Оно позволяет автоматизировать многие рутинные операции, не только радикально ускоряя их выполнение, но и избавляя программиста от связанных с этим неприятных эмоций.
Начиная эту статью, я сразу хочу отметить, что мой перевод названий многих действий не всегда в точности соответствует их именованию в русской версии среды Lazarus. Я перевожу оригинальные названия так, чтобы наиболее ясно, на мой взгляд, отразить их сущность с одной стороны, и избежать неоднозначной трактовки с другой. Ничего страшного в этом нет, потому что, поняв суть описываемых действий, Вы легко разберётесь с их названиями в любом переводе.
Выполнить операции рефакторинга проще всего с помощью контекстного меню редактора исходного кода.
Обращение операторов присваивания применяется к выделенному в тексте программы коду и меняет местами левый и правый аргументы операции присваивания. Это может быть удобно, например, для превращения операций сохранения данных в операции извлечения данных.
Вот более простой пример:
procedure DoSomething;Выделите строки с присваиваниями (между begin и end) и выполните обращение присваиваний. Должно получиться примерно следующее:
begin
AValueStudio:= BValueStudio;
AValueAppartment :=BValueAppartment;
AValueHouse:=BValueHouse;
end;
procedure DoSomething;
begin
BValueStudio := AValueStudio;
BValueAppartment := AValueAppartment;
BValueHouse := AValueHouse;
end;
Извлечение процедуры применяется к выделенным в исходном тексте операторам и создаёт новую процедуру/метод из этого выделения. Применяется для дробления больших, громоздких процедур или просто для создания новой процедуры из фрагмента кода.
Например:
procedure DoSomething;Выделите строку "CallSomething;" и выполните извлечение процедуры. Появится диалоговое окно, в котором Вам будет предложено ввести имя и выбрать тип создаваемой процедуры. К примеру: procedure, "NewProc". В результате исходный код будет преобразован к такому виду:
begin
CallSomething;
end;
procedure NewProc;Как видно, была создана новая процедура "NewProc", внутри которой оказалась выделенная строка, а на её место был помещён вызов этой новой процедуры. Однако извлечение процедуры способно не только дробить громоздкий код, но и сканируя исходный код определять локальные переменные и параметры:
begin
CallSomething;
end;
procedure DoSomething;
begin
NewProc;
end;
Например:
procedure TForm1.DoSomething(var Erni, Bert: integer);Выделите цикл "for" и извлеките процедуру "NewProc". Обратите внимание на некоторые особенности того, что получилось: локальная переменная "i" использовалась только в выделенном коде, поэтому она была перемещена в новую процедуру целиком, включая объявление и комментарий. Переменная "Erni" используется не только в выделении, поэтому для неё был создан параметр процедуры. Таким образом, должен получиться следующий код:
var
i: Integer; // Comment
begin
Erni:=Erni+Bert;
for i:=Erni to 5 do begin
|
end;
end;
procedure NewProc(const Erni: integer);Но не слишком обольщайтесь: Паскаль - очень мощный язык программирования, поэтому не стоит ожидать, что данная технология будет успешно работать с абсолютно любым кодом.
var
i: Integer; // Comment
begin
for i:=Erni to 5 do begin
|
end;
end;
procedure TForm1.DoSomething(var Erni, Bert: integer);
begin
Erni:=Erni+Bert;
NewProc(Erni);
end;
Поместите курсор на идентификатор и выполните поиск объявления. Когда нужная декларация будет найдена, соответствующий файл откроется в новой вкладке и курсор будет установлен на искомом объявлении.
Каждый поиск объявления устанавливает точку перехода, поэтому Вы всегда можете вернуться обратно с помощью меню Поиск -> Переход назад.
Учтите, что поиск работает непосредственно с исходными кодами, благо они являются открытыми, и поэтому всегда имеются в распоряжении. Например, для компилятора тип TColor - это просто Longint, однако в исходных кодах он определён как
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;Поэтому поиск объявления проведёт Вас по всей этой цепочке.
TColor = TGraphicsColor;
Данный пункт в меню Поиск позволяет перейти к той директиве {$I filename}, в которой используется текущий include-файл.
Этот пункт в меню Проект предназначен для создания отдельной копии целого проекта. Если Вы хотите, например, послать кому-нибудь только исходники, то данная функция позволит исключить разного рода служебную информацию и результаты компиляции модулей проекта.
При выполнении этой функции появляется диалоговое окно, где Вы можете также задать различные настройки, например фильтры для включения и исключения файлов, команду, запускаемую после создания публикации, с помощью которой можно заархивировать то, что у Вас получилось.