Парадигмы программирования. Эпизод II: Объектно-ориентированное программирование

Парадигмы программирования. Эпизод II: Объектно-ориентированное программирование

Больше вкусностей найдешь на моем канале - https://t.me/emotional_robot


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

Формочки и куличики

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

Помните процесс создания куличика? Берете форму, насыпаете в неё песок, плотно утрамбовываете его там, затем резко переворачиваете, стучите лопаткой или кулаком по дну формочки и аккуратно снимаете форму. И остается произведение искусства в виде песка, которым хочется похвастаться всем вокруг. Эх, беззаботное детство, сейчас бы сидеть жопой в песке и лепить куличики, а не вот это вот все.

Если вы еще не потонули в ностальгии, вам стоит обратить внимание на интересный факт - формочка у вас одна, а куличиков из нее слепить можно много (больше куличиков богу куличиков), причем только той формы, которая есть у формочки (мать его, это нормально звучит или у меня с русским языком проблемы начались?). Коль формочка имеет цилиндрическую форму (звучит странно, но по идее, логично), куличик никаким боком не получится в форме октаэдра, как вы лопатой или кулаком не будете стучать по дну.

Выгружаемся из воспоминаний о прошлом и движемся в сторону светлого будущего, где вы будете сидеть на берегу Средиземного моря, постукивая пальцами по клавиатуре новенького Макбука и создавая крутой интерфейс для крупного заказчика. Зафиксируйте: класс - это формочка, объект - куличик - это экземпляр класса. Запомните так, что если вас пинком с ноги разбудить ночью, вы отчеканите это, как свое имя.


Ух, какое богатство, целых ТРИ формочки!

Объектно-ориентированное программирование

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

Вспомните, что пытаются сделать программисты? Облегчить боль простых людей, помочь им в решении каких-то проблем. Проблемы находятся в реальном мире, как и люди, как и предметы, и так далее и тому добротное. Разумеется, чтобы решать задачи, объекты реального мира нужно как-то описать на языке программирования, представить их в виде конкретной сущности, с которой можно взаимодействовать. И долго думать не пришлось - пусть реальные объекты описываются как есть, но с нюансами, разумеется, куда без них.

Главные понятия в ООП - класс и объект. Почему было введено именно два понятия? Достаточно посмотреть на окружающий мир. Есть птицы, млекопитающие, парнокопытные, насекомые, растения, бомжи (ух, биология вылезла, где не ждали). У каждой группы есть какие-то общие признаки. Мы знаем, что у птиц есть крылья, млекопитающие питаются молоком (кэп, ухади), в растениях есть хлоропласты, которые содержат хлорофилл (это единственное, что я хорошо помню из уроков биологии), бомжи спят на картонке. Все эти общие признаки можно представить в виде отдельного класса:

class Homeless {

nickname: String; // "кликуха" с типом данных "строка"

age: Number; // возраст с типом данных "число"

}

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

const homelessKompot = new Homeless("Kompot", 55)

То мы получим экземпляр класса, или объект. const - обозначение для константного (неизменяемого) значения, new - оператор для "конструирования объекта". Об этих вещах мы также подробно поговорим.

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


Суровый бомж Компот следит за порядком в городе.

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

Нюансы: инкапсуляция, наследование, полиморфизм, абстракция

Ну как, нравятся новые словечки? Хотя, наследование явно знакомое слово, да и абстракция где-то в подкорках сознания теплится. Начну с них тогда.


Пытался найти схему с алкоголем, но и фрукты сойдут.

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


Вот лучше и не придумаешь, как эту дичь изобразить.

Абстракция сама по себе вообще из разряда "филасафы атакуют" или "LSD-трип". На каком-то интуитивном уровне мы знаем, что абстракция - нечто несуществующее в материальном мире, однако представить его можно и даже вообразить некую форму. Однако на языке ООП все гораздо проще. Мы говорили выше о наследовании и о вынесении общих свойств и методов в базовый класс. Но что можно считать самым главным классом? С одной стороны, тоже базовый реальный класс. С другой, почему бы не представить набор значимых характеристик объекта в виде абстрактного класса. Really, не шарахайтесь от этого объяснения, тут все логично. Мы как бы "воображаем" класс на ЯПе (есть специальные конструкции для этого), описывая все его свойства и методы, а затем "реализуем" их (воплощаем в жизнь, если так угодно) в рамках настоящего класса. Создаем материальное из абстрактного. Ну как, чувствуете себя повелителями материи? То-то же, в программировании и не такую дичь творить можно, наркоманы позавидуют.


Коты даже в определение инкапсуляции залезли. Вот проныры.

Инкапсуляция - это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя. Если вы помните статью о микроволновке, то вы уже знакомы с понятием "инкапсуляция". С классами такая же фигня - вы описываете некоторые свойства и методы класса, скрывая их от внешнего пользователя, но при этом открывая другие методы в виде интерфейса (кнопки на микроволновке). То есть, кто-то (прогер, программа, пришельцы) смотрят на интерфейс и видят, какие методы доступны. А класс, реализующий этот интерфейс, может использовать какие-то свои внутренние методы. И они не должны быть известны внешнему потребителю. Не положено, доступ закрыт, ахтунг! Это делается ради безопасности, дабы класс не могли менять, мало ли, с какими грязными руками залезут в прогу хулиганить. Короче, скрываем детали внутри, наружу даем доступ по минимуму, и будет вам счастье.


Эх, чего ж нас на таких клевых картинках не учили.

Полиморфизм - это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Потерпите немного, понимаю, мозг кипит уже, но надо осилить, вы же у меня мощные ребята. Само слово дословно можно перевести "многоформие", то есть у чего-то есть много форм. В случае ООП, много форм может быть у интерфейса. Опять же, возьмем долбанную микроволновку. Сколько фирм производит их? Дохрена, хотя суть одна - разогревание еды при помощи панели с кнопками. Но детали реализации могут отличаться. Кто огнеметом греет, кто космическую энергию затягивает, кто сильно крутит (я не шарю в устройстве микроволновки, как вы поняли). И в ООП также - можно описать один интерфейс, а реализовать его несколькими классами. Вот на картинке выше - есть интерфейс Animal с методом Speak(), и есть три реализации в виде классов собачки, котика и коровки. И когда мы создадим три объекта каждого класса, при вызове метода Speak() мы будем получать разный результат. Это позволяет делать очень гибкую систему, дабы мы могли быстро заменить один класс другим, не поломав всю конструкцию. Огонь же.

Итого

Поздравляю, вы познакомились с основами ООП. Теперь вы можете еще больше выпендриваться перед друзьями. Еще немного - и станете невыносимыми, прямо, как тру программисты. Запомните самое главное: объект - экземпляр класса, главные принципы ООП: инкапсуляция, наследование, полиморфизм и абстракция.

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



Report Page