Публикации Lazarus

Инструменты Lazarus IDE. Часть II. Рефакторинг.

27.04.2005
Сергей Смирнов

За основу статьи взят документ из Lazarus-ccr

Введение

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

Начиная эту статью, я сразу хочу отметить, что мой перевод названий многих действий не всегда в точности соответствует их именованию в русской версии среды Lazarus. Я перевожу оригинальные названия так, чтобы наиболее ясно, на мой взгляд, отразить их сущность с одной стороны, и избежать неоднозначной трактовки с другой. Ничего страшного в этом нет, потому что, поняв суть описываемых действий, Вы легко разберётесь с их названиями в любом переводе.

Выполнить операции рефакторинга проще всего с помощью контекстного меню редактора исходного кода.

Обращение присваиваний (Invert Assignments)

Обращение операторов присваивания применяется к выделенному в тексте программы коду и меняет местами левый и правый аргументы операции присваивания. Это может быть удобно, например, для превращения операций сохранения данных в операции извлечения данных.

Вот более простой пример:

procedure DoSomething;
begin
AValueStudio:= BValueStudio;
AValueAppartment :=BValueAppartment;
AValueHouse:=BValueHouse;
end;
Выделите строки с присваиваниями (между begin и end) и выполните обращение присваиваний. Должно получиться примерно следующее:
procedure DoSomething;
begin
BValueStudio := AValueStudio;
BValueAppartment := AValueAppartment;
BValueHouse := AValueHouse;
end;

 

Извлечение процедуры (Extract Procedure)

Извлечение процедуры применяется к выделенным в исходном тексте операторам и создаёт новую процедуру/метод из этого выделения. Применяется для дробления больших, громоздких процедур или просто для создания новой процедуры из фрагмента кода.

Например:

procedure DoSomething;
begin
CallSomething;
end;
Выделите строку "CallSomething;" и выполните извлечение процедуры. Появится диалоговое окно, в котором Вам будет предложено ввести имя и выбрать тип создаваемой процедуры. К примеру: procedure, "NewProc". В результате исходный код будет преобразован к такому виду:
procedure NewProc;
begin
CallSomething;
end;

procedure DoSomething;
begin
NewProc;
end;
Как видно, была создана новая процедура "NewProc", внутри которой оказалась выделенная строка, а на её место был помещён вызов этой новой процедуры. Однако извлечение процедуры способно не только дробить громоздкий код, но и сканируя исходный код определять локальные переменные и параметры:

 

Например:

procedure TForm1.DoSomething(var Erni, Bert: integer);
var
i: Integer; // Comment
begin
Erni:=Erni+Bert;
for i:=Erni to 5 do begin
|
end;
end;
Выделите цикл "for" и извлеките процедуру "NewProc". Обратите внимание на некоторые особенности того, что получилось: локальная переменная "i" использовалась только в выделенном коде, поэтому она была перемещена в новую процедуру целиком, включая объявление и комментарий. Переменная "Erni" используется не только в выделении, поэтому для неё был создан параметр процедуры. Таким образом, должен получиться следующий код:
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;
Но не слишком обольщайтесь: Паскаль - очень мощный язык программирования, поэтому не стоит ожидать, что данная технология будет успешно работать с абсолютно любым кодом.

 

Найти объявление (Find Declaration)

Поместите курсор на идентификатор и выполните поиск объявления. Когда нужная декларация будет найдена, соответствующий файл откроется в новой вкладке и курсор будет установлен на искомом объявлении.

Каждый поиск объявления устанавливает точку перехода, поэтому Вы всегда можете вернуться обратно с помощью меню Поиск -> Переход назад.

Учтите, что поиск работает непосредственно с исходными кодами, благо они являются открытыми, и поэтому всегда имеются в распоряжении. Например, для компилятора тип TColor - это просто Longint, однако в исходных кодах он определён как

TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
TColor = TGraphicsColor;
Поэтому поиск объявления проведёт Вас по всей этой цепочке.

 

Переход по директиве $I (Goto Include Directive)

Данный пункт в меню Поиск позволяет перейти к той директиве {$I filename}, в которой используется текущий include-файл.

Опубликовать проект (Publish Project)

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

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

Актуальные версии
FPC3.2.2release
Lazarus3.2release
MSE5.10.0release
fpGUI1.4.1release
links