 ## ООП - Объектно-ориентированное программирование
 
 1. - [x] [Полиморфизм для начинающих](https://habr.com/ru/post/37576/)
 2. - [x] [Полиморфизм](https://www.hackingwithswift.com/read/0/20/polymorphism-and-typecasting)

[инкапсуляция, полиморфизм, наследование](https://cakeinpanic.medium.com/инкапсуляция-полиморфизм-наследование-166591e5928e)

![OOPInPicture](/pictures/DesignPatterns/OOPInPicture.png?raw=true)

## Основные принципы ООП

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

> В целях повышения защищенности программ в ООП почти не используются глобальные переменные

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

Реализация задач одной и той же идеи разными способами;

#### Требования

[SOLID](/2%20ComputerScience/2.4%20Architecture/2.4.1%20PatternsAndPrinciple/2.4.1.4%20DesignPrinciple/SOLID.md) и ООП неразрывно связаны. Так получилось, что именно в ООП языках появилась удобная и безопасная поддержка динамического полиморфизма. Фактически, в контексте SOLID под ООП понимается именно динамический полиморфизм.

Полиморфизм дает возможность для разных типов использовать один код. Полиморфизм можно грубо разделить на динамический и статический:
* Динамический полиморфизм — это про абстрактные классы, интерфейсы, утиную типизацию, т.е. только в рантайме будет понятно, с каким типом будет работать наш код.
    > Утиная типизация: Если что-то выглядит как утка, плавает как утка и крякает как утка, то, скорее всего, это утка

    > Пример: Строка и массив — это разные типы данных, но они ведут себя одинаково. А если строка выводится как массив, заполняется как массив и меняется как массив, то с практической точки зрения это и есть массив и с ним можно работать как с массивом. Это и есть утиная типизация, когда нам неважно, что там на самом деле — важно, как оно себя ведёт и как с ним работать.
* Статический полиморфизм — это в основном про шаблоны (genererics). Когда уже на этапе компиляции из одного шаблонного кода генерируется код специфичный для каждого используемого типа.

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

Cпособность объекта или класса базироваться на другом объекте или классе;

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

Cвойство скрывать свои данные и способы их обработки;

> private, filreprivate, internal

## В чем плюсы и минусы ООП?

_Преимущества_

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

_Недостатки_

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

---

[2.2.2.2.1 About Imperative Theme](./2.2.2.2.1%20AboutImperative.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [2.2.2.2.3 POP Theme](./2.2.2.2.3%20POP.md)
