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

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

Что такое ООП

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

  • свойства (размер, цвет, форма и пр.);
  • поведение (то, что они могут делать: мыслить, ехать, открывать).

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

Изучая основы ООП, каждый новичок должен разобраться с основными понятиями:

  • объекты;
  • классы;
  • методы;
  • поля;
  • свойства.

Объекты парадигмы ООП – это те самые отдельные блоки, где хранится и преобразуется информация. Каждый из них – экземпляр какого-то класса.

Класс ООП – это описание устройства объекта, «чертеж», который определяет его состояние, поведение, свойства и пр. 

Методы – это набор действий объекта (его поведение), который также определяется классом и служит для взаимодействия между объектами.

Поле – переменная, которую описывает программист при создании класса (характеристика объекта). Все данные объекта хранятся в полях.

Свойства – это средства доступа к полям (set и get). Таким образом, программа в ООП – это совокупность взаимодействующих между собой объектов, которые вызывают методы друг друга (обмениваются «сообщениями»). Любая функция ПО представляет собой метод для объекта какого-то класса.

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

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

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

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

Главные принципы ООП

Выделяют 4 принципа ООП, которые важно запомнить еще на начальных этапах изучения:
  • абстракция ООП (Abstraction);
  • инкапсуляция ООП (Encapsulation);
  • наследование ООП (Polymorphism);
  • полиморфизм ООП (Inheritance).
Во многих источниках (особенно, старых) упоминается лишь 3 принципа ООП: инкапсуляция, наследование и полиморфизм. Абстракция – ООП характеристика, которая официально не вносилась в основные принципы ООП. По этой причине ее часто не признают представители старой школы. Но во всех современных материалах абстракция – неотъемлемая часть парадигмы ООП. Рассмотрим каждый принцип ООП более детально.

Абстракция ООП

Принцип ООП абстракция (или его еще называют абстрагирование) означает выделение самых значимых характеристик объекта. Важно это сделать правильно, для того чтобы решалась конкретная задача по предмету. Рассмотрим абстракцию ООП на таком примере. Допустим, мы создаем картотеку сотрудников компании. Нам необходимо сделать класс ООП Employee и прописать характеристики объектов, которые будут его экземплярами. Что здесь важно: ФИО, дата рождения, название должности, отдел, контактный телефон. Нам не важны такие параметры как цвет глаз, рост, вес и прочее. Поэтому от них мы абстрагируемся. Но при создании, например, картотеки модельного агентства фокус сместится как раз на эти характеристики. Таким образом, применяя ООП абстракцию, мы здесь отбросим другую незначительную информацию, но оставим параметры внешности.

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

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

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

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

Объясним наследование ООП для чайников на простом примере. На заводе по выпуску автомобилей необходимо модернизировать модельный ряд и добавить туда новые функции. У нас есть предыдущие модели, которые мы берем за основу (разрабатывать с нуля нет смысла). Всё самое удачное мы наследуем от прежних автомобилей, дополняя и меняя что-то по необходимости. Точно также и в программе. Зачем писать полностью новый код, если можно взять его часть, основу, из предыдущих разработок? Это и есть наследование.

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

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

Полиморфизм ООП

Перечисляя ООП принципы, стоит уделить пристальное внимание четвертому пункту – ООП полиморфизм. Это возможность объекта реагировать на одно и то же действие специфическим способом, в зависимости от класса, к которому он принадлежит. Объясним полиморфизм ООП простыми словами. У нас есть обычное авто и электромобиль. Запуск двигателя, то есть метод, прописанный в классе, будет один и тот же, но его реализация (принцип работы) на двигателе внутреннего сгорания и электродвигателе – совершенно разная.

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

ООП языки

Изучая основы ООП, вы в любом случае столкнетесь с понятием «объектно-ориентированный язык» (ОО язык). Это язык программирования, который построенный на принципах ООП. Все самые популярные языки – объектно ориентированные. Вот далеко не весь список: C#, C++ , Cyclone, D, Delphi, Groovy, Io, Java, JavaScript, JScript .NET, Objective-C, Perl, PHP, Python, Ruby, Scala, Lua, Swift. Это вовсе не означает, что указанные языки поддерживают только ООП принципы. Большинство из них – универсальны. Давайте рассмотрим эту парадигму, а также реализацию принципов ООП в PHP, Java, JavaScript, C++, C и Python, то есть в самых популярных языках программирования. 

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

ООП PHP

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

В качестве примера попробуем сделать таблицу сотрудников с их контактными данными. Для начала создадим класс ООП на PHP. На сервере в отдельной папке создаем файл. Назовем его, к примеру, index. Там же необходимо создать папку для класса – classes, где сделаем первый файл для PHP ООП класса (Employee). Его нужно подключить в том самом индексном файле командой require_once для дальнейшего использования. 

Далее создаем сам класс: class Employee. Ставим фигурные скобки, в которых описываем тело класса: свойства (name, age, phone number) и методы. Для того чтобы инкапсулировать эти данные, определим эти свойства как private

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

Далее попробуем создать PHP ООП объект.

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

$obj1 = new Employee('Ivan', 'Petrov', 30); 

Таким же образом создаются остальные объекты.

Принцип наследования можно рассмотреть на таком примере. Наш класс Employee будет унаследован от родительского класса Person. Для этого применим оператора extends. При необходимости добавим туда новые свойства (например, должность):

class Employee extends Person

Примечание. В PHP возможно наследование только от одного класса.

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

ООП Java

