Найти тему
Влад

Абстракция и Инкапсуляция

Приветствую!

В этой статье речь пойдет о таких важных фундаментальных вещах как абстракция и инкапсуляция.

Абстракция - это метод описания какого-либо объекта, путем отброса маловажной части для описания этого самого объекта.

То есть, абстрагировать объект - значит отбросить неважные на этапе разработки части, чтобы увидеть понятную и важную картину объекта.

Обычно программисты используют этот приём при разработке своего проекта. Они не задумываются о всех методах объектов, а задумываются только над теми, которые важны для написания простого, красивого и элегантного проекта. Конечно, предположить будущую вариацию исхода событий проекта невозможно, да и не нужно! Так как это отнимает ценные ресурсы программиста, поэтому очень важно думать о ближайшем исходе событий, а не заглядывать на этапы деплоинга(deploy) проекта.

Вот например язык Python. Он является абстракцией аппаратного обеспечения компьютера.

-2

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

А вот язык Python - самый высокий уровень абстракции, ведь для сложения каких то чисел или переменных нам надо написать несколько символов, но никак не кучу нулей и единиц, как аппаратное обеспечение привыкло считывать.

Ну или представьте автомобиль. Мы сидим за рулем на сиденье, зная, что у нас под рукой есть рукоятки для поворотников, промывки стекол и т.д

Для езды нам не нужно знать, например, что происходит с инжектором, дросселем, ну или же не надо знать всю структуру строения двигателя. Мы просто: схватились за руль, жмем на педали и мы в пути! ( не забудьте помыть стекло перед отъездом)

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

На абстракции строятся 3 главных кита ООП.

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

Инкапсуляция - метод сокрытия данных от посторонних пользователей, где доступ к данным производится через специальный метод.

Этот метод позволяет защищать данные от постороннего вмешательства как со стороны пользователя, так и со стороны других программистов.

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

В Python такая схемка реализуема, но не так хороша, как в других языках.

-3

Итак, здесь мы объявили функцию private_func, но в отличии от обычных функций, мы добавили нижнее подчеркивание в начало имени функции, говоря интерпретатору, что эта функция приватная! Поэтому у нас и вышла ошибка об отсутствии такой функции за пределами класса.

-4

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

-5
-6

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

Во-первых, как видно из первых строк, я поставил уже двойные подчеркивания в названии атрибутов(переменных). Двойные подчеркивания - высшая сила приватности в инкапсуляции Python. То есть, эти атрибуты уже нельзя использовать и видоизменять за пределами класса Car(), а только можно вызывать через свойства.

Свойства - это специальные методы, которые ограничивают доступ к атрибутам, делая их приватными, то есть доступными только внутри класса где они объявлены.

В нашем коде функции get_speed и set_speed являются свойствами.

А также именно такие функции называют геттерами(get_speed) и сеттерами(set_speed). Сразу скажу, что они не являются особыми методами, как многие могли подумать, а являются лишь названиями.

С помощью метода сеттера мы задаём какие-то характеристики, в нашем случае скорость автомобиля, атрибутам. И, как вы могли заметить, сеттер перекрывает значение 1000, которое было задано с помощью init-а(конструктора класса).

С помощью метода геттера мы можем получать атрибуты из класса.

Также существует более элегантный и читабельный способ объявления методов геттера и сеттера - аннотации свойств.

(есть также и другие аннотации, о которых я, может быть, расскажу в будущем)

-7
-8
-9

Я написал другой код, где главную роль будет играть Имя и возраст человека.

На 7 строчке я написал такую команду как @property. Эта команда значит, что я объявил геттер под именем age. Затем, перед следующей функцией я записал команду @age.setter, которая означает объявление сеттера под таким же именем что и геттер(запомните, что имена геттера и сеттера должны совпадать!). 

Всю доподлинную информацию я буду выводить через метод infoAboutPerson().

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

Всем пока)