Баннер мобильный (3) Пройти тест

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

Глоссарий

27 декабря 2024

Поделиться

Скопировано

Содержание

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

    Что такое ООП

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

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

    ООП спагетти-код
    Пример «спагетти-кода»

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

    Зачем нужно ООП

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

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

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

    Структура ООП

    Объекты и классы

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

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

    Понять, что такое ООП, поможет аналогия.

    • Понятие «программист» — это класс.
    • Конкретный разработчик по имени Иван — это объект, принадлежащий к классу «программист» (экземпляр класса).
    • Зарплата, рабочие обязанности, изученные технологии и должность в компании — это свойства, которые есть у всех объектов класса «программист», в том числе у Ивана. У разных объектов свойства различаются: зарплата и обязанности Ивана будут отличаться от таковых у другого разработчика Миши.

    Атрибуты и методы

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

    Атрибуты — это переменные, конкретные характеристики объекта, такие как цвет поля или имя пользователя.

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

    Объект, класс, атрибуты и методы в ООП
    Объект, класс, атрибуты и методы в ООП на примере

    Принципы ООП

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

    Абстракция

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

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

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

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

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

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

    Внутреннее устройство одного объекта закрыто от других: извне «видны» только значения атрибутов и результаты выполнения методов.

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

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

    Упомянутый программист Иван — это человек. Но «человек» — более общее определение, которое не описывает свойства, важные именно для программиста. Можно сказать, что класс «программист» унаследован от класса «человек»: программист тоже является человеком, но у него есть дополнительные свойства.

    В таком случае разработчик Иван будет и человеком, и программистом одновременно. У него будут наборы свойств от обоих классов.

    У одного «родителя» может быть несколько дочерних структур. Например, от «человека» можно наследовать не только «программиста», но и «директора».

    Одиночное и множественное наследие в ООП
    Одиночное и множественное наследие

    Наследование позволяет реализовывать сложные схемы с четкой иерархией «от общего к частному». Это облегчает понимание и масштабирование кода. Не нужно много раз переписывать в разных объектах одни и те же свойства. Достаточно унаследовать эти объекты от одного «родителя», и «родительские» свойства применятся автоматически.

    Полиморфизм

    Одинаковые методы разных объектов могут выполнять задачи разными способами. Например, у «человека» есть метод «работать». У «программиста» реализация этого метода будет означать написание кода, а у «директора» — рассмотрение управленческих вопросов. Но глобально и то, и другое будет работой.

    Тут важны единый подход и договоренности между специалистами. Если метод называется delete, то он должен что-то удалять. Как именно — зависит от объекта, но заниматься такой метод должен именно удалением. Более того: если оговорено, что «удаляющий» метод называется delete, то не нужно для какого-то объекта называть его remove или иначе. Это вносит путаницу в код.

    Преимущества ООП

    Модульность

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

    Гибкость

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

    Экономия времени

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

    Безопасность

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

    Недостатки ООП

    Сложный старт

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

    Снижение производительности

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

    Большой размер программы

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

    Популярные языки объектно-ориентированного программирования

    ООП в Python

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

    • Приватные атрибуты начинаются с _ или __.
    • Для доступа используются геттеры и сеттеры.

    Пример кода:

    class BankAccount:
        def __init__(self, balance):
            self.__balance = balance  # Приватный атрибут
    
        def deposit(self, amount):
            self.__balance += amount
    
        def get_balance(self):
            return self.__balance
    
    # Доступ через методы
    account = BankAccount(100)
    account.deposit(50)
    print(account.get_balance())  # 150
    

    Однако при использовании ООП в Python есть свои ограничения и недостатки:

    1. Скорость выполнения: Python медленнее некоторых языков, таких как C++ или Java, что может быть важным в больших ООП-приложениях.
    2. Множественное наследование: Хотя Python поддерживает множественное наследование, оно может привести к сложности при неправильном использовании.
    3. Нет строгой типизации: Это делает код гибким, но иногда приводит к ошибкам из-за неправильного использования объектов.

    ООП в Java

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

    Преимущества ООП в Java

    • Модульность: Легко разделить код на модули.
    • Повторное использование кода: Использование наследования и полиморфизма.
    • Упрощённое тестирование и поддержка: Хорошо структурированный код легче отлаживать.
    • Надёжность: Строгая типизация и проверки времени компиляции снижают количество ошибок.

    Пример ООП в Java (наследование):

    class Animal {
        void speak() {
            System.out.println("This animal speaks");
        }
    }
    
    class Dog extends Animal {
        @Override
        void speak() {
            System.out.println("Woof!");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Dog dog = new Dog();
            dog.speak(); // Woof!
        }
    }
    

    ООП в C++

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

    Преимущества ОПП на C++:

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

    Ограничения

    • Сложность кода и управления памятью.
    • Потенциальные ошибки при множественном наследовании.
    • Отсутствие встроенной сборки мусора.

    Пример реализации полиморфизма ООП на C++:

    #include <iostream>
    using namespace std;
    
    class Shape {
    public:
        virtual void draw() { // Виртуальная функция
            cout << "Drawing a shape" << endl;
        }
    };
    
    class Circle : public Shape {
    public:
        void draw() override {
            cout << "Drawing a circle" << endl;
        }
    };
    
    int main() {
        Shape* shape = new Circle();
        shape->draw(); // Drawing a circle
        delete shape;
        return 0;
    }
    

    Практическое применение ООП

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

    Разработка игр

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

    Пример: 3D-игра на Unity или Unreal Engine. В игре Fortnite, созданной на Unreal Engine, игровые персонажи, оружие и окружающая среда реализованы как объекты.

    Языки: C#, C++.

    Как используется ООП:

    • Классы: Игрок, враг, предметы, оружие.
    • Наследование: Вражеские персонажи наследуются от общего класса Enemy.
    • Полиморфизм: Разные враги переопределяют метод атаки.
    • Инкапсуляция: У каждого объекта свои скрытые данные, например, здоровье или боезапас.

    CRM-системы (системы управления клиентами)

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

    Пример: Salesforce или самописная CRM

    Языки: Java, Python, C#.

    Как используется ООП:

    • Классы: Клиент, заказ, сотрудник.
    • Наследование: Пользователь системы (User) может быть администратором или менеджером, каждый с разными правами.
    • Инкапсуляция: Личная информация клиента (телефон, адрес) защищена.

    Веб-приложения

    ООП активно используется для создания модульных веб-приложений с использованием MVC (Model-View-Controller) архитектуры.

    Пример: Интернет-магазин

    Языки: PHP, JavaScript, Python (Django), Ruby (Rails).

    Как используется ООП:

    • Классы: Продукт, пользователь, заказ.
    • Наследование: Класс Product может иметь подтипы: ElectronicClothing.
    • Инкапсуляция: Вся бизнес-логика скрыта внутри методов.

    Разработка приложений для IoT (Интернет вещей)

    ООП помогает управлять устройствами, датчиками и их взаимодействиями.

    Пример: cистема умного дома Philips Hue

    Языки: C++, Java, Python.

    Как используется ООП:

    • Классы: Устройства (свет, кондиционер), датчики (температуры, движения).
    • Полиморфизм: Разные устройства обрабатывают команду «включить» по-своему.
    • Инкапсуляция: Состояние устройства скрыто от внешнего вмешательства.

    Сравнение ООП и функционального программирования

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

    Сходства ООП и ФП

    Модульность и абстракция

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

    Поддержка современных языков

    • Современные языки программирования (например, Python, Scala, Kotlin) поддерживают как ООП, так и ФП, что делает их подходы взаимодополняющими.

    Обеспечение повторного использования кода

    • В ООП — через наследование, интерфейсы и шаблоны проектирования.
    • В ФП — через чистые функции и композицию.

    Фокус на решении сложных задач

    • Обе парадигмы подходят для создания сложных, масштабируемых приложений.

    Высокий уровень абстракции

    • ООП абстрагирует данные и их поведение.
    • ФП абстрагирует вычисления и процессы через функции.

    Различия ООП и ФП

    Аспект
    ООП
    ФП
    Основная сущность
    Объект (состояние + поведение).
    Функция (чистое преобразование данных).
    Подход к данным
    Данные инкапсулированы в объектах.
    Данные неизменяемы (иммутабельность).
    Подход к состоянию
    Состояние объектов изменяется во времени.
    Отсутствие изменяемого состояния.
    Ключевые концепции
    Классы, объекты, наследование, полиморфизм.
    Чистые функции, композиция, каррирование.
    Управление побочными эффектами
    Побочные эффекты допустимы и используются.
    Избегаются (чистые функции).
    Стиль кода
    Императивный (пошаговые инструкции).
    Декларативный (что делать, а не как).
    Подход к многопоточности
    Многопоточность сложнее из-за изменяемого состояния.
    Легче из-за иммутабельности.
    <strong>Пример языков</strong>
    Java, C++, Python, C#.
    Haskell, Scala, Lisp, Python (частично).

    Полезные ресурсы и книги по ООП

    Книги

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

    Бертран Мейер. «Объектно-ориентированное проектирование: модели и принципы». Углубленное объяснение проектирования объектов. Особое внимание уделяется наследованию, принципам контрактного программирования и качественной архитектуре.

    Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес. «Банда четырех: Приемы объектно-ориентированного проектирования. Паттерны проектирования». Книга о паттернах проектирования, которая стала стандартом для всех программистов. Рассматривает основные шаблоны проектирования, такие как Singleton, Factory, Observer, Decorator и другие.

    Видео

    Поделиться

    Скопировано

    0 комментариев

    Комментарии