Что такое объектно-ориентированное программирование (ООП)?

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

Основные термины:

Объект:

Это экземпляр класса/рабочая сущность класса.

Сорт:

Это шаблон или черновик о возможностях того, что может делать объект.

Метод:

Поведение класса. Он говорит, что метод может сделать.

Пример:

Объект и экземпляр одинаковы с небольшой разницей.

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

Создание экземпляра называется созданием экземпляра!

Экземпляр != Экземпляр Переменная:

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

Концепции ООП:

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

ПРИМЕЧАНИЕ. Исключения не являются частью концепции ООП.

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

Инкапсуляция — это механизм объединения данных (переменных экземпляра) и кода, воздействующего на данные (методы) вместе как единое целое, подобное классу.

Основная цель инкапсуляции — получить полный контроль над данными с помощью кода.

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

Все еще не понял?

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

Скрытие данных/инкапсуляция данных:

Инкапсуляция приводит к сокрытию данных.

Мы используем спецификаторы доступа, чтобы скрыть данные (свойства) и методы. Использование private и public подпадает под это.

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

Абстракция:

Абстракция — это процесс сокрытия деталей реализации от пользователя, пользователю будет предоставлена ​​только функциональность.

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

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

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

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

  • Скрытие ненужных деталей;
  • Может иметь несколько реализаций (например, иметь дело с идеей, а не с реальным событием (например, когда вы знаете, что что-то должно быть там, но не знаете, как именно это должно выглядеть).)
  • Построение сложной системы путем разделения уровня сложности на уровень.

Скрытие ненужных деталей:

Каждую функцию можно рассматривать как базовую абстракцию.

Например: программиста не волнует, как работает malloc() или как работает garbage collection.

Может иметь несколько реализаций:

Не путайте это с полиморфизмом.

Абстракция очерчена верхним левым и верхним правым изображениями кота. Хирург и пожилая женщина спроектировали (или визуализировали) животное по-разному. Точно так же вы можете поместить в класс Cat различные функции в зависимости от потребностей приложения.

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

Все еще не поняли?

Абстракция — это концепция, которая может иметь одну или несколько реализаций.

Например. Компьютер может подключаться к локальной сети разными способами (Ethernet, Wi-Fi, модем удаленного доступа и т. д.), но обычно веб-браузеру не требуется беспокойтесь о том, какие из них вы используете в любой момент времени, потому что программное обеспечение более низкого уровня предоставляет общую абстракцию, на которую может положиться ваш браузер. Таким образом, «подключение к сети» — это абстракция, а Ethernet, Wi-Fi и так далее — реализации этой абстракции.

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

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

Например, знаменитые шаблоны проектирования (одиночный шаблон, шаблон фабричного метода и т. д.) — это все абстракции, которые явно не указаны в коде; скорее, у нас есть отдельные (не связанные) фрагменты кода для различных реализаций этих абстракций, и абстракция просто находится в голове программиста (и в проектной документации, и в именах классов и переменных и так далее).

Абстракция предназначена для клиентов (пользователей) класса. Конечно, должна быть реализация; но, например, код, который принимает List‹String›, не должен беспокоиться о том, является ли передаваемый экземпляр ArrayList или LinkedList, потому что они оба реализуют требуемую абстракцию.

Построение сложной системы путем разделения уровня сложности на уровень:

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

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

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

Абстракция является одним из ключевых принципов OOAD (объектно-ориентированный анализ и проектирование).

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

Абстракции можно достичь с помощью композиции.

Пример абстракции:
Автомобиль состоит из двигателя, колес и многих других частей. Когда мы запишем все свойства Автомобиля, Двигателя и колеса в один класс, это будет выглядеть так:

public class Car 
{ 
    int price; 
    String name; 
    String color; 
    int engineCapacity; 
    int engineHorsePower; 
    String wheelName; 
    int wheelPrice;     void move()
    { 
        //move forward 
    }     void rotate()
    { 
        //Wheels method 
    }     void internalCombustion()
    { 
        //Engine Method 
    }
}

В приведенном выше примере атрибуты колеса и двигателя добавляются к типу автомобиля. Согласно программированию, это не создаст никаких проблем. Но когда дело доходит до обслуживания приложения, это становится более сложным.

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

2. Часто меняющиеся свойства и методы можно сгруппировать в отдельный тип, чтобы основной тип не подвергался изменениям. Это усиливает принцип GOAD: "Код должен быть открыт для расширения, но закрыт для модификации".

3. Упрощает представление моделей предметной области.

Применяя абстракцию с композицией, приведенный выше пример можно изменить, как показано ниже:

public class Car 
{ 
    Engine engine = new Engine(); 
    Wheel wheel = new Wheel(); 
    int price; 
    String name; 
    String color;     void move()
    { 
        //move forward 
    }}
 
public class Engine 
{ 
    int engineCapacity; 
    int engineHorsePower; 
    void internalCombustion()
    { 
        //Engine Method 
    }
} public class Wheel 
{ 
    String wheelName; 
    int wheelPrice; 
    void rotate()
    { 
        //Wheels method 
    }
}

Вы можете видеть, что атрибуты и методы, относящиеся к Engine и Wheel, перемещены в соответствующие классы.
Engine и Wheel относятся к типу Car. При создании экземпляра Car оба Engine и Wheel будут доступны для Car, а при внесении изменений в эти типы (Engine и Wheel) изменения будут ограничены только этими классами и не повлияют на класс Car.

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

Абстракция бывает 2 видов:

  1. Абстракция управления
  2. Абстракция данных

Абстракция управления:

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

a := (1 + 2) * 5

Для человека это кажется довольно простым и очевидным вычислением («один плюс два — три, пять — пятнадцать»). Однако шаги низкого уровня, необходимые для выполнения этой оценки и возврата значения «15», а затем присвоения этого значения переменной «a», на самом деле довольно тонкие и сложные. Значения необходимо преобразовать в двоичное представление (часто это гораздо более сложная задача, чем можно было бы подумать), а вычисления разложить (компилятором или интерпретатором) на ассемблерные инструкции (опять же, которые гораздо менее интуитивны для программиста: такие операции, как сдвиг двоичного регистра влево или добавление двоичного дополнения содержимого одного регистра к другому — это просто не то, как люди думают об абстрактных арифметических операциях сложения или умножения). Наконец, присвоение результирующего значения «15» переменной с меткой «а», чтобы «а» можно было использовать позже, включает в себя дополнительные «закулисные» шаги по поиску метки переменной и результирующего местоположения в физической памяти. или виртуальную память, сохраняя двоичное представление «15» в этой ячейке памяти и т. д.

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

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

Абстракция данных:

Абстракция структур данных. Абстракция данных относится к определению поведения структуры данных. Данные могут быть внутренне представлены по-разному в конкретных реализациях.

(or)

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

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

EX:

  • В СУБД:системы управления базами данных имеют абстракции таблиц и представлений. Каждое программное обеспечение СУБД может хранить базовые данные по-разному. Но для пользователей таблица всегда представлена ​​в виде строк и столбцов. Это позволяет выполнять операции высокого уровня, такие как запросы к этой абстракции данных.
  • В коллекциях Java: интерфейсы API коллекций Collection, List, Set и Map являются примерами абстракций данных. Эти интерфейсы определяют некоторые характеристики поведения, которые должны быть реализованы конкретными классами. Например, List определяет характеристики и методы произвольного доступа из базовых элементов. Класс реализации может использовать структуру данных array для хранения элементов данных — ArrayList. Или можно хранить любым ad-hoc образом — LinkedList. Все должно быть в порядке, пока достигается поведение, определенное интерфейсом List.

Суммируя,

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

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

  • Разница между концепциями инкапсуляции и абстракции заключается в том, что инкапсуляция связана с упаковкой класса (например, как следует обращаться к данным (сеттеры/геттеры) и к каким данным следует обращаться (спецификаторы доступа)), тогда как абстракция больше касается того, что делает класс. для вас на концептуальном уровне.
  • Инкапсуляция скрывает ненужные данные в капсуле или блоке, а абстракция показывает существенную особенность объекта.
  • Абстракция включает в себя инкапсуляцию, сокрытие информации и обобщение.
  • абстракция — это форма обобщения: написание кода, применимого более чем к одной конкретной ситуации.
  • Абстракция — это когда вы фокусируетесь только на тех деталях, которые важны для вашей цели.
  • Абстракция — это процесс очистки всех ненужных/неважных атрибутов объекта и сохранения только тех характеристик, которые лучше всего подходят для вашего домена. для человека: вы решаете оставить имя и фамилию и SSN. Возраст, рост, вес и т. д. игнорируются как не имеющие значения.
  • Язык ассемблера можно рассматривать как абстракцию машинного кода — ассемблер выражает основные детали и структуру машинного кода, но освобождает вас от необходимости думать об используемых кодах операций, расположении кода в памяти, переходах к правильный адрес и т.д.
  • API вашей операционной системы является абстракцией базовой машины. Ваш компилятор обеспечивает уровень абстракции, который защищает вас от деталей языка ассемблера. Стек TCP/IP, встроенный в вашу операционную систему, абстрагируется от деталей передачи битов по сети. Если вы дойдете до сырого кремния, то люди, разработавшие ваш ЦП, сделали это, используя принципиальные схемы, написанные в терминах «диодов» и «транзисторов», которые являются абстракциями того, как электроны проходят через полупроводниковые кристаллы.
  • Наследование также является примером абстракции.
  • Инкапсуляция ведет к абстракции

Наследование:

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

(OR)

В объектно-ориентированном программировании наследование — это когда объект или класс основан на другом объекте (прототипное наследование) или классе (наследование на основе классов), используя та же реализация (наследующая от объекта или класса), указывающая реализацию для поддержания того же поведения

Идея наследования реализует отношение является. Например, млекопитающее ЯВЛЯЕТСЯ животным, собака ЯВЛЯЕТСЯ млекопитающим, следовательно, собака также ЯВЛЯЕТСЯ животным и так далее.

Виды наследства:

  1. Единое наследство
  2. Множественное наследование
  3. Многоуровневое наследование
  4. Иерархическое наследование
  5. Гибридное наследование

ПРИМЕЧАНИЕ. Большинство языков, таких как Java, JavaScript и т. д., не поддерживают множественное наследование. Одной из проблем, с которыми мы сталкиваемся при его использовании, является алмазная проблема. Гибридное наследование невозможно без множественного наследования.

Преимущества наследования заключаются в следующем:

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

Недостатки наследования заключаются в следующем:

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

Наследование — одна из наиболее часто неправильно используемых функций ООП начинающими программистами.

СОВЕТ: если нет абсолютной необходимости в наследовании, не используйте его!

Полиморфизм:

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

Существует 2 типа реализации полиморфизма:

  1. Статический полиморфизм
  2. Динамический полиморфизм

Особенности полиморфизма в основном зависят от языков программирования.

Например, перегрузка функций возможна в Java, C++ и т. д., но невозможна в JavaScript. Перегрузка операторов возможна только в C++.

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

Для основной идеи, что такое полиморфизм:

Если кто-нибудь скажет ОТРЕЗАТЬ этим людям

  1. Хирург
  2. Стилист по волосам
  3. Актер

Что случится?

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

Итак, приведенное выше представление показывает, что такое полиморфизм (одно и то же имя, другое поведение) в ООП.

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

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