ПОНЯТНО О Visual Basic NET (том 3)

Инкапсуляция – «Объект в футляре»


Нам будет легче проникнуть в суть объектов в программировании, если мы рассмотрим основные их понятия на аналогии с объектами реального мира, которые они очень напоминают. В качестве примера разберем игрушечный радиоуправляемый автомобиль. Посмотрим, где у него данные и действия:

Данные. У игрушечного автомобиля данных множество. Например:

  • Цвет кузова
  • Номер автомобиля
  • Скорость движения в данный момент
  • Громкость звукового сигнала
  • Высота кресел
  • Величина электрического тока в двигателе в данный момент
  • Толщина гайки в таком-то месте внутри корпуса
  • И так далее и тому подобное.

    Действия. Действий тоже достаточно. Например:

    • Поворот по команде с пульта управления
    • Торможение по команде с пульта управления
    • Подпрыгивание автомобиля на маленьком камушке
    • Изменение скорости вращения электродвигателя при изменении в нем тока


    • Возникновение жужжания двигателя при трении шестеренок друг о друга.
    • И так далее и тому подобное.

      «Внешние» и «внутренние» данные и действия. Как видите, данные и действия бывают крупные и мелкие, важные и менее важные. Но нас интересует другое подразделение, а именно подразделение:

      • на те данные и действия, что видны или доступны для запуска снаружи автомобиля со стороны внешних объектов, например, прохожих или мальчика, держащего в руках пульт управления (такие данные и действия близки понятию глобальных переменных и методов).
      • и на те данные и действия, что не видны или не доступны (а эти близки понятию модульных).
      • Проведем это подразделение построже и поподробнее. Сначала поговорим о данных.

        Свойства. Данные будем делить на те, что видны снаружи (это первые 5 из списка), и те, что не видны (последние 2). Данные, видимые снаружи, назовем свойствами

        объекта. (С точки зрения грамматики языка VB данные, видимые снаружи, делятся на свойства и на поля, но мы пока не будем концентрироваться на этом делении и все такие данные будем пока называть свойствами. Если переменная объявлена словом Public, то она видна снаружи и является полем.)

        Итак, свойства – это данные, видимые снаружи. Теперь будем подразделять свойства по доступности к изменению. Мы их разделим на две категории:


        • Те, что можно произвольно менять снаружи. Вообразим, например, что любой прохожий, вооружившись кистью, ведром краски и крюком, может произвольно поменять цвет, номер и скорость проезжающего автомобиля. В реальной жизни так не бывает, но в программировании это сделать очень легко. Назовем их свойствами для чтения-записи.


        • Те, что снаружи менять нельзя (у нас это последние 4 данных из списка). Назовем их свойствами только для чтения.


        • Очевидно, что данные, которые не видны снаружи, и менять снаружи тоже нельзя. В программировании это локальные переменные или модульные переменные, объявленные модификаторами Dim или Private.

          Методы. Действия будем делить на те, которые можно вызывать снаружи (первые 2 действия из списка), и те, что вызываются внутренней механикой автомобиля (остальные). Действия, вызываемые снаружи, назовем методами объекта. В программировании это процедуры и функции, объявленные, например, словом Public. Если процедура или функция объявлена словом Private, то снаружи она не видна и методом не является.

          Надежность, защищенность, простота. Создатель нашего игрушечного автомобиля при его конструировании стремится к тому, чтобы автомобиль был надежен, защищен и просто управлялся. Для этого он должен придерживаться двух принципов:

          • Количество методов должно быть минимально необходимым. Разгон, торможение, поворот налево и направо. Этого достаточно. Если разрешить управлять с пульта жужжанием двигателя и тонким процессом изменения скорости вращения колес при изменении тока в двигателе, то недолго и сжечь двигатель, нажав на пульте не ту комбинацию кнопок.


          • Количество свойств для чтения-записи должно быть минимальным. Действительно, вообразим крайний случай: все данные мы сделали свойствами, да еще и для чтения-записи. Тогда любой, кому не лень, сможет в любой момент менять, например, величину тока в двигателе, что немедленно приведет к катастрофе. Или, например, вообразите, что вы мчитесь в автомобиле, а любой прохожий может протянуть руку и покрутить баранку вашего автомобиля.




          • А теперь о том, нужно ли все данные делать свойствами, то есть делать их видимыми отовсюду. Дело вкуса. Покуда вы не делаете их свойствами для чтения-записи, это не влияет на надежность объекта. Сами решайте, нужно ли всем желающим видеть высоту сидений и величину тока. Конечно, когда речь идет о реальном игрушечном автомобиле, все получается как-то само собой: что снаружи – видно, что изнутри – не видно и ничего тут не поделаешь. Но у программиста имеется полная свобода любое данное сделать или не сделать свойством, в том числе и для чтения-записи, и любое действие сделать или не сделать методом.

            Инкапсуляция. При создании объектов программисты стараются придерживаться принципа инкапсуляции, который заключается в следующем:

            Данные и действия объекта представляют собой единое целое, образующее всю механику объекта, и хранятся они в одной «упаковке». Упаковкой этой, является, как вы понимаете, класс. Они должны быть как можно меньше видимы снаружи. Хорошо инкапсулированный объект представляет собой некий «черный ящик», эдакого «человека в футляре». Вся работа идет внутри. Внутренние данные меняются при помощи внутренних действий. Никто снаружи не может вмешаться в эту внутреннюю работу. Наружу показывается лишь тот минимум (интерфейс), который необходим для связи с окружающим миром.

            Влиять снаружи на работу объекта можно только тремя способами:

            • Методами


            • Изменяя значения свойств для чтения-записи


            • Изменяя свойства окружающего мира, например, положив на пути автомобиля камешек.


            • Инкапсуляция – то, что объединяет объекты в программировании с объектами реального мира. Возьмите летящий высоко самолет. Вы не можете снаружи ни видеть работу его двигателя, ни как-то повлиять на нее.  Вы вообще никак не можете повлиять на самолет ни в чем. Общаетесь вы с ним не тогда, когда хотите вы, а когда хочет он и по правилам, которые устанавливаются не вами (например, в аэропорту).

              Все вышесказанное является введением в идеологию объектного программирования. Как мне кажется, это введение поможет вам легче разобраться в механике работы реальных объектов, создаваемых вами на компьютере.


              Содержание раздела