Что такое объектно ориентированное программирование
Перейти к содержимому

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

  • автор:

Будь в курсе объектно-ориентированного программирования!

Будь в курсе объектно-ориентированного программирования! главное изображение

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

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

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

ООП — это модель компьютерного программирования, которая организует разработку программного обеспечения с помощью объектов и классов.

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

Данные объекта реализуются с помощью полей, а поведение реализуется с помощью методов.

Классы — это просто схемы объекта. Они определяют состояние и поведение, которые могут вызывать объекты.

Абстракция

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

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

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

То же самое и в ООП. Если вы создаете переменную Airplane и вызываете его функцию для prepareForTakeoff() , вы знаете лишь, что Airplane готовится к взлету. Однако в коде могут происходить и другие вещи, такие как тестирование крыльев и запуск диагностики двигателей.

Абстракция достигается за счет использования абстрактных классов и интерфейсов в Java.

Абстракция == скрытая реализации

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

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

Например, если у вас есть объект таблицы с открытыми полями, вы сможете установить поля в любое время. Вы можете подумать, что это не имеет значения, но что если вы где-нибудь случайно установите table.legs = null ? Это может сломать весь объект и приложение (поскольку это уже не таблица).

Однако, если вы инкапсулируете это поле в установщике setLegs(null) , вы можете добавить проверку, которая игнорирует установку «legs» в значение null, тем самым укрепляя приложение.

Инкапсуляция == сокрытие информации

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

Наследование позволяет одному классу получать данные и поведение от другого класса. Основным преимуществом этого является повторное использование, которое экономит время и усилия, делая код более читабельным.

Например, класс Student и класс Teacher могут быть дочерними элементами класса Person. Ученик и Учитель наследуют поля ( firstName , lastName , dateOfBirth ) и методы ( doWork() , goToSchool() ) класса Person.

Классы Student или Teacher теперь имеют доступ к данным и методам Person. Таким образом любые объекты, которые создают копии этих двух классов, также могут вызывать их (если они общедоступны).

В Java наследование достигается путем «расширения» родительского класса.

Полиморфизм

Честно говоря, звучит круче, чем есть на самом деле. Полиморфизм — это условие существования нескольких различных форм. В ООП полиморфизм позволяет данным или методам с одним и тем же именем означать разные вещи в разных контекстах. Но что это вообще значит?

Взгляните еще раз на пример наследования. Поскольку и Ученик, и Учитель наследуют функцию doWork() от класса Person, они оба могут вызывать ее. Мы также можем предложить им реализовать собственный способ «делать работу».

  • Учитель может оценивать работы.
  • Студент может учиться.

Это называется переопределением метода из родительского класса. Теперь всякий раз, когда создается объект «Учитель» и вызывается функция doWork() , Учитель будет «оценивать работы». И если объект Person и вызывает doWork() , он просто «читал книгу».

Другой случай, когда вы увидите полиморфизм в действии, — это перегрузка метода. Перегрузка достигается за счет изменения количества аргументов и/или изменения типа аргументов в методе.

Например, в классе House у вас могут быть следующие методы:

  • paint()
  • paint(String color)
  • paint(String color1, String color2)
  • paint(boolean usePrimer)

Вывод

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

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

Объектно-ориентированное программирование (ООП) — это способ упорядочения кода в программе за счет его группировки в объектах. Термин объект в этом случае обозначает отдельный элемент, содержащий данные (значения данных) и функции. Если выбран объектно-ориентированный подход к организации программы, выполняется группировка определенных частей информации с общим набором функций или действий, связанных с этой информацией. Например, можно сгруппировать данные о музыке, такие как название альбома, название дорожки или имя исполнителя, с такими функциями, как добавление дорожки в список воспроизведения или воспроизведение всех песен какого-либо исполнителя. Эти части объединяются в один элемент, называемый объектом (например, Album или MusicTrack). Объединение значений и функций обеспечивает ряд преимуществ. Одним ключевым преимуществом является то, что вместо нескольких переменных необходимо использовать одну переменную. Кроме того, связанные функции хранятся вместе. Наконец, объединение информации и функций позволяет создать структуру программы, которая более точно соответствует реальным условиям.

Эта работа лицензируется в соответствии с лицензией Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported

На посты, размещаемые в Twitter™ и Facebook, условия Creative Commons не распространяются.

Объектно-ориентированное программирование простым языком — объясняют эксперты

Спросили у экспертов, как простыми словами объяснить начинающему программисту, что такое ООП.

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

Когда применять функциональное программирование, а когда ООП — отвечают эксперты

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

Аватарка эксперта Андрей Когунь

Андрей Когунь
руководитель группы Java-разработчиков ИТ-компании КРОК

