Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
все ответы.docx
Скачиваний:
8
Добавлен:
26.09.2019
Размер:
2.71 Mб
Скачать

20. Принцип инкапсуляции. (Забавная статья, но вроде понятно)

Инкапсуляция

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

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

Я иду в школу. Я (объект) иду (вызов метода) в школу (параметр метода, другой объект). Гоблин нападает на эльфа. Гоблин (объект) нападает (метод) на эльфа (параметр метода, другой объект). Мы воспринимаем образы, мы мыслим образами, мы разговариваем образами. Что тут нужно объяснять?

Инкапсуляция - «в капсуле». В оболочке. Нет более бесхозных переменных и функций. Они находятся внутри какого-нибудь класса. Класс - та самая оболочка. Класс в программном коде отражает образ и содержит в себе составляющие объекта. Проекция образа в мозге на программный код.

Код на Delphi скажет лучше длинных предложений.

Goblin1.Attack(Elf1); // Гоблин № 1 атакует Эльфа №1

А что такое «гоблин»?

Из чего формируется образ «гоблина»? Сила атаки, здоровье, возможность перемещаться, возможность атаковать другие объекты. Две переменные и две функции, объединенные общим понятием. Что такое: объединены общим понятием? С точки зрения написания объектно-ориентированного кода эти две переменные и две функции объявлены внутри класса.

В нашей голове нет бесхозных переменных (неких ячеек памяти с именем, способных хранить значение). Мы не думаем в категориях «функция» - набор действий, выполняемых над абстрактным набором входных параметров.

Мышление образами, программирование образами (классами и объектами) - более естественно, чем оперирование переменными и функциями. Нас так задумала природа.

А что такое «сокрытие»?

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

Инкапсуляция - принцип программирования, когда переменные и функции (процедуры) помещаются в класс. Класс - ограниченная область программного кода, имеющая название, в которую помещены переменные и функции (процедуры). А смысл делать класс? Смысл только в том, чтобы максимально приблизить структуру программного кода к тем образам, которые у нас в голове. Как ни странно - для того, чтобы было проще программировать. Естественнее. Удобнее. Приятнее. Не надо ходить на руках или скакать на одной ноге. Делаем так, как нас задумала природа.

Поместили мы что-то в оболочку. В нашем случае переменные и функции (процедуры). Но часть из них нужно закрыть, чтобы не испортить работу. В автомобиле есть двигатель. Снаружи он закрыт капотом, а от салона изолирован различными панелями. Чтобы грязь не попадала. И чтобы пальцы в него не совали. Для блага же пассажиров. Двигатель находится в своем закрытом отсеке. А «наружу» выведены лишь кнопки, рычаги и педали. Их можно (и безопасно) трогать. С их помощью мы управляем автомобилем. Также и с классами. Часть переменных и функций скрываются во имя безопасности. Другая часть - специально делается доступной, открытой. Сокрытие - изоляция содержимого класса от внешнего мира (остального программного кода). Программист (создатель) класса сам должен решить, что спрятать для соблюдения безопасности, а что «вывести наружу» в качестве органов управления. Для Delphi часть содержимого класса прячется в разделе private (закрытый раздел), а часть - располагается под директивой public (открытый раздел).

Интерфейс

Интерфейс - открытая, доступная часть содержимого класса. Зачем часть содержимого класса открывается (делается доступной)? Чтобы с объектом можно было взаимодействовать. Взаимодействие с автомобилем выполняется посредством его интерфейса - руль, педали, рычаги, кнопки. Если неправильным образом спроектировать интерфейс, класс не будет работать. Если убрать педаль газа, то автомобиль не сдвинется с места. Однако выводить выхлопную трубу в салон тоже не стоит. Подобные рассуждения выглядят тривиально. Но это лишний раз доказывает всю тривиальность (в позитивном значении) сокрытия в рамках объектно-ориентированного подхода.