Lazarus
27.04.2005 Сергей Смирнов
Инструменты Lazarus IDE. Рефакторинг.
За основу статьи взят документ из
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)
Этот пункт в меню Проект предназначен для
создания отдельной копии
целого проекта. Если Вы хотите, например, послать кому-нибудь только
исходники, то данная функция позволит исключить разного рода служебную
информацию и результаты компиляции модулей проекта.
При выполнении этой функции появляется
диалоговое окно, где Вы
можете также задать различные настройки, например фильтры для включения
и исключения файлов, команду, запускаемую после создания публикации, с
помощью которой можно заархивировать то, что у Вас получилось.
|