Привет всем 😃

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

Но прежде чем мы начнем, что такое объектно-ориентированное программирование?🤔
ООП — это парадигма программирования, основанная на объектах (чертежах), которые собирают вместе связанные данные, и мы можем создавать экземпляры этого объекта и создавать другие. объекты (экземпляры), и мы узнали о них в предыдущей статье.
Если я хочу привести пример объекта в реальном мире, то Автомобиль — это объект, который включает в себя такие свойства, как колеса, двери, рулевое колесо и такие методы, как перемещение, остановка и т. д. Еще один пример: человек — это объект, который включает в себя такие свойства и методы, как рост, вес, цвет кожи, имя, возраст и т. д.

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

Этот столп касается сбора связанных данных (свойств, методов) внутри одного объекта, чтобы никакие посторонние не могли получить доступ (прочитать или изменить) к этим данным напрямую.
Например, у нас есть много связанных данных, включая запуск, остановку , blowHorn и т. д. Которые транслируются в глобальном масштабе и могут быть доступны кому угодно, поэтому мы можем и должны обернуть их объектом с именем Car, и таким образом что-то вроде коровы не сможет получить доступ к свойству blowHorn! :|(Я уверен, что вы поняли, что я имею в виду, и у вас могут быть лучшие примеры в ваших исследовательских умах)

Как видно из приведенного выше примера, в плохом смысле я распространяю данные в глобальном масштабе, и что угодно может просто вызвать start или blowHorn, а это не то, чему oop будет рад.
В хорошем смысле ( инкапсуляция), я обернул эти связанные данные одним объектом с именем Car, чтобы сообщить всем, что вам не разрешено использовать эти методы для чего-то вроде приветствия!
Другими словами, инкапсуляция — это создание щита для защиты связанных данных, предотвращая прямой доступ к ним из любого места, и она создает специальные методы, называемые геттерами и сеттерами, для получения и установки этих данных. Конечно, я не упомянул эти методы в приведенном выше примере, поэтому давайте посмотрим на другой пример:

В приведенном выше примере, если бы я не инкапсулировал данные, они были бы доступны где угодно.
Поместив их в класс Car, я сделал их защищенными и безопасными. Итак, теперь я знаю, для чего нужны эти свойства name и speed и как их устанавливать и получать, вызывая getName, setName и т. д.

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

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

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

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

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

пример кода:

В приведенном выше примере мы знаем, что делает метод start, но нас не волнует, как он это делает, и это абстракция.

Еще одна вещь, о которой следует поговорить в приведенном выше примере, — это выдача ошибок в некоторых методах, что означает, что вы не можете использовать этот метод, не переопределяя его для каждого экземпляра, а также вы не можете создавать экземпляр объекта Car, и вы можете просто создавать экземпляры его дочерних классов. . но почему мы должны переопределять некоторые методы?🤔

ну, это хороший вопрос, и ответ таков:

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

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

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

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

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

пример кода:

В приведенном выше примере у нас есть объект Car, который включает такие методы, как start и stop. И у нас есть другие классы с именами Tesla и Volvo со специальным методом getPower и унаследованными методами от объекта Car, чтобы не определять их снова с нуля. Теперь у нас могут быть разные модели Tesla и Volvo путем создания экземпляров классов Tesla и Volvo.
Мы не определяли метод запуска для каждого объекта, но когда мы вызываем его для каждого экземпляра, он знает, что делать, потому что унаследовал его от объект Автомобиль.

вывод: наследование предотвращает дублирование методов и занимает больше места в памяти, делает методы многоразовыми и уменьшает сложность.

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

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

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

На изображении выше все автомобили наследуют рулевое колесо, но с разной реализацией (разной формой).

пример кода:

Я не думаю, что это нуждается в дополнительных пояснениях.

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

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

Способ инкапсуляции: сбор связанных данных в одном объекте и защита их от прямого доступа из внешней области.

Абстрактный способ: скройте ненужные данные и отобразите важные данные, чтобы уменьшить сложность. И изолировать влияние изменений.

Способ наследования: наследование методов и свойств для повторного использования. И предотвратите методы дублирования и оккупацию большего объема памяти.

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

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

Это путешествие заканчивается здесь, и я надеюсь, что вы раз и навсегда изучили oop в javascript.

До свидания и удачи 🤞