Объектно-ориентированное программирование: суть и задачи
Что это такое? Объектно-ориентированное программирование – парадигма, в центре которой данные и объекты, а не функции, как при процедурном подходе. Примером ООП будет открытие торговой точки, которое начинают с продумывания прилавков и ассортимента, которые являются объектами.
На что обратить внимание? Принципами объектно-ориентированного программирования являются полиморфизм, абстракция, наследование и инкапсуляция. Они используются во многих популярных языках — C++, Python, PHP, JS, Java.
В статье рассказывается:
- Суть объектно-ориентированного программирования
- Принципы ООП
- Структура объектно-ориентированного программирования
- Плюсы и минусы объектно-ориентированного программирования
- Языки в ООП
- 3 полезных книги по ООП
- Часто задаваемые вопросы об объектно-ориентированном программировании
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.
Бесплатно от Geekbrains
Суть объектно-ориентированного программирования
Объектно-ориентированное программирование (ООП) представляет собой подход, который рассматривает программу в качестве набора объектов, взаимодействующих между собой. Каждый из этих объектов имеет свои характеристики и поведение. ООП помогает ускорить процесс написания кода и сделать его более читаемым.
Изначально данный подход создавался для того, чтобы связать поведение объектов с их классами. Дело в том, что людям проще воспринимать окружающий мир в виде объектов, которые можно классифицировать. Яркий пример – разделение на живую и неживую природу.
Предшественником ООП является процедурное программирование. В рамках этого подхода программа рассматривается как набор процедур и функций, которые называются подпрограммами. Эти подпрограммы выполняют тот или иной блок кода с нужными входящими данными. Данный способ позволяет писать легкие программы с простой структурой.
Однако, когда блоки кода увеличиваются, а функций становится очень много, разработчик вынужден корректировать каждую из них. Ему приходится поэтапно продумывать новую логику. В таких ситуациях нередко образуется большое количество плохо читаемого перемешанного кода, который иногда называют «спагетти-кодом» или «лапшой».
При использовании ООП разработчик получает возможно вносить изменения лишь один раз. Ему нужно обработать объект, который выступает в качестве ключевого элемента программы. При этом все операции рассматриваются как взаимодействия различных объектов. Код становится более читаемым. Итоговую программу проще масштабировать.
Задачи, которые решаются с помощью подхода ООП:
- точная установка взаимодействия объектов;
- написание читабельного кода;
- структурирование данных, недопущение путаницы;
- повышение управляемости программы;
- ускоренное масштабирование кода в тех или иных целях;
- качественная поддержка готовых программ;
- корректировка кода без его полного переписывания.
Принципы ООП
Основы объектно-ориентированного программирования представляют собой перечень принципов, которые формируют данный подход. Иными словами, это правила разработки и применения всех структурных элементов (в т.ч. классов, объектов, методов и т.д.).
Инкапсуляция
Все важные данные, которые требуются для функционирования объекта, должны хранится в нем самом. Лишь некоторая информация доступна для внешних элементов.
Внутри объекта или класса хранятся все данные этого объекта или класса. Таким образом, разработчик не может их редактировать при помощи других классов. Окружающие элементы могут лишь запрашивать «публичные» методы и атрибуты.
Узнай, какие ИТ — профессии
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Павел Симонов
Исполнительный директор Geekbrains
Команда GeekBrains совместно с международными специалистами по развитию карьеры подготовили материалы, которые помогут вам начать путь к профессии мечты.
Подборка содержит только самые востребованные и высокооплачиваемые специальности и направления в IT-сфере. 86% наших учеников с помощью данных материалов определились с карьерной целью на ближайшее будущее!
Скачивайте и используйте уже сегодня:

Павел Симонов
Исполнительный директор Geekbrains
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
Получить подборку бесплатно
Уже скачали 25508
Зачем же это все нужно? Во-первых, данный подход повышает уровень безопасности. Во-вторых, он помогает снизить вероятность случайного повреждения информации внутри класса или объекта.
Наследование
Наследование представляет собой метод организации объектов и классов. Чтобы разработчику не приходилось собственноручно создавать множество элементов, он может сформировать класс над классами. Они будут иметь более общие характеристики и функции. В результате программист может поэтапно наследовать от них какие-либо возможности.
При помощи специальной конструкции разработчик берет те или иные атрибуты или методы из класса. Затем он их редактирует либо оставляет в исходном виде. Далее разработчик формирует с помощью этих атрибутов/методов уникальный объект или подкласс, чтобы перейти к этапу наследования опций.
Для наглядности рассмотрим конкретный пример:
- Класс«Транспортное средство» имеет следующие характеристики: возможность набирать скорость и перевозить пассажиров.
- Соответствующим ему подклассом является «Автобус». Он наследует описанные характеристики своего класса. При этом подкласс уточняет их определенным количеством мест для пассажиров и максимальной скоростью передвижения.
- Формируется объект«Икарус». Он имеет конкретную скорость, планировку, количество дверей, тип сигнала и прочие особенности.
Разработчику не требуется каждый раз формировать новый класс или объект, указывая для него весь необходимый набор опций. Нужно лишь применить конструкцию наподобие этой:
export class Bus extends Vehicle()
Затем код дополняется более конкретными свойствами нового объекта (скорость, планировка и т.д.).
Абстракция
Это еще одно свойство объектно-ориентированного программирования. Его суть заключается в том, что каждый верхний слой над объектом (класс) является более абстрактным, чем его «младшая версия». Разработчику не нужно много раз создавать один и тот же объект, приписывая одинаковые атрибуты и методы.
На основе абстрактных классов формируются все более конкретные классы и вытекающие из них объекты. При этом реализацию функции не нужно заранее переписывать. Программист оставляет базовый шаблон для последующих надстроек.
Абстрактный класс отличается от дочерних тем, что он является публичным и включает в себя реализацию методов.
Полиморфизм
Одни и те же методы могут применяться для обработки различных типов информации. В разных ЯП полиморфизм имеет различные свойства. К примеру, в строго типизированном языке C++ задействуется «перегрузка», а в JavaScript функции могут обрабатывать различные типы данных без необходимости заранее указывать тип.
Следование принципу полиморфизма помогает обрабатывать разные типы информации с использованием одних и тех же методов. К примеру, двузначные числа и числа с плавающей точкой. Кроме того, полиморфизмом называют возможность переопределять методы в дочерних классах. Это необходимо для обработки других типов информации или выполнения дополнительных действий при вызове аналогичного метода.
Структура объектно-ориентированного программирования
Есть четыре базовых элемента кода, который написан по парадигме объектно-ориентированного программирования:
Речь идет о части кода, описывающей элемент с определенными характеристиками и функциями. К примеру, объектами являются карточки товаров в каталоге интернет-магазина, кнопка «заказать» и т.д.
Для вас подарок! В свободном доступе до 14.01 —>
Скачайте ТОП-10
бесплатных нейросетей
для программирования
Помогут писать код быстрее на 25%
Чтобы получить подарок, заполните информацию в открывшемся окне
Это шаблон, который позволяет формировать новые объекты. Если продолжить пример с интернет-магазином, то классом будет являться «Карточка товара». Он описывает общие характеристики всех конкретных карточек или объектов, о которых мы говорили выше.
Классы имеют свойство наследования. Иными словами, подклассы «Карточка товара для дома», «Карточка телевизора», «Карточка планшета» перенимают характеристики (например, стоимость товара, количество товаров на складе и т.д.) родительского класса «Карточка товара». Однако подкласс имеет и свои специфические свойства. К примеру, для «Карточки компьютера» указано количество USB-портов, а для «Карточки телевизора» – разрешение экрана.
Метод в объектно-ориентированном программировании представляет собой функцию внутри объекта или класса, которая дает возможность взаимодействовать с ним или с другой частью кода. К примеру:
- Порекомендовать похожие товары.
- Сопоставить характеристики двух товаров.
- Проверить количество товара в наличии.
- Внести в карточку конкретного объекта определенные данные.
- Атрибут
Атрибуты – это характеристики объекта. К примеру, стоимость, производительность, диагональ экрана и т.д. Разработчик указывает их классе, а затем заполняет эти атрибуты конкретной информацией при помощи методов.
В качестве примера рассмотрим код на языке Java.
Как уже было отмечено, класс представляет собой общую абстракцию, которая описывает структуру объектов. Для начала сформируем класс “Item” для товара, который имеет две характеристики (атрибута) – наименование и стоимость. Чтобы это сделать, воспользуемся конструктором класса (методом), который поможет инициализировать объект. Пример объектно-ориентированного программирования:
private String name;
private String price;
public Item(String name,
public void card()
name + » стоит » + this.price);
После этого укажем еще один метод – card. С его помощью мы узнаем наименование и цену для конкретного товара. После этого зададим атрибуты name и price. Затем сформируем подкласс, который будет иметь одно и то же название – «Телефон». При этом стоимость объектов может различаться.
class Phone extends Item
public Phone(String price)
Таким образом, был взят общий класс Item со всеми его атрибутами и методами и сформирован подкласс, который перенял атрибут name. Если мы вызовем этот подкласс, то потребуется указать лишь стоимость. Название будет присваиваться автоматически.
Теперь попробуем вызвать подкласс и сформировать объект – телефон с конкретной ценой:
public class Main
public static void main(String
Phone1 = new Phone(«30000»);
После этого разработчик получит возможность просматривать информацию об определенном телефоне. Для этого ему нужно будет использовать метод card:
Мы увидим информацию: «Телефон стоит 30 000».
Плюсы и минусы объектно-ориентированного программирования
Объектно-ориентированное программирование, как и любой подход, имеет свои плюсы и минусы. Для начала рассмотрим преимущества ООП:
- Удобство. Разработчику гораздо проще писать код на основе этой парадигмы. Программисту нужно лишь один раз прописать все классы, методы и атрибуты. После этого он сможет создать любое количество объектов.
- Читабельность. Код, написанный в соответствии с принципами объектно-ориентированного программирования, воспринимается намного проще. Его сможет прочесть даже неопытный разработчик, который знает основы данного подхода. У него получится без труда распознать структуру в чужом коде. Кроме того, программисту будет легче искать определенные части и исправлять ошибки.
- Простота обновления. Разработчику не требуется прорабатывать каждую страницу по отдельности, если необходимо отредактировать все карточки товаров. Нужно лишь отредактировать базовый класс.
- Возможность повторного использования кода. Нужно один раз написать код для кнопки «Добавить товар в корзину». После этого его можно будет задействовать при разработке других интернет-магазинов, мобильных приложений и т.д. Таким образом, специалисту не нужно повторно создавать код. Это упрощает процесс программирования и снижает вероятность совершения ошибки.
- Возможность использования шаблонов. Разработчику не нужно собственноручно создавать большинство взаимодействий, так как он может воспользоваться общими шаблонами, которые необходимо лишь немного изменить.
Дарим скидку от 60%
на обучение «Frontend-разработчик» до 14 января
Уже через 9 месяцев сможете устроиться на работу с доходом от 150 000 рублей

Важнейший недостаток объектно-ориентированного программирования заключается в том, что данный подход довольно сложно освоить. Начинающий разработчик может написать свою первую программу по функциональной парадигме, но у него вряд ли получится сделать это в рамках ООП. Сначала потребуется освоить структуры, принципы, а также виды функций объектно-ориентированного программирования.
Еще одним минусом является громоздкость кода. В функциональном программировании зачастую нужно прописать лишь одну функцию, а для выполнения аналогичной задачи в ООП придется сформировать полноценную структуру, которая будет содержать все классы, методы, атрибуты и объекты. С одной стороны, это упрощает восприятие информации, но с другой – усложняет сам код. Он становится более громоздким.
Третий недостаток ООП – низкая производительность. Это является следствием предыдущего пункта. Объектно-ориентированное программирование потребляет больше энергии и требует больших мощностей. В результате падает скорость компиляции.
Языки в ООП
Объектно-ориентированный язык программирования представляет собой набор формальных правил написания программы, который выстроен согласно принципам ООП. На сегодняшний день такие языки являются наиболее распространенными. Перечислим некоторые из них: Python, C#, C++, Cyclone, D, Delphi, Swift, Groovy, Io, Java, JavaScript, JScript .NET, Objective-C, Perl, Lua, Ruby, Scala, PHP, . При этом большинство из этих языков универсальны и могут использоваться в других парадигмах.
Теперь рассмотрим реализацию принципов ООП в ряде популярных ЯП. Стоит учесть, что перед рассмотрением этих паттернов, разработчику нужно изучить основы программирования на выбранном языке. Иными словами, ему нужно разбираться в теории, уметь формировать скрипты и т.д.
ООП PHP
Данный подход в написании кода на языке PHP (ООП PHP) широко применяется в процедурном программировании. Однако, соответствуя принципам ООП PHP, разработчик может сформировать более читабельный код, который будет восприниматься гораздо проще. В практике PHP ООП применяются различные среды разработки, привычные девелоперу.
Кроме того, отсутствуют специфические требования к веб-серверу, хотя большинство разработчиков применяет Open Server. Чтобы ознакомиться с документацией по классам и объектам ООП PHP, нужно перейти на официальный сайт.
Рассмотрим конкретный пример. Допустим, что перед программистом стоит задача создать таблицу работников компании с информацией о них. В первую очередь ему нужно будет сформировать класс ООП на PHP. Для этого необходимо создать файл в отдельной папке на сервере и дать ему название (к примеру, index). В этом же месте потребуется создать еще одну папку для класса – classes. Там будет размещен первый файл для PHP ООП класса (Employee). Затем он должен быть подключен в файле index с помощью команды require_once для последующего применения.
Теперь разработчику нужно сформировать сам класс – class Employee. Необходимо поставить фигурные скобки и описать внутри них тело класса. Речь идет о свойствах (name, age, phone number) и методах. Для инкапсуляции этой информации потребуется определить их свойства как private.
Каждый класс размещается в отдельном файле. Помимо своего описания он не должен содержать никаких данных. Рекомендуется дать файлу и классу одно и то же имя. Как правило, если название содержит в себе несколько слов, то каждое из них пишется с заглавной буквы. Не нужно давать классу имя, которое включено в список зарезервированных слов (его можно найти на официальном веб-сайте). Кроме того, нельзя допускать, чтобы имя начиналось с цифры. Можно ставить букву или символ подчеркивания.
Теперь сформируем PHP ООП объект.
Разработчику потребуется указать имя класса, объект которого нужно создать. Делается это в файле index с помощью директивы new. После этого нужно сформировать переменную объекта (к примеру, 1) для которой будут указываться все значения:
$obj1 = new Employee(‘Ivan’, ‘Petrov’, 30);
Те же действия нужно будет выполнить для создания всех остальных объектов.
Рассмотрим принцип наследования в PHP ООП. Класс Employee будет наследовать характеристики от родительского класса Person, если разработчик задействует оператор extends. Программист также может добавить туда новые свойства (скажем, должность сотрудника):
class Employee extends Person
Стоит учесть, что в языке PHP характеристики могут наследоваться лишь от одного класса.
Разработчик может отредактировать поведение метода родителя (это называется переопределением). Предположим, что внутри класса Person содержится метод save. Он отвечает за автоматическое сохранение данных объекта в БД. Если скорректировать механизм сохранения в процессе наследования, то реакция на один и тот же метод save будет одинакова, однако реализована она будет по-своему. Это пример действия принципа полиморфизма в ООП PHP.
ООП Java
В этом случае можно использовать некоторые распространенные IDE (Integrated Development Environment). Например, NetBeans, BlueJ, IntelliJ IDEA и т.д. В рассмотренном примере мы задействуем NetBeans. В первую очередь потребуется сформировать новый проект и дать ему имя (скажем, OOPJava). Затем в левой части экрана отобразится структура проекта, в которой автоматически появится первый класс с названием Main. Внутри этого класса будет размещен метод public static void, в котором Java будет выполнять весь исходный код.
Нажав на имя пакета правой кнопкой мыши и выбрав New – Java Class, разработчик сможет сформировать новый класс. Далее нужно задать для него имя и указать все нужные характеристики в фигурных скобках. Новый объект в классе формируется по аналогии с предыдущим примером. Делается это с помощью директивы new.
ООП С++
Данный язык является многопарадигматичным. Однако практически все разработчики применяют его в рамках объектно-ориентированной парадигмы.
Процесс формирования классов и объектов в С++ очень схож с предыдущими языками, так что не будем повторяться и сразу перейдем к рассмотрению модификаторов доступа. Эти элементы хорошо передают суть принципа инкапсуляции. Как и в любом другом ЯП, в ООП C++ есть 3 типа модификаторов доступа:
- public – информация будет отображаться везде, даже вне класса;
- protected – информация будет отображаться в классе и его наследниках;
- private – информация будет отображаться только в классе и, следовательно, для преобразований потребуются методы (set, get).
В компиляторе поля объекта будут показываться только с указанием модификатора доступа класса. По умолчанию в данном языке класс объявляется как private.
Также отметим, что модификатор в C++ ООП устанавливается на область, а не конкретно на каждое поле и метод. Приведем конкретный пример:
Что такое объектно ориентированный язык программирования
В настоящее время насчитывается более двух тысяч языков программирования высокого уровня. Большинство этих языков возникло исходя из конкретных требований некоторой предметной области. Каждый новый язык позволял переходить ко все более и более сложным задачам. На каждом новом приложении разработчики языков что-то открывали для себя и изменяли свои представления о существенном и несущественном в языке. На развитие языков программирования значительное влияние оказали достижения теории вычислении, которые привели к формальному пониманию семантики операторов, модулей, абстрактных типов данных и процедур.
Рис. А-1. Генеалогия объектных и объектно-ориентированных языков.
В главе 2 языки программирования были сгруппированы в четыре поколения по признаку поддерживаемых ими абстракции: математические, алгоритмические, ориентированные на данные, объектно-ориентированные. Самые последние достижения в области развития языков программирования связаны с объектной моделью. К настоящему времени мы насчитали более сотни различных объектных и объектно-ориентированных языков. Как говорилось в главе 2, объектными принято называть языки, которые поддерживают абстракции данных и классы; объектно-ориентированными являются те объектные языки, которые поддерживают наследование и полиморфизм.
Общим предком практически всех используемых сегодня объектных и объектно-ориентированных языков является язык Simula, созданный в 1960 году Далем, Мюрхогом и Ныгардом [2]. Язык Simula основывался на идеях ALGOL, но был дополнен механизмом наследования и инкапсуляции. Но еще более существенно то, что Simula, предназначенная для описания систем и моделирования, ввела дисциплину написания программ, отражающих словарь предметной области.
Рис. А-1, заимствованный у Шмукера [3], демонстрирует генеалогию пяти наиболее влиятельных и популярных объектных или объектно-ориентированных языков программирования: Smalltalk. Object Pascal, C++, CLOS и Ada. В следующих разделах мы проанализируем некоторые из этих языков с точки зрения их «объектности».
Язык Smalltalk был разработан командой Xerox Palo Alto Research Center Learning Research Group (Xerox, Пало Альто, Исследовательский центр, группа исследования обучения), как программная часть Dynabook — фантастического проекта Алана Кея (Alan Kay). В основу были положены идеи Simula, хотя известное влияние оказали также язык FLEX и работы Сеймора Паперта (Seymore Papert) и Валласа Феурзейга (Wallace Feurzeig). Smalltalk является одновременно и языком программирования, и средой разработки программ. Это — чисто объектно-ориентированный язык, в котором абсолютно все рассматривается как объекты; даже целые числа — это классы. Вслед за Simula, Smalltalk является важнейшим объектно-ориентированным языком, поскольку он не только оказал влияние на последующие поколения языков программирования, но и заложил основы современного графического интерфейса пользователя, на которых непосредственно базируются интерфейсы Macintosh, Windows и Motif.
Развитие Smalltalk потребовало почти десятилетних усилий группы энтузиастов. Главным архитектором на протяжении почти всей работы был Дэн Ингалс (Dan Ingalls), но значительный вклад внесли также Питер Дейч (Peter Deutsh), Гленн Краснер (Glenn Krasner) и Ким МакКолл (Kim McCall). Параллельно, усилиями Джеймса Альтхофа (James Althoff), Роберта Флегала (Robert Flegal), Неда Келера (Ned Kaehler), Дианы Мерри (Diana Merry) и Стива Паца (Steve Putz) разрабатывалась оболочка Smalltalk. Адель Голдберг (Adele Goldberg) и Дэвид Робсон (David Robson) взяли на себя роль летописцев проекта.
Известны пять выпусков языка Smalltalk, обозначаемых по году их появления:
Smalltalk-72, -74. -76, -78, и самое свежее воплощение — Smalltalk-80. Реализации 1972 и 1974 годов заложили основу языка, в частности идею передачи сообщений и полиморфизм, хотя механизм наследования еще не появился. В последующих версиях полноправное гражданство получили классы; этим достигла завершения точка зрения, что все состоит из объектов. Smalltalk-80 был перенесен на многие компьютерные платформы.
Есть также один важный диалект (схожий со Smalltalk-80), получивший название Smalltalk/V. Он создан фирмой Digitalk для IBM PC (Windows и OS/2) и Macintosh. За исключением классов пользовательского интерфейса, библиотеки классов Smalltalk/V в обеих версиях практически идентичны. Среда и инструменты разработки также напоминают Smalltalk-80 [4].
- все является объектами;
- объекты взаимодействуют, обмениваясь сообщениями.
| Абстракции | Переменные экземпляра Методы экземпляра Переменные класса Методы класса | Да Да Да Да |
| Инкапсуляция | Переменных Методов | Закрытые Открытые |
| Модульность | Разновидности модулей | Нет |
| Иерархии | Наследование Шаблоны Метаклассы | Одиночное Нет Да |
| Типизация | Сильная типизация Полиморфизм | Нет Да (одиночный) |
| Параллельность | Многозадачность | Непрямая (посредством классов) |
| Сохраняемость | Долгоживущие объекты | Нет |
Таблица А-1. Smalltalk.
Основными руководствами по языку Smalltalk являются книги «Smalltalk-80:
The Language», Голдберг и Робсон [7]; «Smalltalk-80: The Interactive Programming Environment», Голдберг [8]; «Smalltalk-80: Bit of History Words of Advice», Kpacнер, [9]. ЛаЛонд и Пух [10] подробно исследуют Smalltalk-80, в том числе библиотеки классов и средства разработки приложений.
А.3. Object Pascal
Object Pascal создавался сотрудниками компании Apple Computer (некоторые из которых были участниками проекта Smalltalk) совместно с Никлаусом Виртом (Niklaus Wirth), создателем языка Pascal. Непосредственным предшественником Object Pascal является Clascal (объектно-ориентированная версия Pascal для компьютера Lisa). Object Pascal известен с 1986 года и является первым объектно-ориентированным языком программирования, который был включен в Macintosh Programmer’s Workshop (MPW), среду разработки для компьютеров Macintosh фирмы Apple. Для MPW создана библиотека классов, называемая МасАрр, являющаяся основой для создания прикладных приложений, отвечающих требованиям к интерфейсу пользователя Macintosh.
Шмукер (Schmucker) утверждает, что «Object Pascal — это «скелет» объектно-ориентированного языка [ В последние годы этот язык стал очень популярен благодаря системе Delphi фирмы Borland. — Примеч. ред. ]. В нем нет методов класса, переменных класса, множественного наследования и метаклассов. Эти механизмы исключены специально, чтобы сделать язык простым для изучения начинающими «объектными» программистами» [11].
В табл. А-2 приведены общие характеристики Object Pascal.
| Абстракции | Переменные экземпляра Методы экземпляра Переменные класса Методы класса | Да Да Нет Нет |
| Инкапсуляция | Переменных Методов | Открытые Открытые |
| Модульность | Разновидности модулей | Модуль (unit) |
| Иерархии | Наследование Шаблоны Метаклассы | Одиночное Нет Нет |
| Типизация | Сильная типизация Полиморфизм | Да Да (одиночный) |
| Параллельность | Многозадачность | Нет |
| Сохраняемость | Долгоживущие объекты | Нет |
Таблица А-2. Object Pascal.
Основным руководством по Object Pascal является «MPW Object Pascal Reference» от Apple [12].
Язык программирования C++ был разработан Бьерном Страуструпом, сотрудником AT&T Bell Laboratories. Непосредственным предшественником C++ является С with Classes, созданный тем же автором в 1980 году. Язык С with Classes, в свою очередь, был создан под сильным влиянием С и Simula. C++ — это в значительной степени надстройка над С. В определенном смысле можно назвать C++ улучшенным С, тем С, который обеспечивает контроль типов, перегрузку функций и ряд других удобств. Но главное в том, что C++ добавляет к С объектную ориентированность.
Известны несколько версий C++. В версии 1.0 реализованы основные механизмы объектно-ориентированного программирования, такие как одиночное наследование и полиморфизм, проверка типов и перегрузка функций. В созданной в 1989 году версии 2.0 нашли отражение многие дополнительные свойства (например, множественное наследование), возникшие на базе широкого опыта применения языка многочисленным сообществом пользователей. В версии 3.0 (1990) появились шаблоны (параметризованные классы) и обработка исключений. Комитет ANSI по C++ (X3J16) недавно одобрил предложения по введению пространств имен (что соответствует нашему обозначению категорий классов) и проверки типов во время исполнения.
Первые компиляторы C++ строились на основе препроцессора для языка С, названного cfront. Поскольку этот транслятор создавал промежуточный код на С, он позволил очень быстро перенести C++ практически на все UNIX-системы. Сейчас почти на всех платформах созданы (в том числе коммерческие) «настоящие» компиляторы C++.
Страуструп пишет: «C++ создавался с целью избавить автора и его друзей от необходимости программировать на ассемблере, С или других современных языках такого уровня. Главной задачей было придумать язык, на котором удобно писать хорошие программы и с которым программисту приятно работать. C++ никогда не проектировался на бумаге. Его проектирование, документирование и реализация выполнялись одновременно» [13]. C++ исправил многие недостатки С и ввел описания классов, контроль типов, перегрузку функций, управление памятью, постоянные типы, ссылки, встраиваемые функции, производные классы и виртуальные функции [14].
Характеристики C++ приведены в табл. А-3.
| Абстракции | Переменные экземпляра Методы экземпляра Переменные класса Методы класса | Да Да Да Да |
| Инкапсуляция | Переменных Методов | Открытые, защищенные, закрытые Открытые, защищенные, закрытые |
| Модульность | Разновидности модулей | файл |
| Иерархии | Наследование Шаблоны Метаклассы | Множественное Да Нет |
| Типизация | Сильная типизация Полиморфизм | Да Да (одиночный) |
| Параллельность | Многозадачность | Непрямая (посредством классов) |
| Сохраняемость | Долгоживущие объекты | Нет |
Таблица А-3. C++.
Снова вернемся к задаче определения фигур. В C++ принято описывать интерфейсную часть классов в заголовочных файлах. Мы можем написать:
int x;
int y;
class Shape <
public:
Shape();
void setCenter(Point p>;
virtual void draw() = 0;
Point center() const;
Point theCenter;
class Circle : public Shape <
public:
Circle();
void setRadius(int r);
virtual void draw();
int radius() const;
int theRadius;
class Rectangle : public Shape <
public:
Rectangle();
void setHeight(int h);
void setWidth(int w);
virtual void draw();
int height() conat;
int width() const;
int theHeigh;
int theWidth;
class SolidRectangle : public Rectangle <
public:
virtual void draw();
Определение C++ не предполагает наличия библиотеки классов. Для наших целей мы предположим наличие программного интерфейса Х Windows и глобальных объектов Display, window, GraphicsContext (требуемых xlib). Теперь можно завершить разработку, написав в отдельном файле реализацию методов, перечисленных выше:
theCenter.x = 0;
theCenter.y = 0;
void Shape::getCenter(Point p)
theCenter = p;
Point Shape::center() const
return theCenter;
void Circle: :setRadius( int r)
theRadius = r;
int x = (center().x — theRadius);
int y = (center().y — theRadius);
XDrawArc(Display, Window, GraphicsContext, x, y,
(theRadius ∙ 2), (theRadius * 2), 0, (360 ∙ 64));
int Circle::radius() const
return theRadius;
Rectangle::Rectangle() : theHeight(0), theWidth(0) <>;
void Rectangle::setHeight( int h)
theHeight = h;
void Rectangle::setWidth( int w)
theWidth = w;
int x = (center().x — (theWidth / 2));
int y = (center().y — (theHeight / 2));
XDrawRectangle(Display, Window, GraphicsContext, x, y, thewidth, theHeight);
int Rectangle::height() const
return theHeight;
int Rectangle::width() const
return thewidth;
Rectangle::draw();
int x — (center().x — (width() / 2));
int y — (center().y — (height() / 2));
gc oldGraphicsContext = GraphicsContext;
XSetForeground(Display, GraphicsContext, Gray);
XDrawFilled(Display, Window, GraphicsContext, x, y,
width(), height());
GraphicsContext = OldGraphicsContext;
Основной ссылкой по C++ является «Annotated C++ Reference Manual» Эллис и Страуструпа [15]. Кроме того, Страуструп [16] предложил углубленный анализ языка и его использования в контексте объектно-ориентированного проектирования.
А.5. Common Lisp Object System (CLOS)
Существуют буквально десятки диалектов языка Lisp, включая MacLisp, Standard Lisp, SpiceLisp, S-1 Lisp, ZetaLisp, Nil, InterLisp и Scheme. В начале 80-х годов под воздействием идей объектно-ориентированного программирования возникла серия новых диалектов Lisp, многие из которых были ориентированы на представление знаний. Успех в стандартизации Common Lisp стимулировал попытки стандартизировать объектно-ориентированные диалекты в 1986 году.
Идея стандартизации была поддержана летней конференцией ACM по Lisp и функциональному программированию 1986 года, в результате чего была создана специальная рабочая группа при комитете X3J13 ANSI (комитет по стандартизации Common Lisp). Поскольку новый диалект должен был стать надстройкой над Common Lisp, он получил название Common Lisp Object System (Объектная система Common Lisp) или, сокращенно, — CLOS. Возглавил комитет Дэниел Бобров (Daniel Bobrow), а его членами стали Соня Кин (Sonya Keene), Линда де Мичил (Linda DeMichiel), Патрик Дассад (Patrick Dussud), Ричард Габриель (Richard Gabriel), Джеймс Кемпф (James Kempf), Грегор Кисазлес (Gregor Kicazles) и Дэвид Мун (David Moon).
Серьезное влияние на проект CLOS оказали языки NewFlavors и CommonLoops. После двухлетней работы, в 1988 году была опубликована полная спецификация CLOS.
- представлять собой стандартное расширение языка, включающее все наиболее полезные свойства существующей объектно-ориентированной парадигмы;
- обеспечить эффективный и гибкий интерфейс программиста, позволяющий реализовать большинство прикладных задач;
- проектироваться как расширяемый протокол, так, чтобы можно было изменять его поведение, тем самым стимулируя дальнейшие исследования в области объектно-ориентированного программирования [17].
| Абстракции | Переменные экземпляра Методы экземпляра Переменные класса Методы класса | Да Да Да Да |
| Инкапсуляция | Переменных Методов | Чтение, запись, доступ Открытые |
| Модульность | Разновидности модулей | Пакет |
| Иерархии | Наследование Шаблоны Метаклассы | Множественное Нет Да |
| Типизация | Сильная типизация Полиморфизм | Возможна Да (множественный) |
| Параллельность | Многозадачность | Да |
| Сохраняемость | Долгоживущие объекты | Нет |
Таблица А-4. CLOS.
Основным руководством по языку CLOS является -«Common Lisp Object System Specification» [19].
Министерство обороны США, возможно, самый крупный в мире пользователь компьютеров. В середине 70-х годов программные разработки этого департамента достигли критической точки: проекты выходили из временных и бюджетных рамок, а заданных характеристик достичь не удавалось. Стало очевидно, что дальше ситуация только ухудшится, стоимость разработки программных систем взлетит еще выше, а потребность в программах будет расти экспоненциально. Для решения всех этих проблем, отягощенных вдобавок наличием сотен языков программирования, министерство обороны профинансировало проект создания единого общего языка высокого уровня. В некотором смысле Ada является одним из первых языков программирования, выпущенных промышленным способом. Исходные требования были сформулированы в 1975 году (Steelman) и реализованы в 1978 году. Был объявлен международный конкурс, на который откликнулось 17 участников. Это число затем было сокращено до четырех, затем до двух, и наконец до одного; при этом в проектировании и испытаниях участвовали сотни ученых по всему миру.
Проект-победитель вначале носил условное наименование Green (в конкурсе проект имел зеленый кодовый знак); позднее он получил имя Ada в честь Ады Августы графини Лавлейс (Ada Augusta Lovelace), которая была удостоена этой чести за свои соображения о потенциальных возможностях компьютеров. Основным разработчиком языка был Жан Икбьян (Jean Ichbian) из Франции. В команду разработчиков входили: Бернд Криг-Брюкнер (Bernd Krieg-Brueckner), Бриан Вичман (Brian Wichmann), Анри Ледгар (Henry Ledgard), Жан-Клод Ельяр (Jean-Claude Heliard), Жан-Лу Гайли (Jean-Loup Gailly), Жан-Раймон Абриаль (Jean-Raymond Abrial), Джон Барнс (John Barnes), Майк Вуджер (Mike Woodger), Оливье Рубин (Olivier Roubine), С. А. Шуман (S. A. Schumann) и С. С. Весталь (S. С. Vestal).
Непосредственными предшественниками Ada являются Pascal и его производные, включая Euclid, Lis, Mesa, Modula и Sue. Были использованы некоторые концепции ALGOL-68, Simula, CLU и Alphard. Стандарт ANSI для Ada был окончательно издан в 1983 году. Трансляторы Ada, хотя и не сразу, были реализованы для всех основных архитектур. Будучи созданным благодаря министерству обороны, язык Ada сегодня используется во многих государственных и коммерческих проектах. Ada — традиционный язык разработки больших и сложных систем, например, системы управления воздушным движением в США и Канаде. Стандарты ANSI должны пересматриваться каждые пять лет, поэтому в настоящее время изучается проект Ada 9x. В нем в исходное определение языка внесен ряд незначительных исправлений: уточнения, устранение очевидных пробелов, исправления ошибок. В настоящем виде Ada является объектным, но не объектно-ориентированным языком. Проект 9x подразумевает расширение языка до уровня объектно-ориентированного.
- надежности и эксплуатационных качествах программ;
- программировании как разновидности человеческой деятельности;
- эффективности [20].
| Абстракции | Переменные экземпляра Методы экземпляра Переменные класса Методы класса | Да Да Нет Нет |
| Инкапсуляция | Переменных Методов | Открытые, закрытые Открытые, закрытые |
| Модульность | Разновидности модулей | Пакет |
| Иерархии | Наследование Шаблоны Метаклассы | Нет (входит в Ada9x) Да Нет |
| Типизация | Сильная типизация Полиморфизм | Да Нет (входит в Ada9x) |
| Параллельность | Многозадачность | Да |
| Сохраняемость | Долгоживущие объекты | Нет |
Таблица А-5. Ada.
Ссылки
Основным руководством по языку Ada является «Reference Manual for the Ada Programming Language» [21].
Автор Eiffel Бертран Мейер (Bertrand Meyer) создавал не только язык объектно-ориентированного программирование, но и инструмент проектирования программ.
Несмотря на сильное влияние Simula, Eiffel — вполне самостоятельный объектно-ориентированный язык со своей собственной средой разработки.
Eiffel поддерживает динамическое связывание и статическую типизацию, тем самым обеспечивая гибкость интерфейсов классов в сочетании с безопасным использованием типов. В Eiffel есть несколько важных черт, поддерживающих более жесткий стиль программирования, в том числе параметризованные классы, утверждения и исключения. Мейер считает, что обобщенные классы хорошо дополняют наследование, учитывая горизонтальный уровень общности; новые классы на одном уровне иерархии можно создавать, используя тип в качестве параметра, а не плодя практически одинаковые подклассы.
Неотъемлемой частью языка являются пред- и постусловия, то есть утверждения, которые должны выполняться при входе в метод и выходе из него. Нарушение утверждения вызывает исключительную ситуацию. Ее можно перехватить, обработать и попробовать вызвать тот же метод еще раз.
Eiffel поощряет хорошее программирование, добротную спецификацию классов, сильную типизацию и повторное использование, как через наследование, так и через параметризацию. Формальная трактовка исключительных ситуаций позволяет жестко специфицировать интерфейсы классов при реализации.
Eiffel предоставляет законченную среду разработки программ, включая специальный редактор с выделением синтаксиса, генератор документации, библиотеки классов и броузер. Кроме того, поддерживаются средства управления кодом и сборкой программ.
Свойства языка с точки зрения нашей модели показаны в табл. А-6.
| Абстракции | Переменные экземпляра Методы экземпляра Переменные класса Методы класса | Да Да Нет Нет |
| Инкапсуляция | Переменных Методов | Закрытые Открытые, закрытые |
| Модульность | Разновидности модулей | Блок (unit) |
| Иерархии | Наследование Шаблоны Метаклассы | Множественное Да Нет |
| Типизация | Сильная типизация Полиморфизм | Да Да |
| Параллельность | Многозадачность | Нет |
| Сохраняемость | Долгоживущие объекты | Нет |
Таблица А-6. Eiffel.
Лучше всего взять книгу Мейера «Object Oriented Software Construction» [22].
А.8. Другие объектно-ориентированные языки программирования
На рис. А-2 вы найдете названия многих важных объектных и объектно-ориентированных языков, в библиографии есть ссылки на информацию о большинстве из них.
Объектно-ориентированный язык программирования
В основе концепции объектно-ориентированного программирования лежит понятие объекта — некой субстанции, которая объединяет в себе поля (данные) и методы (выполняемые объектом действия).
Например, объект человек может иметь поля имя , фамилия и методы есть и спать . Соответственно, в программе можем использовать операторы Человек.Имя:=»Иван» и Человек.Есть(пища) .
Особенности , Ulan
В современных ОО языках используются механизмы:
- Наследование. Создание нового класса объектов путём добавления новых элементов (методов). Некоторые ОО языки позволяют выполнять множественное наследование, то есть объединять в одном классе возможности нескольких других классов.
- Инкапсуляция. Сокрытие деталей реализации, которое позволяет вносить изменения в части программы безболезненно для других её частей, что существенно упрощает сопровождение и модификацию ПО.
- Полиморфизм. При полиморфизме некоторые части (методы) родительского класса заменяются новыми, реализующими специфические для данного потомка действия. Таким образом, интерфейс классов остаётся прежним, а реализация методов с одинаковым названием и набором параметров различается. С полиморфизмом тесно связано позднее связывание.
Список языков
Неполный список объектно-ориентированных языков программирования:
Кроме ОО-языков общего назначения существуют и узкоспециализированные ОО-языки.
Литература
- Иан Грэхем. Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. — 3-е изд. — М .: Вильямс, 2004. — 880 с. — ISBN 0-201-61913-X
- Антони Синтес. Освой самостоятельно объектно-ориентированное программирование за 21 день = Sams Teach Yourself Object-Oriented Programming in 21 Days. — М .: Вильямс, 2002. — 672 с. — ISBN 0-672-32109-12
- Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на С++. — Бином, 1998. — ISBN 0-8053-5340-2, ISBN 5-7989-0067-3, ISBN 5-7940-0017-1
- Петер Коуд (Дэвид Норт, Марк Мэйфилд). Объектные модели. Стратегии, шаблоны и приложения.
Ссылки
- Объектно-ориентированные языки программирования
Wikimedia Foundation . 2010 .
Полезное
Смотреть что такое «Объектно-ориентированный язык программирования» в других словарях:
- объектно-ориентированный язык (программирования) — Язык описания программы поведением совокупности взаимосвязанных объектов. [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN object oriented language … Справочник технического переводчика
- Объектно-ориентированный язык — язык программирования, поддерживающий понятие объектов, их свойств и методов обработки. Объектно ориентированный язык объектный язык программирования, поддерживающий наследование и полиморфизм. См. также: Объектно ориентированные языки… … Финансовый словарь
- объектно-ориентированный язык — Язык программирования, который соответствует концепциям объектно ориентированного программирования. [ГОСТ 19781 90] Тематики обеспеч. систем обраб. информ. программное EN object oriented language … Справочник технического переводчика
- объектно-ориентированный язык и интерактивная среда программирования — — [Е.С.Алексеев, А.А.Мячев. Англо русский толковый словарь по системотехнике ЭВМ. Москва 1993] Тематики информационные технологии в целом EN Smalltalk … Справочник технического переводчика
- Предметно-ориентированный язык программирования — (англ. domain specific programming language, domain specific language, DSL) язык программирования, специально разработанный для решения определённого круга задач, в отличие от языков программирования общего назначения, таких, как Си,… … Википедия
- Язык программирования Java — разработанный корпорацией Sun Microsistems межплатформенный, интерпретируемый, объектно ориентированный язык программирования, используемый для создания приложений, работающих в под управлением веб браузера и характеризующихся высоким уровнем… … Финансовый словарь
- Объектно-ориентированный подход — Объектно ориентированное программирование (ООП) парадигма программирования, в которой основными концепциями являются понятия объектов и классов (либо, в менее известном варианте языков с прототипированием прототипов). Класс это тип, описывающий… … Википедия
- Язык программирования Рубин — Ruby Семантика: мультипарадигмальный Тип исполнения: интерпретатор Появился в: 1995 г. Автор(ы): Юкихиро Мацумото Последняя версия: 1.9.1 … Википедия
- Язык программирования Java — Java Класс языка: объектно ориентированный, структурный, императивный Появился в: 1995 г. Автор(ы): Sun Microsystems Последняя версия: Java Standard Edition 6 (1.6.14) Т … Википедия
- Язык программирования Dylan — Dylan динамический объектно ориентированный язык программирования, нацеленный на быструю разработку программ, разработанный, прежде всего, усилиями множественное наследование, полиморфизм и многие другие функции. Язык общего назначения,… … Википедия
- Обратная связь: Техподдержка, Реклама на сайте
- Путешествия
Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.
- Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
- Искать во всех словарях
- Искать в переводах
- Искать в ИнтернетеИскать в этой же категории
Объектно-ориентированное программирование простым языком — объясняют эксперты
Спросили у экспертов, как простыми словами объяснить начинающему программисту, что такое ООП.
В интернете можно найти много описаний ООП, однако начинающий программист рискует их не понять. Мы попросили экспертов объяснить суть этой методологии простыми словами.
Что такое объектно-ориентированное программирование?
Андрей Когунь
руководитель группы Java-разработчиков ИТ-компании КРОК
Самый простой способ объяснить и понять ООП — воспользоваться метафорой. Метафорой объекта в ООП является объект реального мира, например, человек. Объекты надо отличать между собой и у них есть что-то, что их определяет. Например, для человека это может быть имя, когда мы говорим про нашего знакомого Васю, и все понимают о ком речь. Люди неким образом похожи друг на друга. Подмножество людей, обладающих одинаковым набором свойств (имя, фамилия, возраст и т.д.) и общим поведением, будет называться класс. Возьмем для примера сотрудников нашей компании. Для каждого из нас определен департамент (я, например, в департаменте разработки ПО числюсь, ДРПО), должность, уровень зарплаты и т.д. Эти свойства обычно определяют в момент, когда в компанию приходит новый сотрудник. У человека можно запросить информацию по его навыкам или попросить помочь коллеге — это общее поведение для всех сотрудников.
Зарплату сотрудника знает он сам, его руководитель и бухгалтер, остальные — нет. Такое сокрытие данных называется инкапсуляция. Какие свойства и поведение будет доступно другим объектам обычно определяется на уровне класса. Руководитель отдела также является сотрудником, но он обладает рядом дополнительных свойств, например, у него есть подчиненные. Таким образом класс «руководитель», расширяет класс «сотрудник» или, другими словами, происходит наследование. При этом между классами устанавливается отношение «является» — то есть любой руководитель является сотрудником, но не наоборот — не каждый сотрудник является руководителем. Если у класса больше одного наследника, то образуется иерархия. Классы, которые являются родственниками в иерархии не связаны отношением «является», например, бухгалтер является сотрудником, но бухгалтер не является руководителем.
При помощи этих правил иерархию можно проверить на корректность. Если взять ведомость со списком всех сотрудников, в нее очевидным образом попадут и руководители, и бухгалтеры, но в общем списке они не будут отличаться от других сотрудников. Если мы захотим уточнить список подчиненных у каждого руководителя, то нам понадобится подготовить отдельную ведомость со свойствами, специфичными для класса «руководитель». Такое свойство объектов называется полиморфизмом, где состав свойств и поведение будет определяться классом, через который мы смотрим на объект: мы можем обращаться к объекту, как и к любому из предков его класса, но это не верно для потомков или других родственников.
Так мы рассмотрели, как связаны объекты и классы, и такие понятия, как: инкапсуляция, наследование и полиморфизм. Все это — базовые понятия ООП.
Игорь Кропотов
ведущий инженер-программист IT-компании DD Planet
Объектно-ориентированное программирование – это подход, при котором вся программа рассматривается как набор взаимодействующих друг с другом объектов. При этом нам важно знать их характеристики.
У каждого объекта в системе есть свойства и поведение, как и у любого реального объекта. Например, рассмотрим объект «машина». У него есть свойства (цвет, вес, стоимость) и поведение (машина может ехать, сигналить, потреблять топливо).
Такой подход помогает строить сложные системы более просто и естественно благодаря тому, что вся предметная область разбивается на объекты и каждый из них слабо связан с другими объектами. Слабая связанность возникает вследствие соблюдения трех принципов: инкапсуляции, наследования и полиморфизма.
- Инкапсуляция – сокрытие поведения объекта внутри него. Объекту «водитель» не нужно знать, что происходит в объекте «машина», чтобы она ехала. Это ключевой принцип ООП.
- Наследование. Есть объекты «человек» и «водитель». У них есть явно что-то общее. Наследование позволяет выделить это общее в один объект (в данном случае более общим будет человек), а водителя — определить как человека, но с дополнительными свойствами и/или поведением. Например, у водителя есть водительские права, а у человека их может не быть.
- Полиморфизм – это переопределение поведения. Можно снова рассмотреть «человека» и «водителя», но теперь добавить «пешехода». Человек умеет как-то передвигаться, но как именно, зависит от того, водитель он или пешеход. То есть у пешехода и водителя схожее поведение, но реализованное по-разному: один перемещается ногами, другой – на машине.
ООП позволяет упростить сложные объекты, составляя их из более маленьких и простых, поэтому над программой могут работать сотни разработчиков, каждый из которых занят своим блоком. Большинство современных языков программирования — объектно-ориентированные, и, однажды поняв суть, вы сможете освоить сразу несколько языков.
Глеб Лысов
старший разработчик систем автоматизации и поддержки сервисов мониторинга и реагирования на киберугрозы в BI.ZONE
Методология объектно-ориентированного программирования (ООП) подразумевает представление всей программы или ее частей объектами. У каждого объекта есть тип — в ООП он называется классом. Классы можно объявлять или наследовать и создавать из них экземпляры. Собственно, объект — это и есть экземпляр класса.
Обычно объект объединяет в себе данные и методы для работы с ними. Представим, что у нас есть тип «Позвоночное существо», у которого есть свойство «Класс». У каждого из Позвоночных существ это свойство равно одному из пяти значений: Рыба, Земноводное, Птица, Пресмыкающееся, Млекопитающее. Добавим метод получить_класс — он будет возвращать это значение. Далее объявим тип «Человек», который наследует типу «Позвоночное существо». Создадим несколько экземпляров: Иван Иванов, Марина Иванова, Антон Антонов. Добавим присущие только Человеку свойства: Имя и Фамилию. У каждого из них будет метод получить_имя/получить_фамилию, а также перешедший от Позвоночного существа метод получить_класс.
Так можно продолжать сколь угодно долго: повторно описывать методы родительских классов нам не нужно, и любой экземпляр класса будет обладать заявленными свойствами.
Основные задачи ООП — структурировать код, повысить его читабельность и ускорить понимание логики программы. Косвенно выполняются и другие задачи: например, повышается безопасность кода и сокращается его дублирование.
Дело в том, что человеку гораздо удобнее работать с реальными объектами, чем отдельно с набором данных и функциями. Представляя данные в программе как свойства объекта, а функции по обработке данных — как возможные методы объекта, мы приближаем процесс программирования к процессу описания метода решения задачи. Это достигается за счет добавления знакомой человеку структуры абстракций: ведь даже язык, на котором мы говорим, следует принципам ООП. У каждой буквы есть произношение и написание, каждое слово включает буквы и имеет свое произношение и написание, то же верно и для предложений, и для более крупных конструкций. Все в этом мире — объект!
Главное, о чем не стоит забывать: ООП — это не единственная парадигма. У нее есть свои плюсы и минусы, для каких-то задач она подходит, для каких-то — нет. Например, ООП не даст особых преимуществ, если вы пишете «однострочники» и простые скрипты. Однако в больших проектах неразделенный на отдельные сущности код быстро превратится в «лапшу» и перестанет читаться, и ООП здесь сильно упростит работу.
Кирилл Верютин
разработчик хостинг-провайдера и регистратора доменов REG.RU
Наиболее классическое определение, к которому прибегают при необходимости объяснить что такое ООП, это — «способ моделирования реального мира». Можно предположить, что ООП делает код более простым и наглядным, однако такая формулировка слишком размыта и уклончива, она не открывает самой сути ООП.
ООП стоит на трёх китах:
- Инкапсуляция — способ спрятать сложную логику внутри класса, предоставив программисту лаконичный и понятный интерфейс для взаимодействия с сущностью.
- Наследование — способ легко и просто расширить существующий класс, дополнив его функциональностью.
- Полиморфизм — принцип «один интерфейс — множество реализаций». Например, метод print может вывести текст на экран, распечатать его на бумаге или вовсе записать в файл.
Если резюмировать: ООП даёт контроль над зависимостями в коде. Это способ сделать так, чтобы высокоуровневый код не зависел от низкоуровневой реализации. ООП позволяет вести разработку раздельно, поскольку взаимодействие между сущностями определено интерфейсами.
Павел Бондарович
технический директор в Creonit
Суть ООП заключается в том, чтобы представить программу в виде объектов, которые каким-то образом взаимодействуют друг с другом.
Все, что угодно, можно представить в виде объекта: человека, воздушный шарик, сообщение в мессенджере. У объекта могут быть свойства, например, цвет – красный, размер – большой. Также у объекта могут быть методы для совершения операций. Например, если объект телевизор, вызываем метод «включить», и телевизор включается.
Объект — это экземпляр какого-то класса. Класс — это шаблон, в котором описаны все свойства будущего объекта и его методы. При этом если класс воздушного шарика определяет свойство цвет, то сам класс никакого значения цвета не имеет. Но экземпляры этого класса, которых, к слову, можно создавать сколько угодно, уже будут раскрашены в любые цвета.
Классы могут выстраиваться в хитрые витиеватые структуры. Чем структура хитрее, тем программа гибче, легче поддается изменениям и внедрениям нового функционала, но не обязательно. Такие слова как наследование, полиморфизм, инкапсуляция позволяют создавать структуры объектов еще витиеватее, при этом избавляют код от дублирования и делают его интуитивно понятным, но не всегда.
Понимание только лишь принципа работы объектов не сделает человека ООП-гуру. Суть мастерства ООП в умении конструировать многоуровневые структуры из классов, при этом оставляя код читаемым, надежным и гибким. Чтобы это постичь, потребуется пройти долгий и изнурительный путь, но в конечном итоге ООП станет лучше.
Зураб Белый
руководитель практики Java центра разработки компании «Рексофт» в Воронеже
Часто статьи про ООП начинаются с кучи терминов, теории и сложных объяснений подходов и парадигм. В своем курсе программирования на Java для начинающих в Воронежском государственном университете я сначала объясняю на практике роль объектов, их связь и операции с ними, используя обычные слова, которые мы используем в повседневной жизни. Например, инкапсуляцию удобно объяснять с помощь магазина, где есть витрина, на которой все видно и красиво расставлено и есть склад, куда обычного покупателя не пускают.
Когда студенты начинают понимать и могут строить объектные модели, можно вводить первые термины, такие как: инкапсуляция, наследование и полиморфизм. Понимая работу ООП на практике, даже на совсем примитивном уровне, эти слова уже не кажутся такими страшными и непонятными. Дальше я ввожу больше теории и обязательно добавляю практические вещи, например, паттерны проектирования.
Проще говоря, преподавать ООП стоит от практики к теории. Очень много в этом процессе дают правильные примеры. В первое время они должны отражать окружающий нас мир и только потом трансформироваться в абстракции и переходить к языку программирования.
Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.