Ооп это что такое: ООП (объектно-ориентированное программирование): что это

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

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

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

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

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

  • Процедурное программирование работает с помощью пошаговых инструкций. Структурированное программирование немного сложнее, оно использует потоки управления, такие как операторы if/then/else и циклы while/for.

Однако на сегодняшний день объектно-ориентированное программирование оказывает наибольшее влияние в среде программирования. Объектно-ориентированное программирование появилось в конце 1960-х годов с появлением раннего языка программирования Simula. Спустя годы Smalltalk усовершенствовал парадигму объектно-ориентированного программирования. Сейчас Java, C и C# входят в число самых популярных объектно-ориентированных языков современности. И ООП — самая популярная парадигма разработки.

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

Например, автомобиль — это объект с различимыми качествами, такими как цвет и тип. Автомобиль может ездить. Демонстрация поведения автомобиля в программе, использующей процедурное или структурное программирование, несомненно, будет сложной задачей. С помощью объектно-ориентированного программирования вы можете сгенерировать класс автомобиля и кодировать особенности объекта внутри класса. Хотя детали этого предприятия более растянуты, вы можете назначать определяющие аспекты автомобиля и управлять его поведением с помощью простого вызова функции.

4 основных строительных блока ООП

Четыре фундаментальных строительных блока охватывают принцип работы объектно-ориентированного программирования: классы, атрибуты, методы и объекты.

1. Классы

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

2. Атрибуты

Атрибуты (или переменные) относятся к характеристикам объекта. Внешний вид, состояние и другие качественные признаки являются общими атрибутами объекта. Атрибуты класса в сочетании с экземплярами объекта отличают объекты друг от друга. Следующая программа демонстрирует объявление класса в Python:

Класс Автомобиль:
def init (я, цвет, тип):
self.color = цвет
self.type = тип

Здесь «я» представляет экземпляр класса для будущих ссылок на атрибуты и методы объекта. А «цвет» и «тип» представляют собой атрибуты класса.

3. Методы

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

В автомобиле метод вождения может быть уместен. Вы можете определить такой метод прямо под определениями атрибутов автомобиля.

Хотя с помощью кода можно отобразить реальный автомобиль и смоделировать приложение для вождения, программирование этого метода немного сложнее, чем строки кода ниже.

защитный диск (сам)
print(‘Я за рулем’ + self.color + self.type)

4. Объекты

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

автомобиль = Автомобиль(‘красный’, ‘Седан’)

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

Затем вы сможете увидеть, как метод привода работает в действии.

автомобиль.драйв()

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

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

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

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

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

3. Наследование
Когда в программе есть несколько классов со связанными свойствами, наследование может упростить ландшафт. В объектно-ориентированном программировании дочерние классы могут наследовать родительские классы и аналогичные функции. В качестве примера наследования рассмотрим, как класс Car может совместно использовать свойства с более крупной категорией, например с транспортными средствами.

«Автомобиль» в качестве родительского класса. «Автомобиль» и «Велосипед» — это дочерние классы, которые наследуют атрибуты родительского класса практически без усилий.

4. Полиморфизм
Полиморфизм — это состояние, при котором объект может принимать несколько форм. При этом полиморфизм может проявляться по-разному. Примеры полиморфизма включают:

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

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

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

Каковы преимущества объектно-ориентированного программирования?

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

  • Модульность

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

  • Возможность повторного использования

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

  • Возможность подключения

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

  • Простота

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

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

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

В то же время масштабируемость имеет первостепенное значение для любого бизнеса в сфере разработки программного обеспечения. А этого редко можно добиться без объектно-ориентированного программирования.

5 лучших объектно-ориентированных языков программирования
Языки объектно-ориентированного программирования предоставляют разработчикам синтаксис и внутренние меры для использования ООП по своему желанию. Вот самые популярные и высокопроизводительные объектно-ориентированные языки программирования.

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

2. Java
Как язык программирования, основанный на классах, Java спроектирован так, чтобы иметь мало зависимостей; таким образом, разработчики Java могут рассчитывать на непрерывное повторное использование. Java известен как официальный язык программирования для Android-разработки .

3. Руби
Ruby выделяется среди других объектно-ориентированных языков программирования тем, что его цель — воспринимать практически все, что написано на языке, как объект. Юкихиро «Мац» Мацумото, разработчик Ruby, создал язык, когда почувствовал, что альтернативные языки ООП, такие как Python, не были по-настоящему объектно-ориентированными. Ruby on Rails — популярный веб-фреймворк, основанный на языке Ruby.

4. С++
C++, или C с классами, — это объектно-ориентированное расширение C. C — это классический язык программирования, который до сих пор занимает высокие позиции в индексе TIOBE. Тем не менее, его расширение C++ работает исключительно хорошо при работе со встроенными системами, такими как смарт-часы и медицинские машины.

