Хотите изучить программирование ООП, не заморачиваясь с каким-либо языком программирования, специфичным для синтаксиса? Вам повезло!

Некоторые вещи, на которые следует обратить внимание, прежде чем погрузиться в эту статью 👇:

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

С этим покончено, позвольте двигаться дальше…

1- Что такое ООП?

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

2- Что такое объекты?

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

Example we will go with:
Let Phone be an Object

or

Phone = an Object

📌 Окей, получилось неплохо. Итак, как именно работают эти «объекты»?

Поскольку все теперь является объектом (что уже было установленным фактом в реальном мире), у них должны быть какие-то «Атрибуты», или мы можем сказать «Прилагательные», которые дополнительно определяют этот объект.

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

# Textual Representation

Phone = an Object

where,

Phone's Vendor = Samsung
Phone's Color tone = silver
Phone's Screen size = 6.4 inches
Phone's Camera resolution = 64 mega pixels
Phone's Apps List = MoneyManagerApp , SuperCameraApp, SomeBrowserApp 

Заметили, что у каждого атрибута есть общий префикс? Да вы угадали! Префикс «Phone’s» относится к тому конкретному телефонному объекту, о котором мы только что подумали. Это необходимая часть, и вскоре мы увидим, что именно «ПОЧЕМУ?».

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

Хотя мы можем называть их разными именами, я буду называть их «Атрибутами» только для простоты.

Причина по которой?" нам нужно определять каждый атрибут с повторяющимся префиксом каждый раз, когда он используется как ссылка на конкретный объект. Компьютеру нужен способ узнать, какому объекту принадлежат эти атрибуты, поэтому мы должны использовать имя. Но мы не используем его явно, мы используем его при создании класса, который определен в разделе 2.

📌 Что еще есть у объекта?

Только одно другое, и они называются «Методы». Вы можете думать об этих методах как о поведении или действиях объекта. Например, «Телефон» может позвонить, подавать звуковой сигнал в указанное время, отправлять текстовые сообщения и т. д.

# Textual Representation

Phone = an Object

where,

Phone's Vendor = Samsung
Phone's Color tone = silver
Phone's Screen size = 6.4 inches
Phone's Camera resolution = 64 mega pixels
Phone's Apps List = MoneyManagerApp , SuperCameraApp, SomeBrowserApp

And it can,

◾️ open camera
◾️ make a call (BUT needs a target phone number to call to)
◾️ sound an alarm (BUT takes a specific time to do that)
◾️ send text message (BUT needs a target phone number to send to)

Я ничего особенного не сделал, кроме того, что добавил несколько «методов» или вариантов поведения в наш предыдущий пример.

Опять же, эти действия, которые может выполнять объект, могут называться по-разному. Но с этого момента я буду называть их «методами».

Здесь тоже есть что отметить. Каждый метод требует чего-то для работы, кроме «открытой камеры», которая ничего не требует.

Есть некоторые методы, которые будут работать только в том случае, если они получат то, что им нужно, и некоторые методы, которым ничего не нужно для работы.

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

На этом наше определение «Объекта» завершено.

3- Что такое классы?

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

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

Но, конечно, мы можем кое-что изменить, если будем следовать этому плану

📌 Так какой тип инструкций по схеме содержит класс?

Он просто содержит две вещи, о которых мы говорили, когда обсуждали объекты: атрибуты и методы. Вот и все! вам не нужно указывать что-либо еще в Class.

# Textual Representation

Phone = a Class

where,

Phone's Vendor = Samsung
Phone's Color tone = None
Phone's Screen size = None
Phone's Camera resolution = None

And it can,

◾️ open camera
◾️ make a call (BUT needs a target phone number to call to)
◾️ send text message (BUT needs a target phone number to send to)

Приведенный выше пример представляет собой представление того, как может выглядеть класс телефона.

Обратите внимание, сколько атрибутов пусто. Это потому, что мы можем выбрать любое значение для этих переменных по своему усмотрению. Если в плане/классе не указано какое-либо значение, мы можем назначить их по своему усмотрению.

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

Также обратите внимание, что метод Alarm не определен в классе. Этот класс считает его необязательным и не включен в него. мы просто предполагаем, что Samsung считает, что функция будильника не имеет значения для добавления в их телефон. Не нужно принимать это на свой счет.