Самый простой способ объяснить и понять ООП — воспользоваться метафорой. Метафорой объекта в ООП является объект реального мира, например, человек. Объекты надо отличать между собой и у них есть что-то, что их определяет. Например, для человека это может быть имя, когда мы говорим про нашего знакомого Васю, и все понимают о ком речь. Люди неким образом похожи друг на друга. Подмножество людей, обладающих одинаковым набором свойств (имя, фамилия, возраст и т.д.) и общим поведением, будет называться класс. Возьмем для примера сотрудников нашей компании. Для каждого из нас определен департамент (я, например, в департаменте разработки ПО числюсь, ДРПО), должность, уровень зарплаты и т.д. Эти свойства обычно определяют в момент, когда в компанию приходит новый сотрудник. У человека можно запросить информацию по его навыкам или попросить помочь коллеге — это общее поведение для всех сотрудников.

Зарплату сотрудника знает он сам, его руководитель и бухгалтер, остальные — нет. Такое сокрытие данных называется инкапсуляция. Какие свойства и поведение будет доступно другим объектам обычно определяется на уровне класса. Руководитель отдела также является сотрудником, но он обладает рядом дополнительных свойств, например, у него есть подчиненные. Таким образом класс «руководитель», расширяет класс «сотрудник» или, другими словами, происходит наследование. При этом между классами устанавливается отношение «является» — то есть любой руководитель является сотрудником, но не наоборот — не каждый сотрудник является руководителем. Если у класса больше одного наследника, то образуется иерархия. Классы, которые являются родственниками в иерархии не связаны отношением «является», например, бухгалтер является сотрудником, но бухгалтер не является руководителем.

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

Так мы рассмотрели, как связаны объекты и классы, и такие понятия, как: инкапсуляция, наследование и полиморфизм. Все это — базовые понятия ООП.

Аватарка эксперта Игорь Кропотов

Игорь Кропотов
ведущий инженер-программист IT-компании DD Planet

Объектно-ориентированное программирование – это подход, при котором вся программа рассматривается как набор взаимодействующих друг с другом объектов. При этом нам важно знать их характеристики.

У каждого объекта в системе есть свойства и поведение, как и у любого реального объекта. Например, рассмотрим объект «машина». У него есть свойства (цвет, вес, стоимость) и поведение (машина может ехать, сигналить, потреблять топливо).

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

  1. Инкапсуляция – сокрытие поведения объекта внутри него. Объекту «водитель» не нужно знать, что происходит в объекте «машина», чтобы она ехала. Это ключевой принцип ООП.
  2. Наследование. Есть объекты «человек» и «водитель». У них есть явно что-то общее. Наследование позволяет выделить это общее в один объект (в данном случае более общим будет человек), а водителя — определить как человека, но с дополнительными свойствами и/или поведением. Например, у водителя есть водительские права, а у человека их может не быть.
  3. Полиморфизм – это переопределение поведения. Можно снова рассмотреть «человека» и «водителя», но теперь добавить «пешехода». Человек умеет как-то передвигаться, но как именно, зависит от того, водитель он или пешеход. То есть у пешехода и водителя схожее поведение, но реализованное по-разному: один перемещается ногами, другой – на машине.

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

Аватарка эксперта Глеб Лысов

Глеб Лысов

старший разработчик систем автоматизации и поддержки сервисов мониторинга и реагирования на киберугрозы в BI.ZONE

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

Обычно объект объединяет в себе данные и методы для работы с ними. Представим, что у нас есть тип «Позвоночное существо», у которого есть свойство «Класс». У каждого из Позвоночных существ это свойство равно одному из пяти значений: Рыба, Земноводное, Птица, Пресмыкающееся, Млекопитающее. Добавим метод получить_класс — он будет возвращать это значение. Далее объявим тип «Человек», который наследует типу «Позвоночное существо». Создадим несколько экземпляров: Иван Иванов, Марина Иванова, Антон Антонов. Добавим присущие только Человеку свойства: Имя и Фамилию. У каждого из них будет метод получить_имя/получить_фамилию, а также перешедший от Позвоночного существа метод получить_класс.

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

Основные задачи ООП — структурировать код, повысить его читабельность и ускорить понимание логики программы. Косвенно выполняются и другие задачи: например, повышается безопасность кода и сокращается его дублирование.

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

Главное, о чем не стоит забывать: ООП — это не единственная парадигма. У нее есть свои плюсы и минусы, для каких-то задач она подходит, для каких-то — нет. Например, ООП не даст особых преимуществ, если вы пишете «однострочники» и простые скрипты. Однако в больших проектах неразделенный на отдельные сущности код быстро превратится в «лапшу» и перестанет читаться, и ООП здесь сильно упростит работу.

Аватарка эксперта Кирилл Верютин

Кирилл Верютин
разработчик хостинг-провайдера и регистратора доменов REG.RU

