воскресенье, 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, то среда сначала покажет все места, где переменная будет переименована, перед подтверждением программистом.
Продолжим здесь: Работа со строками

Секреты Delphi или переход с Pascal

Обычно, начинающие программисты, переходя с языка Pascal на Delphi, перетаскивают свои старые функции и прочие участки часто встречающегося кода без изменений, не зная, сколько всего уже реализовано в VCL. Связанно это, прежде всего, с тем, что чаще всего при преподавании языка Pascal в учебных заведениях рассматривают только модули CRT и Graph, содержащие только базовые функции, а современные технические писатели, описывающие Delphi, рассматривают только малую часть всех возможностей данного языка. Вот и выходит, что код нагромождается лишними, часто неоптимизированными функциями.
Так было и со мной, когда после года изучения языка Pascal в вузе, я решил сам освоит Delphi. Купил несколько книжек по данному языку, разобрался с тем, как создавать формы, вводить и выводить данные, стал писать простенькие программы. Но чем больше я углублялся в Delphi, тем чаще стал замечать, что большинство написанного мною кода уже реализовано в стандартных модулях. Изучая исходный код VCL, я открыл для себя много замечательных функций и типов, которые здорово облегчили бы мне работу над многими программами. Сейчас, разрабатывая уже достаточно сложные программы, прежде чем написать какую-нибудь функцию, которая делает более-менее стандартные действия, я проверяю - нет ли уже её реализации в VCL и, процентах в тридцати, такая функция оказывается.
Так вот, совершенно недавно, открыв для себя замечательным модуль ConvUtils (о нем мы еще поговорим), я решил написать данную статью, дабы рассказать новичкам, стремящимся изучить замечательный язык программирования Delphi, о скрытых функциях и возможностях, которые почти нигде не описаны и сразу не бросаются в глаза.
Итак, начнем: Рефакторинг.

О чем этот блог?

Да собственно о том же, о чем и говорит его название. Определенные мысли могут возникать спонтанно и не всегда запоминаются, а так: что-то придумал, вспомнил что-то о чем хотел написать и сразу вынес текущую мысль на все общее обозрение.
Например, я уже давно пытаюсь написать статью "Секреты Delphi или переход с Pascal", но все никак: то не хватает времени, то нахожусь там, где нет доступа к компьютеру. А бывает что и засяду наконец за неё, а о чем хотел написать уже и не вспомню (вернее не могу вспомнить как, хотя до этого в голове был стройный текст).
Вот я и решил завести данный блог. Сижу, решаю какую-нибудь задачу и вдруг раз, и нашел интересное, как мне кажется, решение. Останется только занести его в блог, и оно уже никуда не денется. В общем скоро будет первая мысль!