Когда все это прояснено, пришло время точно ответить на вопрос «ПОЧЕМУ?» мы постоянно используем префикс «телефон» каждый раз, когда объявляем атрибут. В разделе 1 уже было указано, что это используется в качестве ссылки, но я также сказал, что это не указано явно. нам нужно использовать этот префикс только при написании класса, и для этого мы используем много разных ключевых слов на разных языках программирования.

например, мы используем ключевое слово SELF в Python и ключевое слово THIS в Java. Но они оба, по сути, означают одно и то же. Оба они используются для ссылки на объект, который будет создан с использованием класса/чертежа.

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

Это также можно интерпретировать как:

Пока ключевое слово THIS или SELF находится внутри класса, оно останется прежним. Но как только мы создадим из него объект и сохраним его в переменной, все эти ключевые слова будут заменены именем этой переменной. Это изменение происходит только внутри объекта, а класс остается незатронутым.

Ниже приведен пример, поясняющий суть:

В данном случае MySuperPhone — это имя переменной, внутри которой хранится этот объект.

# Textual Representaion

# Defining a class

Phone = a Class {
  THIS_Phone.Vendor = Samsung
  THIS_Phone.ColorTone = <not defined>
  THIS_Phone.ScreenSize = <not defined>
  THIS_Phone.CamRes =  <not defined>
}

# Making an Object out of the above class andstoring it into a variable

Variable MySuperPhone = Phone

# after the above step, the THIS_Phone keyword 
# changed andtransfered all of its attributes 
# to MySuperPhone.

# adding a new attribute to MySuperPhone Object

MySuperPhone.AppList = [MoneyManagerApp, SuperCameraApp, SomeBrowserApp]

Для простоты я использовал префикс THIS_Phone в своем примере на рис. 3.2, но вы должны помнить, что он может варьироваться от языка к языку.

Последнее, о чем стоит упомянуть, это то, что все методы в классе имеют один параметр по умолчанию (даже если вы не хотите, чтобы он принимал какие-либо параметры), и этот параметр является одним и тем же ключевым словом SELF или THIS. Также помните, что обязательно быть первым параметром в списке параметров. Это просто для привязки функции к классу, чтобы она запомнилась как метод.

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

4- Конструкторы

Я сказал, что внутри класса мы определяем две вещи, но на самом деле их три. Есть что-то, называемое конструктором, который по сути является функцией. Она объявляется как обычная функция, но имеет особое значение внутри класса.

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

Всякий раз, когда мы делаем объект из класса, будет вызываться эта функция «конструктор», и все внутри нее будет выполнено.

📌 А что делает эта специальная функция?

Начнем с того, чего он не делает. Он ничего не возвращает вообще. Теперь мы готовы понять, что он может сделать.

Он просто присваивает все атрибуты класса имени переменной, которое мы для него использовали. Другими словами, это функция, которая заменяет ключевое слово THIS или SELF именем переменной. Эта концепция представлена ​​на иллюстрации ниже:

Эта функция, как и другие функции в классе, также называется Метод. И, как показано на рис. 4.1, этот метод имеет то же имя, что и имя самого класса.

📌 Если это функция, то какие параметры она принимает?

Как показано на рис. 4.1, как и во всех других методах класса, самым первым параметром всегда является ключевое слово SELF или THIS. В нашем примере мы использовали собственное ключевое слово «THIS_Phone».

Другие параметры, которые он принимает, полностью зависят от вас (разработчика класса). Вы можете спроектировать его так, чтобы он принимал параметр «Цветовой тон» для вашего класса Phone, и всякий раз, когда вы хотите создать экземпляр объекта из этого класса, вы будете делать это, как показано на рис. 4.1.

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

Это все, что я буду обсуждать о конструкторах.

5- Наследование

Помните, в разделе 3 мы говорили, что Samsung, производитель телефонов, не считает необходимым добавлять метод будильника в свой класс телефонов. это их решение и мы ничего не можем с этим поделать.

📌 Но как добавить любой пользовательский метод в наш класс? Мы же не можем так оставить?

На самом деле это довольно просто. Вы берете этот класс (назовем его версией 1) и делаете его основой для нашего нового плана. В этот новый план/класс мы добавим любые атрибуты или методы, которые нам нравятся (давайте назовем этот новый класс версией 2).

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

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

Если мы когда-нибудь захотим создать новую версию 3, 4... или 5, мы можем использовать класс версии 1 или любой класс версии в качестве основы для нашей новой модели и добавить к ней новые атрибуты и методы. .

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

Некоторые языки программирования поддерживают необходимость назначать новые пользовательские методы «Объектам» (то есть после того, как Объект был создан из Класса). Эта функция внутри языка программирования называется созданием динамического метода. Таким образом, вам может не понадобиться использовать Inheritance в конце концов.

В этом суть наследования, и на этом я закончу.

6- Полиморфизм

Давайте сначала рассмотрим буквальное определение для этого.

Полиморфизм в информатике обычно означает, что объекты разных типов следует рассматривать так, как если бы они были одного типа.

Теперь в этом утверждении много чего говорится, давайте разгадывать эти тайны одну за другой, чтобы у нас не взорвалась голова.

Во-первых, обратите внимание, что в утверждении говорится об «объектах», а не о «классах». А теперь подумайте… когда объекты разных типов? Когда они происходят из разных классов, то это когда. Их «тип» определяется классом, к которому они принадлежат.

Теперь обратите внимание на ту часть, где в заявлении говорится, что к ним относятся одинаково. Когда можно обращаться с разными объектами одинаково? Мы уже знаем, что «действия», которые может выполнять объект, зависят от содержащихся в нем методов (или действий, которые он может выполнять). Обработка двух разных объектов, каждый из которых происходит из разных классов, означает вызов одного и того же метода (методов) для обоих из них. Это можно проверить на рис. 6.1. Хотя оба объекта относятся к разным классам, мы можем использовать их оба для «Вызова» или «Открытия камеры».

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

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

7- Модификаторы доступа

Каждый атрибут и метод в классе имеет область действия. Область действия определяется ТЕГОМ, который вы назначаете каждому атрибуту или методу. Этот TAG либо говорит:

"доступ к этому атрибуту/методу разрешен за пределами этого объекта"

or

"к этому атрибуту/методу НЕ разрешено обращаться за пределами этого объекта"

Ниже у вас есть пример, показывающий вам оба этих атрибута.

Мы называем эти теги переменными PRIVATE или PUBLIC. Эти имена интуитивно понятны, и я предполагаю, что вы уже понимаете, что делает каждое из них. Я использовал эти имена, как на рис. 5.1.

Я только показал вам, как это работает с атрибутами. Это потому, что он работает точно так же с методами.

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

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

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

Инкапсуляция просто так. Это облегчает чтение кода, поскольку мы знаем, что каждая тесно связанная переменная (атрибут) и функция (метод) будут найдены упакованными вместе в одном классе.

9- Интерфейсы

Предположим, у вас дома есть блендер. Как вы можете это использовать? Он поставляется с руководством по эксплуатации и некоторыми кнопками или ручками, которые используются для управления им.

Мы знаем, что все, что нужно блендеру для работы, находится внутри машины, где мы не можем видеть или трогать схемы (см. инкапсуляцию в разделе 8). Мы не перегружены проводами и электрическими компонентами, которые необходимы для работы блендера, вместо этого у нас есть несколько очень простых элементов управления, таких как ручка или кнопка, которые заставляют блендер работать одинаково.

Эти кнопки и ручки, которыми мы управляем, являются частью «интерфейса» блендера.

Помните модификаторы доступа (описано в разделе 7)? Частные атрибуты и методы остаются изолированными от внешнего мира, в то время как общедоступные атрибуты и методы могут быть использованы или доступны любому, кто пытается получить к ним доступ извне (после создания объекта из класса). .

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

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

📌 Да, и если вам интересно, инструкция по эксплуатации, о которой я говорил в начале этого раздела, — это документация, в которой рассказывается, что делает каждая часть класса.

10- Заключение

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

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

Поздравляем, теперь вы готовы работать с объектно-ориентированной парадигмой. Удачи там.

Дальнейшее изучение

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

  • разница между полиморфизмом и наследованием
  • разница между композицией и наследованием
  • геттер и сеттер методы
  • абстрактные классы

Спасибо, что дочитали до конца! 🥳

Теперь вы знаете не только все, что нужно знать об ООП на уровне начальногои среднего, но и обладаете знаниями, чтобы применить его к любому языку программирования. по вашему выбору там.

Это было бы для этой статьи. Не забудьте поставить 👏, если вы нашли это полезным. Или не стесняйтесь, дайте мне знать📣 ваши мысли об ООП.