В практике Java ООП используются такие популярные IDE (Integrated Development Environment) как NetBeans, BlueJ, IntelliJ IDEA и др. В нашем примере будет использоваться NetBeans. Для начала создадим новый проект и присвоим ему имя (допустим, OOPJava). После подтверждения мы увидим в левой части экрана отображение структуры проекта. Там уже будет автоматически создан первый класс под названием Main, а в нем – метод public static void. Там Java будет выполнять весь исходный код. 

Чтобы создать новый класс, нужно нажать на имя пакета правой кнопкой и выбрать New – Java Class. Даем ему имя (тот же Employee) и прописываем параметры в фигурных скобках. Новый объект в этом классе создается по аналогии с предыдущим примером, через директиву new. Как и в PHP, принципы ООП Java реализуются таким же способом.

ООП С++

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

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

  • public – данные будет видны везде (даже вне класса);
  • protected – данные будут видны в классе и его наследниках;
  • private – данные будут видны только в классе, все преобразования нужно делать через методы (set, get).

При разработке в ООП C++ компилятор не будет показывать поля объекта без указания модификатора доступа класса. То есть по умолчанию в среде разработки на этом языке класс объявляется как private.

Еще одна особенность: модификатор в C++ ООП устанавливается на область, а не конкретно на каждое поле и метод. Например:

class Employee

{

public:

String firstName;

String lastName;

int age

};

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

private:

int IDnumber

};

то эта информация доступна уже не будет.

ООП JS

Когда речь заходит про ООП в JS, то сразу стоит упомянуть о том, что применительно к JavaScript объектно-ориентированное программирование имеет некоторые особенности. Например, кроме упомянутого выше способа с new для создания нового объекта здесь также можно использовать фигурные скобки (именно такой вариант считается более распространенным): Employee = {};

Также есть два синтаксиса добавления свойств в объект (через точку и квадратные скобки):

Emoloyee.name = "Tom"; 
Employee["name"] = "Tom";

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

ООП Python

Язык программирования Python поддерживает различные парадигмы, но в его основе лежит объектно-ориентированное программирование. По этой причине работать с ООП в Python очень просто. Пример кода при создании класса ООП Python со свойствами:

class Employee:

name 

age

phone number

Чтобы добавить методы, в Python ООП используем def:

def ИмяМетода(self, …):

# код метода 

Теперь создадим объект ООП в Python: 

obj1 = Employee()

obj2 = Employee()

Узнать тип созданных объектов в Python ООП можно при помощи метода type, передав ему названия этих объектов: 

print(type(obj1))

На что в ответ получим:

<class '__main__.Employee'>

Какова же ситуация с модификаторами доступа в Python ООП? Для их обозначения общепринятым считается использование символа подчеркивания:

  • protected – «_» перед элементом данных этого класса;
  • private – «__» перед членом данных этого класса (двойной символ подчеркивания).

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

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

Среди литературы по ООП книги, которые можно рекомендовать:

    1. Паттерны объектно-ориентированного проектирования. Ральф Джонсон, Эрих Гамма, Ричард Хелм, Джон Влиссидес.
    2. Объектно-ориентированное программирование на PHP. Максим Кузнецов, Игорь Симдянов.
    3. Объектно-ориентированное программирование в С++. Роберт Лафоре.
    4. Computer Science. Роберт Седжвик, Кевин Уэйн (Java).
    5. Предметно-ориентированные языки программирования. Мартин Фаулер (Java и C#).

Ну а теперь, когда настало время подводить итоги, давайте кратко рассмотрим, есть ли недостатки ООП. Пожалуй, как и в любой методологии (инструменте) они есть:

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

Несмотря на это плюсов у объектно-ориентированного программирования немало:

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

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

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

Например, глобально телефон можно описать как объект, состоящий из трубки, внутри которой наушники и динамик. Его главная задача (метод) – совершать и принимать вызовы. Если вы опишите объект именно так, то собеседник сразу поймет, о чем речь. Остальные характеристики вторичны. Это и есть абстракция.

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

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

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

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

Класс ООП – это «чертеж» для создания объектов. Класс содержит набор параметров реального объекта. Он задает его характеристики (поля) и поведение (методы) по шаблону.

Например, нам нужно создать класс «Автомобиль». Его поля будут: тип, марка, год выпуска, цвет, объем двигателя и пр. Методы: ехать, останавливаться, заправляться и т.д. Тело класса (параметры) всегда описывается внутри фигурных скобок.

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

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

  • тип – легковой;
  • марка – Skoda Octavia;
  • год выпуска – 2017;
  • цвет – серый; 
  • объем двигателя – 1,6.

Получается, что, класс – это абстракция, а объект – конкретная сущность, свойства которой уникальны и отличают ее от остальных объектов.

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

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

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

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

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

Вот так, взаимодействуя между собой, существует наш мир. Подобно ему работает и программа, созданная в ООП.

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

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

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

Общий класс, который задает базовые характеристики объектов, называется родителем (базовым, суперклассом). Классы, созданные на его основе – потомки, наследники, дочерние. Например, создадим класс-родитель Автомобиль. В нем будут дочерние классы: грузовой, легковой, гоночный, автобус. Базовое устройство для каждого потомка прописывать не нужно, оно унаследовано от родителей. Зато здесь можно добавить свои специфические поля. Для грузовика это будет грузоподъемность, для автобуса – количество мест, и т.д.

 Благодаря наследованию код пишется быстрее, занимает меньше места и воспринимается легче.

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

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

Например, составляя картотеку сотрудников, нужно будет сделать класс «Employee», где прописать такие свойства: ФИО, дата рождения, ИНН, должность. А при создании объектов в этом классе поля будут расписываться по каждому сотруднику индивидуально в нужной последовательности (Иванов Петр Алексеевич, 17.02.1998, 3046133899, системный администратор).  

error: Контент защищен.