Главная

Мама, я знаю принципы ООП.

Если вы не можете объяснить что-то простыми словами — значит вы сами не до конца разобрались.

OOP
Поделиться:
 

32+

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

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

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

Инкапсуляция — это когда private методы/свойства класса можно изменять только при помощи public методов. Прямой доступ к private методам/свойствам класса запрещен.
Давайте рассмотрим следующий код:

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

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

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

Предположим, вы работаете над каким-то приложением, связанным с транспортными средствами. В приложении будет четыре типа ТС: грузовик, автобус, внедорожник и мотоцикл. У всех ТС есть марка, модель, комплектация и год выпуска. Также у каждой модели есть некие особые свойства.

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

Абстракция

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

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

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

Полиморфизм

Дословно полиморфизм означает “наличие многих форм”. В нашем контексте это относится к способности интерфейса или абстрактного класса принимать множество форм через свои реализованные производные классы. Это означает, что для интерфейса Cat вы можете иметь несколько производных классов, таких как LionCheetahTigerJaguar и т. д. Cat также будет иметь метод scream, который у каждой кошки будет разным. Давайте посмотрим на следующий код:

Используя интерфейс ICat, мы можем получить звучание разных животных из семейства кошачьих с помощью метода Scream().

У нас на выходе получилось три разных Scream для одного и того же интерфейса Cat. Это можно, кстати сказать, также сделать с помощью абстрактного класса и производных классов, которые будут переопределять метод Scream(). Это в значительной степени определяет понятие под названием полиморфизмом.

Мы постарались насытить статью примерами и очень надеемся, что она была для вас полезной. Спасибо!

32+