Книга: Рефакторинг. Зачем?
Приватные члены класса
Приватные члены класса
В прошлой главе мы создали первый метод. Он вычисляет длину отрезка. На современных машинах это вычисление занимает совсем немного времени, однако, предположим, что действие это не такое быстрое и для каждой линии выполняется многократно.
Есть много способов решения подобной проблемы, но один из самых простых и универсальных — это кэширование.
Действительно, зачем считать длину каждый раз, если это можно сделать единожды, запомнить посчитанное значение и потом, в качестве результата функции, возвращать его.
Вот как это могло бы выглядеть:
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 трогать не надо. По крайней мере, если вы не планируете менять внутренней логики класса.
- Введение
- Именование переменных и функций
- Стандартные имена функций и переменных
- Преобразование одной большой функции в две маленькие
- Признаки необходимости выделения функции
- Выделение функции в процессе написания
- Когда не следует выделять функцию
- Использование модулей
- Более сложные способы организации данных
- Объединение данных и кода
- Приватные члены класса
- Свойства
- Наследование
- Содержание книги
- Популярные страницы
- 3.4. Отношения между классами
- 9.7.1. Определение подкласса
- Инварианты класса и семантика ссылок
- Реализация класса бинарных деревьев
- Статические члены
- Определение членов класса
- Запуск виртуального класса
- Листинг 8.9. Сравнение эффективности использования строк и класса StringBuilder в алгоритмах
- Компоненты класса и АТД функции
- 5.12.2 Присваивание сети адресов класса В
- Глава 4. Самые трудные задачи класса NP
- Определение открытого интерфейса класса