Множество переменных простых типов могут объединяться в массивы, но это ещё не всё. По–настоящему гибким программирование стало с появлением классов.
Это понятие, на мой взгляд, одно из самых трудных для понимания начинающих программистов, поэтому, я планирую уделить ему достаточно много времени, прежде чем перейти непосредственно к рефакторингу. Если вы знакомы с классами — вам может стать скучно, в таком случае — можете пропустить эту главу.
Я уже писал, что название переменной должно отражать её содержимое. То есть переменная с названием Line — должна каким–то образом описывать отрезок или прямую. Чаще всего данную сущность описывают двумя точками. Если пользоваться только простыми типами — нам придётся завести 4 переменные, например, X1, Y1, X2, Y2. А в случае, если у нас несколько линий, для того, чтобы отличать одну от другой — нам придётся переназвать переменные, например: Line1X1, Line1Y1, Line1X2, Line1Y2. Не очень удобно, правда?
Для решения подобных задач, уже давно, был придуман новый тип данных — record или struct, в зависимости от языка. Сейчас этот тип практически полностью вытеснен классами и его использование для большинства задач считается плохим тоном. Поэтому не буду останавливаться на этом, тем более, что рефакторинг к рекордам практически не применим.
И так, мы решили создать класс для нашей линии. Вот так видит декларация (описание) класса:
>type
>TLine = class(TObject)
>public
>X1: Integer;
>Y1: Integer;
>X2: Integer;
>Y2: Integer;
>end;
В данном случае — ключевое слово type — определяет начало блока объявлений новых типов данных. Стандартная конструкция языка Pascal. Для других языков синтаксис будет отличаться. TLine — название нашего класса. “= class(TObject)» — означает, что мы определяем класс, наследованный от класса TObject. Это базовый класс в Object Pascal. Все классы так или иначе наследованы от него. Подробнее на эту тему поговорим, когда будем обсуждать наследование.
Ключевое слово public определяет область видимости переменных и функций, объявленных в текущем блоке. Подробнее об этом также поговорим после. Ключевое слово end завершает определение класса.
Мы создали новый класс, но как им пользоваться? Для этого надо создать экземпляр класса:
>var
>Line: TLine;
>begin
>Line:= TLine. Create;
>end;
В данном фрагменте кода мы объявляем переменную Line типа TLine, после чего, создаём новый экземпляр класса TLine и присваиваем его переменной Line.
Часто путают понятия класс и объект, так вот, в нашем случае объект — это Line, а класс — TLine.
Объединение данных и кода
В прошлой главе мы создали новый класс, научились создавать экземпляры классов и на этом закончили. Давайте эту главу начнём с примера использования данной конструкции:
>function CalculateLineLength(Line: TLine): Double;
>begin
>Result:= Sqrt(Sqr(Line. X2 — Line. X1) + Sqr(Line. Y2 — Line. Y1));
>end;
>var
>Line: TLine;
>LineLenght: Double;
>begin
>Line:= TLine. Create;
>Line. X1:= 10;
>Line. Y1:= 10;
>Line. X2:= 20;
>Line. Y2:= 20;
>LineLenght:= CalculateLineLength(Line);
>end;
Тут мы создаём новую линию и рассчитываем её длину. Для этого мы завели вспомогательную функцию