IT-ликбез

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

Объектно-ориентированное программирование
Фото: Berezovska Anastasia / Shutterstock
ОПП – важное понятие в программировании, и сегодня в разделе «Ликбез» ALMAMAT Blog про IT для начинающих помогает разобраться в сути.
OОП – это парадигма. Что такое парадигма?

Вот какие видения парадигмы программирования можно встретить. Парадигма – подход к проектированию программ; взгляд на саму структуру программы; стиль написания программ; «описание намерений программиста»; способ мышления о программе; вычислительная модель. Парадигма программирования определяет, как компьютер организует вычисления при исполнении программы.

Объектно-ориентированное программирование – не единственная парадигма. Существуют, например, процедурная, структурная, аспектно-ориентированная, объектно-ориентированная; метапрограммирование; функциональная, логическая и др. По мере развития программист учится работать с разными парадигмами, расширяет кругозор.
В чем суть ООП?

В описании вакансий девелоперов часто можно увидеть требование «понимание ООП». А в описании языков программирования – «объектно-ориентированный язык программирования».

Парадигма ОПП лежит в основе многих мейнстримовых языков. ОО-языки: C++, С#, Java, JavaScript, Objective-C, Python, PHP, Perl, Ruby, Scala, Swift и др. То есть топовые языки, ряд языков общего назначения, языки для Android-, веб- и iOS-разработки. Популярные современные языки – мультипарадигмальные, по принципам ООП можно писать и на языках с другими парадигмами.

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

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

Абстрагировать – это выделить значимые характеристики объектов, и в ООП важно выделить их правильно.

Класс – это описание объектов, представителей класса: отличительные признаки, состояния, взаимодействия. Что это, из чего это состоит, что можно с этим делать и как именно? У классов и объектов есть атрибуты, данные (Data) и методы, то есть функции для управления данными.

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

Иерархия: модули классов; базовый класс (класс описывает свойства объектов, содержит множество объектов, подклассов), производный класс (наследует свойства родительского класса и тоже содержит объекты); отдельно взятый объект (данные/Data, описывающие свойства объекта, + методы, то есть функции для работы с объектом, алгоритмы управления, действия, которые выполняет объект).

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

Совокупность тех методов класса, которые доступны и другим классам, называются интерфейсом. Чтобы тренировать объектное мышление, можно проводить аналогии с работой физических объектов и систем (с приборной доской в самолете, с пультом управления, с домофоном или лифтом в многоквартирном доме). Методы могут быть публичными и инкапсулированными, то есть скрытыми. По аналогии: панель управления в машине – на виду (интерфейс класса), а детали под капотом работают скрыто (так называемый «черный ящик»).
Принципы ООП
Главные принципы в ООП – абстрагирование, инкапсуляция, наследование и полиморфизм.

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

Инкапсуляция – это «размещение в оболочке, капсуле», механизм объединения данных в единый компонент, дающий возможность защитить и спрятать их. То есть ограничить доступ одних компонентов программы к другим. Инкапсуляция позволяет над каждой частью программы работать изолированно. Это такая мантия-невидимка Гарри Поттера.

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

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

Одна точка зрения: ООП полезен в каких-то отношениях, но и создает массу проблем. В частности, сложности с наследованием и код, в котором легко заблудиться. Инженер Роб Пайк, к примеру, назвал дизайн ООП «римскими цифрами в программировании». Есть гипотеза, что будущее не за объектно-ориентированным программированием, а за функциональной парадигмой. Про нее ALMAMAT Blog тоже расскажет.

Другая точка зрения: при хорошем уровне объектного мышления и правильном выборе абстракций и аналогий ООП упрощает систему; позволяет писать без повторов и быстро управлять кодом, добавляя объекты в классы. А поскольку ООП дает возможность представлять сложные объекты в виде агрегатов, то эта парадигма подходит для больших проектов, где каждый из множества разработчиков занимается только своим участком. Многие популярные языки программирования – ОО, объектно-ориентированные, поэтому, понимая принципы ООП, легче изучать языки. Если ООП дается сложно, то нужно развивать абстрактное объектное мышление и пользоваться чек-листами.

Надо понимать, что IT, возможно, одна из самых холиварных сфер. Везде есть свои плюсы и минусы. По мере обучения и практики, программист начинает работать с разными парадигмами. Подписывайтесь в соцсетях. almamat blog
Almamat рассказывает, как стать QA-инженером