воскресенье, 15 февраля 2009 г.

Рефакторинг.

Сама среда разработки дает нам в руки множество возможностей, очень облегчающих жизнь. Все мы знаем про то, что после точки Delphi предложит набор свойств и методов, доступных в данном классе, а вот про то, что если нажать Ctrl+Пробел, то среда предложит набор функций и констант, доступных во всех подключенных модулях, плюс все переменные, свойства и методы данного модуля – знают немногие.
Многим не нравится то, что в Pascal (соответственно и в Delphi) переменные объявляется в специальной секции Var и часто, чтобы объявить новую переменную приходиться прокручивать много кода. В последних версиях Delphi эта «проблема» решена: достаточно написать var и нажать Tab. Среда создаст строку: LVar: Integer; Пишем имя будущей переменной, нажимаем Tab, задаем тип и нажимаем Tab еще раз. Среда сама переместить переменную в секцию var. Так же эта возможность (как и другие сокращения) доступны через Ctrl+Пробел. Можно же сделать иначе: написать имя будущей переменной прямо в коде функции, навести на неё курсор и нажать Shist+Ctrl+V. Появиться окно Declare Variable. В поле Name будет имя новой переменной, которое нельзя изменить. В поле Type – тип будущей переменной, если среда определила его неверно, то его можно изменить. Если включить флажок Array, то среда создаст динамический массив указанного типа, с глубиной вложенностью указанной в поле Dimensions. Если включить флажок Set Value, то можно будет указать значение переменной, присваемое ей при инициализации. Так же новую переменную можно сделать полем класса. Для этого надо нажать Shift+Ctrl+D. Изменяемые поля в окне Declare New Field те же что и Declare Variable.
Еще одна замечательная возможность среды – Extract Method. Например, при написании какой-то функции выходит так, что часть кода будет использоваться где-то еще. Можно при написании другой функции скопировать эту часть кода, объявит те же переменные, присвоить им значения, в общем, подгонять код под другие условия. А можно использовать это код как отдельную функцию. Но вырезать уже написанные строки, создавать новую функцию с необходимыми параметрами, и вставлять в неё код – будет дольше, чем выделить написанное, и нажать Shift+Ctrl+M. Появиться новое окно Extract Method. В окно New method name вводим имя нового метода, а в окне Sample extracted code будет представлен будущий код. Причем все переменные которые используются только внутри выделенного участка перенесутся в секцию Var нового метода, а все переменные которые используются и в другом коде будут переданы в новый метод в качестве параметров. Нажмем ok, и выделенные строки перенесутся в новый метод, а на их месте появиться его вызов. Конечно, не всегда новый метод создается безупречно, и приходится что-то правит вручную, однако эта возможность действительно очень удобна.
Так же стоит обратить внимание на Sync Edit Mode. Предположим, что в уже написанном и отлаженном модуле, содержащем приличное количество строк, нужно изменить имя глобальной переменной. Сделать это быстро, но потом придется потратить немало времени, переименовывая эту переменную везде, где они встречается. Воспользоваться вслепую функцией «Замена» тоже удается не всегда, например, когда надо переименовать переменную «i» или «s», так как это буквы наверняка входят в имена других переменных и методов. Конечно, можно возложить работу на компилятор – попытаться скомпилировать модуль, а потом пройтись по всем ошибкам исправляя имя переменной. Но самый быстрый и, на мой взгляд, верный способ решить данную задачу – это выделить текст всего модуля комбинацией Ctrl+A и нажав Shift+Ctrl+J, изменить имя переменной только там где оно объявлено. Среда сама переименует её везде, где она используется. Замечу, что так можно изменять не только имена переменных, но и методов и свойств классов, имена самих классов и имена функций и процедур. Так же можно не выделить текст всего модуля, а только конкретный участок. Изменить же имя только переменной можно еще одним способом: навести курсор на переменную которую надо переименовать и нажать Shift+Ctrl+E. В появившемся окне Rename variable поле New name задаем новое имя. Если оставить галочку View reference before refactoring, то среда сначала покажет все места, где переменная будет переименована, перед подтверждением программистом.
Продолжим здесь: Работа со строками

2 комментария:

  1. а не в курсе, можно ли автогенерировать реализацию класса (Ctrl+Shift+C), так, чтобы методы генерировались в том порядке, в котором я их объявил, а не по алфавиту?

    ОтветитьУдалить
  2. Честно говоря не встречал такой настройки. Если вдруг она все-таки найдется, буду признателен за информацию.

    ОтветитьУдалить