5. С#
C# — это язык .NET Framework, продукт Microsoft, который помогает разработчикам создавать приложения. Как и C++, C# также является языком промежуточного программного обеспечения, который может тесно взаимодействовать с аппаратным обеспечением. C# в основном используется для разработки игр в Unity .

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

Зачем нам ООП и что это такое / Хабр

Всем привет.

Неделя статей на хабре посвященная ООП. Последняя статья вызвала у меня кучу эмоций и, к сожалению, очень плохих эмоций. Мне очень не понравилась статья. Почему? Потому что в ней передаются какие-то отрицательные эмоции об использовании ООП. Эмоции вызваны лишь тем, что человек не до конца понимает всю силу ООП и хочет убедить всех в том что ООП зло. Самое печальное что люди начинают прислушиваться и кидаться ужасными доводами, не имеющими ничего общего с действительностью. Я думаю что студентам такие статьи противопоказаны больше чем GoF, которых я бы давал как можно раньше. 🙂

Начнем.


Что такое ООП. ООП — это и ОО программирование и проектирование. Одно без другого бессмысленно чуть более чем полностью. Создано ООП для проектирования/программирования программных продуктов. Не для моделирования процессов. Не для проектирования протоколов, а именно для программных продуктов, для их реализации. Для упрощения системы, которая будет реализовывать протокол или бизнес-процесс или что-то еще.

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

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

Как же эти инструменты работают? Да проще пареной репы, потому что это все основано на привычных нам вещах. Люблю простые примеры из жизни:

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

Есть печь (абстрактная печь). У нее есть поведение — включить, выключить, увеличить или уменьшить температуру, положить чего-то, достать чего-то и состояние — температура в печи, включена или выключена. Это отличный пример абстрактного объекта в котором соблюдены принципы инкапсуляции (при реализации я их обязательно буду соблюдать). И есть пекарь, конкретный такой пекарь Иван. Он умеет работать с абстрактной печью. Т.е. смотреть температуру, включать выключать и т.д. вы поняли. Сила наследования в том, что нам не придется переписывать нашего Ивана для каждой из печей, будь то электро или газовая печь. Я думаю всем ясно почему? Получается что инструмент применен правильно.

2. Полиморфизм. Печи ведь по-разному работают. Газовая потребляет газ, электро печь — электричество. Используя полиморфизм мы легко меняем поведение в наследниках абстрактной печи.

3. Инкапсуляция. Основная фишка инкапсуляции в том, что я не должен знать, что происходит внутри моей печи. Допустим, я вызываю не метод включить печь, а меняю ее свойство включена на значение true. Что произойдет в этот момент? Если принцип инкапсуляции не соблюден, то я буду вынужден печи сказать начинай потреблять горючее, т.к. я тебя включил. Т.е. пекарь знает, что печь потребляет горючее, знает, как печь работает. Или, например, мы не можем установить температуру печи ниже или выше определенного уровня. Если не соблюдать принцип инкапсуляции, то мы должны будем говорить печи проверь-ка текущую температуру, пойдет те такая? Т.е. пекарь опять слишком много знает о печи. Геттеры и сеттеры это средства языка, которые помогут нам легко реализовать отслеживание изменений состояния. Все. Если геттеры и сеттеры пустые, значит так надо на моем уровне абстракции. Геттеры и сеттеры — не могут мешать реализации инкапсуляции, криво реализовать инкапсуляцию может проектировщик/программист.

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

Еще стали добавлять абстракцию, как еще один столп ООП. Я думаю, что это скорее верно, но уж очень попахивает КЭПом.

Высказывания про типизацию меня тоже зацепили. Дело в том, что никаких проблем в том, с кем вы сейчас работаете из наследников нет. Если на текущем уровне абстракции вам важно именно использовать печь, то вам не важно какая она. Вы получаете печь? Вы решаете свои задачи? То то и оно… Почему вы считаете что это динамическая типизация мне не понятно. Вы хотели печь? Берите. Вам нужна электрическая? Ну извините, газовая вам уже не подойдет.

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

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

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

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

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

P.S. В комментах к прошлой статье я явно много перегибал палку при обращении к некоторым людям. Приношу свои извинения.

Определение

в кембриджском словаре английского языка

Переводы oops

на Китайский (Традиционный)

(表示驚訝或後悔)哎喲…

Подробнее

на китайском (упрощенном)

(表示惊讶或后悔)哎哟…

Увидеть больше

на испанском

ау, упс…

Подробнее

на португальском

opa!, puxa!, ops…

Увидеть больше

на других языках