Наиболее классическое определение, к которому прибегают при необходимости объяснить что такое ООП, это — «способ моделирования реального мира».‎ Можно предположить, что ООП делает код более простым и наглядным, однако такая формулировка слишком размыта и уклончива, она не открывает самой сути ООП.

ООП стоит на трёх китах:

  • Инкапсуляция — способ спрятать сложную логику внутри класса, предоставив программисту лаконичный и понятный интерфейс для взаимодействия с сущностью.
  • Наследование — способ легко и просто расширить существующий класс, дополнив его функциональностью.
  • Полиморфизм — принцип «один интерфейс — множество реализаций». Например, метод print может вывести текст на экран, распечатать его на бумаге или вовсе записать в файл.

Если резюмировать: ООП даёт контроль над зависимостями в коде. Это способ сделать так, чтобы высокоуровневый код не зависел от низкоуровневой реализации. ООП позволяет вести разработку раздельно, поскольку взаимодействие между сущностями определено интерфейсами.

Аватарка эксперта Павел Бондарович

Павел Бондарович
технический директор в Creonit

Суть ООП заключается в том, чтобы представить программу в виде объектов, которые каким-то образом взаимодействуют друг с другом.

Все, что угодно, можно представить в виде объекта: человека, воздушный шарик, сообщение в мессенджере. У объекта могут быть свойства, например, цвет – красный, размер – большой. Также у объекта могут быть методы для совершения операций. Например, если объект телевизор, вызываем метод «включить», и телевизор включается.

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

Классы могут выстраиваться в хитрые витиеватые структуры. Чем структура хитрее, тем программа гибче, легче поддается изменениям и внедрениям нового функционала, но не обязательно. Такие слова как наследование, полиморфизм, инкапсуляция позволяют создавать структуры объектов еще витиеватее, при этом избавляют код от дублирования и делают его интуитивно понятным, но не всегда.

Понимание только лишь принципа работы объектов не сделает человека ООП-гуру. Суть мастерства ООП в умении конструировать многоуровневые структуры из классов, при этом оставляя код читаемым, надежным и гибким. Чтобы это постичь, потребуется пройти долгий и изнурительный путь, но в конечном итоге ООП станет лучше.

Аватарка эксперта Зураб Белый

Зураб Белый
руководитель практики Java центра разработки компании «Рексофт» в Воронеже

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

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

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

Напоминаем, что вы можете задать свой вопрос экспертам, а мы соберём на него ответы, если он окажется интересным. Вопросы, которые уже задавались, можно найти в списке выпусков рубрики. Если вы хотите присоединиться к числу экспертов и прислать ответ от вашей компании или лично от вас, то пишите на experts@tproger.ru, мы расскажем, как это сделать.

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

Объектно-ориентированное программирование (ООП) — методология программирования, в которой программа представляет собой совокупность взаимодействующих объектов (классов), с образованием иерархии наследования [1] .

История

ООП возникло как развитие идей процедурного программирования, при котором данные и методы, их обрабатывающие, формально не связаны. Взгляд на программирование «под новым углом» предложили Алан Кэй и Дэн Ингаллс в языке Smalltalk. Здесь понятие класса стало основообразующей идеей для всех остальных конструкций. В настоящее время количество прикладных языков программирования (список языков), реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам [1] .

Основные понятия ООП

Основные понятия в ООП следующие [2] :

  • Инкапсуляция: объединение данных и методов в едином контейнер (классе), а также в некоторых языках сокрытие реализации: чтобы было достаточно указать «что делать», не указывая «как делать»;
  • Наследование: возможность создать новый класс на основе уже существующего, при этом наследуя функционал родительского класса, что позволяет избежать многократного дублирования одного и того же кода[3] ;
  • Полиморфизм: возможность использовать объекты независимо от их типа данных и внутреннего устройства. Различают ad-hocполиморфизм (ложный), и параметрический полиморфизм (истинный) [1] ;
  • Класс: универсальный тип данных, состоящий из полей (переменных более простых типов) и методов (функций) для работы с полями, то есть он представляет собой модель информационной сущности с интерфейсом для обработки своих внутренних данных;
  • Объект: сущность в адресном пространствеЭВМ, появляющаяся при создании экземпляра класса (например, при исполнении программы) [3] .

Примечания

  1. ↑ 1,01,11,2Бадд Т. Объектно-ориентированное программирование в действии. — СПб. , 1997. — 460 с.
  2. Буч Г., Максимчук Р., Энгл М. Объектно-ориентированный анализ и проектирование с примерами приложений. — 2010. — 720 с.
  3. ↑ 3,03,1Влиссидес Д., Джонсон Р., Хелм Р., Гамма Э.Приемы объектно-ориентированного проектирования(неопр.) . http://www.sugardas.lt/. Дата обращения: 2023.05.27.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *