ООП – Простыми словами

ООП – это объектно-ориентированное программирование. Это, кстати, одна из тех трёх вещей, о которых узнал Стив Джобс, когда посетил Xerox и украл у них идею GUI (графического пользовательского интерфейса). Ещё Стив Джобс говорил, что каждому человеку следует научиться мыслить как программист.

Так вот! Объектно-ориентированное программирование. Разберём эту фразу на части:

  • программирование
  • программирование %какое-то% – т.е. объектно-ориентированное
  • объектно-ориентированное или ориентированное на объекты

Программирование – это написание инструкций для компьютера, которые он исполняет. Эти инструкции иначе ещё называются программным кодом. И существуют различные способы того, как мы будем оформлять эти инструкции. Один из этих способов оформления инструкций – объектно-ориентированное программирование. Ещё бывает функциональное программирование, логическое программирование и ещё их есть несколько, но объектно-ориентированное, безусловно, самое популярное.

Объектно-ориентированное программирование = программирование, ориентированное на объекты, тут мы получаем понятие “объект”. Что такое объект? Объект, в контексте программирование – это нечто, что обладает различными характеристиками. Возьмём, например, кошелёк. Допустим, в реальном мире у Васи есть кошелёк и в кошельке 100 рублей. Если мы будем писать код, то нам достаточно будет определить некую переменную wallet вещественного типа, то есть она сможет хранить любые цифры от 0 до бесконечности и эти цифры могут быть и с запятой, то есть Вася может иметь и 100 рублей и 150 рублей и 50 копеек.

Но, если программу нашу несколько приблизить к реальному миру, то получится, что у Васи в кошельке есть не только рубли, а ещё и доллары. И ещё кошелёк чёрного цвета и в кошельке есть кредитные карты, у которых тоже есть какие-то деньги на балансе. В таком случае мы, в программировании, уже не обойдёмся одной цифрой, чтобы описать баланс кошелька и вместе с этим и кошелёк и нам придётся использовать объект кошелёк, который будет состоять из перечисленных выше характеристик: то есть, баланс в рублях, баланс в долларах, количество кредитных карт, цвет кошелька. Причём объекты могут тоже состоять из объектов и другие объекты могут тоже состоять из объектов.

4 принципа ООП

Объектно-ориентированное программирование базируется на 4 принципах:

  1. Абстракция
  2. Инкапсуляция
  3. Наследование
  4. Полиморфизм

I. Абстракция

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

То есть, в случае с кошельком, у кошелька может быть бесконечно много свойств. Но если в нашей задаче нам необходимо только лишь добавлять Васе в кошелёк рубли и забирать рубли, то нам может будет достаточно всего лишь 2 свойств, тогда как у кошелька их может быть чуть ли не бесконечно много.

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

Расшифровывается как “ин + капсула”, то есть “в капсуле”, а если что-то “в капсуле”, то оно скрыто от наших глаз. В случае с кошельком мы, например, видим, что у Васи есть кошелёк, видим, что он, например, кожанный, что он чёрный, но мы не знаем сколько в нём денег, потому что это скрыто внутри кошелька. Это и есть инкапсуляция.

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

III. Наследование

Наследование – простейший к понимаю принцип ООП. “Яблоко от яблони недалеко падает” – есть такая пословица и она как раз о наследовании. Для понимания наследования в программировании есть 2 прекрасных примера.

Пример 1. Фрукты

Предположим, нам нужно создать объект яблока и объект груши. Мы напишем классы, один назовём Apple, второй Pear. У яблока и груши будут вес, цвет, сорт, быть может, количество косточек или вообще наличие косточек и так далее. Но яблоко и грушу кое-что объединяет: они оба – фрукты! Так вот, в объектно-ориентированном программировании прежде чем создавать классы яблока и груши нам сначала необходимо создать класс фрукт (Fruit), который (как и фрукт в реальном мире) будет содержать в себе общие свойства для яблока и груши и только потом уже нам необходимо будет создать класс яблока и груши, которые будут наследоваться от их базового класса – фрукта. Таким образом, классы яблока и груши будут отличаться совсем чуть-чуть. И так во всём программировании.

Пример 2. Toyota Camry

Всем мы знаем эту прекрасную модель и прекрасную марку. Все мы знаем, что “камри” имеет разные кузовы, например 30-й и 45-й. Так вот, 45-й кузов не создавался с нуля, он создавался на основе 40 кузова и даже и 30 кузова. То есть, инженеры Toyota использовали, то есть, унаследовали прошлый опыт.

IV. Полиморфизм

Самый сложный к пониманию принцип ООП. Расшифровывается он как “поли + морф”, где “поли” = множество, а “морф” = “форм”, то есть множество форм. Реализуется этот принцип при помощи интерфейсов. Интерфейсы – это разновидности классов, но интерфейсы не могут иметь свойств и могут иметь только прототипы функций (прототип – функция без тела).

То есть, полиморфизм – это когда мы можем использовать в одном типе множество других типов. Как это получается – разберём на примере.

Пример: съедобная пища

Предположим, у нас есть человек и у человека есть функция приёма пищи или “есть”. Очевидно, что человек ест только съедобное. То есть, он может есть, например, фрукты, яблоки, груши, но не может, например есть кошельки.

Как нам пометить какие-то классы (объекты) так, чтобы мы могли сказать о нём – он съедобный или нет? Необходимо определить интерфейс “съедобный”, или по-английски Eatable. И этот интерфейс необходимо реализовать (так выражаются про интерфейсы) в том классе, который может быть съедобен. То есть, в большинстве языков программирования это выглядит примерно так: class Apple implements Eatable.

Так вот, вернёмся к человеку. У человека есть функция “есть”: Human::eat(food). И у этой функции есть один аргумент – еда. У аргумента должен быть тип. Так вот, этот тип – это интерфейс, то есть выглядит это так: Human::eat(Eatable food). Теперь, чтобы человеку в нашем программном коде можно было “скормить” какой-то объект, необходимо чтобы этот объект реализовал интерфейс “съедобности”.

На этом всё! Если что-то непонятно или есть дополнительные вопросы, то пишите комментарии.