Открыть сервис

Объектно-ориентированное программирование

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

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

Классическое ООП опирается на четыре концепции, сформулированные и развитые в 1960–1980-х годах.

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

История

Термин «объектно-ориентированное программирование» ввёл в оборот Алан Кэй в 1967 году. Идейную основу заложил язык Simula-67, разработанный в Норвегии Кристен Нюгор и Оле-Йоханом Далем: в нём впервые появились классы, объекты и наследование. Развитием этих идей стал язык Smalltalk, созданный в исследовательском центре Xerox PARC под руководством Алана Кэя; в нём объектами являлись даже числа и сами классы, а взаимодействие строилось на передаче сообщений.

В 1980-е годы ООП вышло за пределы исследовательских лабораторий. Язык C++ (Бьёрн Страуструп) соединил объектную модель с производительностью C, а Objective-C и Object Pascal расширили объектный подход на платформы Apple и Borland соответственно. В 1990-е годы ООП стало доминирующей парадигмой: появились Java, C#, Python, Ruby, а позже — Kotlin, Swift и TypeScript. В России объектный подход широко применяется в промышленной разработке, обучении и научных исследованиях; на русском языке вышло значительное число учебников и переводных руководств по этой теме.

Класс и объект

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

Отношения между классами описываются несколькими способами:

ОтношениеСмысл
Наследование«является» (собака — животное)
Композиция«состоит из» с жёсткой связью (двигатель — часть автомобиля)
Агрегация«содержит» с независимым жизненным циклом (команда и игроки)
Ассоциацияпроизвольная связь между объектами

Виды и расширения

Помимо классического ООП на основе классов, существует прототипное программирование, где новые объекты создаются клонированием существующих (JavaScript, Self). Компонентно-ориентированное программирование строит системы из независимых модулей с чёткими контрактами. Аспектно-ориентированное программирование выносит сквозную функциональность (логирование, безопасность) в отдельные аспекты. Функциональное ООП сочетает объекты с неизменяемыми данными и чистыми функциями (Scala, F#, отчасти Kotlin).

Применение

ООП применяется в разработке корпоративных информационных систем, мобильных и веб-приложений, игровых движков, систем автоматизации и встроенного программного обеспечения. Объектная декомпозиция удобна там, где предметная область естественно распадается на сущности с состоянием и поведением: банковские счета, документы, устройства, пользователи. Широкое распространение получили шаблоны проектирования — типовые решения повторяющихся задач (фабрика, наблюдатель, стратегия, одиночка), систематизированные «Бандой четырёх» в 1994 году.

Критика

ООП неоднократно подвергалось критике. Указывают на сложность иерархий наследования, приводящую к хрупкости кода, на неявное разделяемое состояние, затрудняющее параллельные вычисления, и на избыточность абстракций в небольших задачах. Лука Карделли и Мартин Одерски отмечали, что смешение данных и поведения усложняет композицию. Ответом стали принципы SOLID, предпочтение композиции наследованию и распространение иммутабельных структур. Несмотря на критику, ООП остаётся одной из наиболее востребованных парадигм в индустрии.

Связанные понятия

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

Источники: учебные издания по программированию, документация языков C++, Java, Python, Smalltalk, материалы по истории Simula-67 и Smalltalk.