Инкапсуляция – «Объект в футляре»
Нам будет легче проникнуть в суть объектов в программировании, если мы рассмотрим основные их понятия на аналогии с объектами реального мира, которые они очень напоминают. В качестве примера разберем игрушечный радиоуправляемый автомобиль. Посмотрим, где у него данные и действия:
Данные. У игрушечного автомобиля данных множество. Например:
- Цвет кузова
- Номер автомобиля
- Скорость движения в данный момент
- Громкость звукового сигнала
- Высота кресел
- Величина электрического тока в двигателе в данный момент
- Толщина гайки в таком-то месте внутри корпуса
- Поворот по команде с пульта управления
- Торможение по команде с пульта управления
- Подпрыгивание автомобиля на маленьком камушке
- Изменение скорости вращения электродвигателя при изменении в нем тока
- Возникновение жужжания двигателя при трении шестеренок друг о друга.
- на те данные и действия, что видны или доступны для запуска снаружи автомобиля со стороны внешних объектов, например, прохожих или мальчика, держащего в руках пульт управления (такие данные и действия близки понятию глобальных переменных и методов).
- и на те данные и действия, что не видны или не доступны (а эти близки понятию модульных).
- Те, что можно произвольно менять снаружи. Вообразим, например, что любой прохожий, вооружившись кистью, ведром краски и крюком, может произвольно поменять цвет, номер и скорость проезжающего автомобиля. В реальной жизни так не бывает, но в программировании это сделать очень легко. Назовем их свойствами для чтения-записи.
- Те, что снаружи менять нельзя (у нас это последние 4 данных из списка). Назовем их свойствами только для чтения.
- Количество методов должно быть минимально необходимым. Разгон, торможение, поворот налево и направо. Этого достаточно. Если разрешить управлять с пульта жужжанием двигателя и тонким процессом изменения скорости вращения колес при изменении тока в двигателе, то недолго и сжечь двигатель, нажав на пульте не ту комбинацию кнопок.
- Количество свойств для чтения-записи должно быть минимальным. Действительно, вообразим крайний случай: все данные мы сделали свойствами, да еще и для чтения-записи. Тогда любой, кому не лень, сможет в любой момент менять, например, величину тока в двигателе, что немедленно приведет к катастрофе. Или, например, вообразите, что вы мчитесь в автомобиле, а любой прохожий может протянуть руку и покрутить баранку вашего автомобиля.
- Методами
- Изменяя значения свойств для чтения-записи
- Изменяя свойства окружающего мира, например, положив на пути автомобиля камешек.
И так далее и тому подобное.
Действия. Действий тоже достаточно. Например:
И так далее и тому подобное.
«Внешние» и «внутренние» данные и действия. Как видите, данные и действия бывают крупные и мелкие, важные и менее важные. Но нас интересует другое подразделение, а именно подразделение:
Проведем это подразделение построже и поподробнее. Сначала поговорим о данных.
Свойства. Данные будем делить на те, что видны снаружи (это первые 5 из списка), и те, что не видны (последние 2). Данные, видимые снаружи, назовем свойствами
объекта. (С точки зрения грамматики языка VB данные, видимые снаружи, делятся на свойства и на поля, но мы пока не будем концентрироваться на этом делении и все такие данные будем пока называть свойствами. Если переменная объявлена словом Public, то она видна снаружи и является полем.)
Итак, свойства – это данные, видимые снаружи. Теперь будем подразделять свойства по доступности к изменению. Мы их разделим на две категории:
Очевидно, что данные, которые не видны снаружи, и менять снаружи тоже нельзя. В программировании это локальные переменные или модульные переменные, объявленные модификаторами Dim или Private.
Методы. Действия будем делить на те, которые можно вызывать снаружи (первые 2 действия из списка), и те, что вызываются внутренней механикой автомобиля (остальные). Действия, вызываемые снаружи, назовем методами объекта. В программировании это процедуры и функции, объявленные, например, словом Public. Если процедура или функция объявлена словом Private, то снаружи она не видна и методом не является.
Надежность, защищенность, простота. Создатель нашего игрушечного автомобиля при его конструировании стремится к тому, чтобы автомобиль был надежен, защищен и просто управлялся. Для этого он должен придерживаться двух принципов:
А теперь о том, нужно ли все данные делать свойствами, то есть делать их видимыми отовсюду. Дело вкуса. Покуда вы не делаете их свойствами для чтения-записи, это не влияет на надежность объекта. Сами решайте, нужно ли всем желающим видеть высоту сидений и величину тока. Конечно, когда речь идет о реальном игрушечном автомобиле, все получается как-то само собой: что снаружи – видно, что изнутри – не видно и ничего тут не поделаешь. Но у программиста имеется полная свобода любое данное сделать или не сделать свойством, в том числе и для чтения-записи, и любое действие сделать или не сделать методом.
Инкапсуляция. При создании объектов программисты стараются придерживаться принципа инкапсуляции, который заключается в следующем:
Данные и действия объекта представляют собой единое целое, образующее всю механику объекта, и хранятся они в одной «упаковке». Упаковкой этой, является, как вы понимаете, класс. Они должны быть как можно меньше видимы снаружи. Хорошо инкапсулированный объект представляет собой некий «черный ящик», эдакого «человека в футляре». Вся работа идет внутри. Внутренние данные меняются при помощи внутренних действий. Никто снаружи не может вмешаться в эту внутреннюю работу. Наружу показывается лишь тот минимум (интерфейс), который необходим для связи с окружающим миром.
Влиять снаружи на работу объекта можно только тремя способами:
Инкапсуляция – то, что объединяет объекты в программировании с объектами реального мира. Возьмите летящий высоко самолет. Вы не можете снаружи ни видеть работу его двигателя, ни как-то повлиять на нее. Вы вообще никак не можете повлиять на самолет ни в чем. Общаетесь вы с ним не тогда, когда хотите вы, а когда хочет он и по правилам, которые устанавливаются не вами (например, в аэропорту).
Все вышесказанное является введением в идеологию объектного программирования. Как мне кажется, это введение поможет вам легче разобраться в механике работы реальных объектов, создаваемых вами на компьютере.