Читаем Рефакторинг. Зачем? полностью

В месте использования код также становтся наглядней. Строка LineLenght:= CalculateLineLength(Line); заменится на строку: LineLenght:= Line. CalculateLineLength;, что несколько короче и куда лучше подчёркивает тот факт, что функция относится именно к линии, а не к чему–то ещё.

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

И немного из терминологии. Функцию член класса принято называть методом. В нашем случае, мы имеем класс с одним методом CalculateLineLength.

<p><strong>Приватные члены класса</strong></p>

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

Есть много способов решения подобной проблемы, но один из самых простых и универсальных — это кэширование.

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

Вот как это могло бы выглядеть:

type

TLine = class(TObject)

public

X1: Integer;

Y1: Integer;

X2: Integer;

Y2: Integer;

LengthCalculated: Boolean;

LineLength: Double;

function CalculateLineLength: Double;

end;

function TLine. CalculateLineLength: Double;

begin

if not LengthCalculated then

begin

LineLength:= Sqrt(Sqr(X2 — X1) + Sqr(Y2 — Y1));

LengthCalculated:= True;

end;

Result:= LineLength;

end;

При всей иллюзии работоспособности, в данном коде присутствует целый спектр проблем. Во–первых, тому, кто будет использовать класс снаружи, будет неочевидно, что необходимо вызывать функцию CalculateLineLength и не корректно напрямую использовать поле LineLength. Ну а во–вторых — нет механизма пересчёта длины при изменении координат точек.

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

Мы уже упоминали, да и не раз сталкивались с ключевым словом public, теперь пришло время рассказать, что оно означает. Члены класса, объявленные как public доступны как внутри класса, так и за его пределами.

Кроме public, есть ещё и ключевое слово private, которое означает, что члены класса доступны только из методов данного класса и не доступны за его пределами. В Object Pascal реализации, используемой в компиляторе Delphi, у данной функциональности есть особенность. Видимость private распространяется не только на членов класса, но и на весь модуль, в котором объявлен класс, что является неким отклонением от общих принципов, но уж так сложилось исторически, ничего не попишешь.

Так или иначе, private члены классов — это некие служебные поля и методы (переменные и функции), не предназначенные для использования за пределами класса.

Давайте посмотрим, как будет выглядеть декларация нашего класса, если мы унесём в private секцию всё лишнее:

type

TLine = class(TObject)

private

LengthCalculated: Boolean;

LineLength: Double;

public

X1: Integer;

Y1: Integer;

X2: Integer;

Y2: Integer;

function CalculateLineLength: Double;

end;

Данная реализация вполне себе красноречиво говорит, что поля LengthCalculated и LineLength трогать не надо. По крайней мере, если вы не планируете менять внутренней логики класса.

<p><strong>Свойства</strong></p>

Для того, чтобы можно было каким–то образом реагировать на изменения значений полей классов, были придуманы свойства (property). Они так же могут перекликаться с понятиями getter и setter.

Сначала я приведу пример кода, а потом поясню что происходит. Думаю так будет понятнее:

type

TLine = class(TObject)

private

LengthCalculated: Boolean;

LineLength: Double;

FX2: Integer;

FY2: Integer;

FX1: Integer;

FY1: Integer;

procedure SetX1(const Value: Integer);

procedure SetX2(const Value: Integer);

procedure SetY1(const Value: Integer);

procedure SetY2(const Value: Integer);

public

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных