Понятие объектно-ориентированного программирования и объектной декомпозиции
Объектно-ориентированное программирование — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования.
Основной принцип объектно-ориентированного программирования — представление программы как совокупности объектов.
Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.
В основе объектно-ориентированного программирования лежит объектно-ориентированная декомпозиция. Разработка объектно-ориентированных программ заключается в построении иерархии классов, описывающих отношения между объектами, и в определении классов. Вычисления в объектно ориентированной программе задаются сообщениями, передаваемыми от одного объекта к другому.
Концепция объектно-ориентированного программирования складывается из ключевых понятий: абстракция данных, инкапсуляция, наследование и полиморфизм.
Техника декомпозиции — разбиение на составляющие элементы. Известны две схемы декомпозиции: алгоритмическая декомпозиция и объектно-ориентированная декомпозиция.
В основе алгоритмической декомпозиции лежит разбиение по действиям — алгоритмам. Эта схема представления применяется в обычных ПС.
Объектно-ориентированная декомпозиция обеспечивает разбиение по автономным лицам — объектам реального (или виртуального) мира. Эти лица (объекты) — более «крупные» элементы, каждый из них несет в себе и описания действий, и описания данных.
Преимущества объектно-ориентированного программирования
Основные преимущества ООП проявляются только в том случае, когда в языке программирования реализован полиморфизм подтипов — возможность единообразно обрабатывать объекты с различной реализацией при условии наличия общего интерфейса.
Принципиальное преимущество объектно-ориентированного проектирования в том, что природа объектов приводит к созданию слабо сцепленных систем. Фундаментальное свойство объектно-ориентированного проектирования заключается в скрытости содержания объекта. Как правило, содержание объекта невидимо внешним элементам. Степень автономности объекта достаточно высока. Любой объект может быть замещен другим объектом с таким же интерфейсом.
Основными преимуществами парадигмы разработчики считают следующие особенности:
- Модульность: инкапсуляция объектов в себе упрощает разработку, уменьшает количество ошибок и ускоряет разработку при участии большого количества программистов, так как каждый может работать независимо друг от друга.
- Реюзабельность кода: благодаря абстракциям, полиморфизму и наследованиям можно не писать один и тот же код много раз, что заметно ускоряет создание нового ПО.
- Высокая скорость разработки: классы и интерфейсы в ООП могут легко трансформироваться в подобие полноценных библиотек, которые можно переиспользовать в новых проектах.
- Расширяемость: ООП-код легче развивать, дополнять и менять. Этому способствует независимая модульная структура.
- Простота восприятия: использование ООП упрощает понимание кода за счет взаимодействия с объектами, а не логикой. Не нужно углубляться в то, как построено ПО, чтобы модифицировать его.
- Безопасность: инкапсулированный код недоступен извне, поэтому «поломать» ООП-программу сложнее.
- Гибкость: полиморфизм позволяет быстро адаптировать ООП-код под свои нужды, не описывая новые функции и объекты.
Статический и динамический аспект представления объектно-ориентированной программы
Статические модели обеспечивают представление структуры систем в терминах базовых строительных блоков и отношений между ними. «Статичность» этих моделей состоит в том, что здесь не показывается динамика изменений системы во времени. Вместе с тем следует понимать, что эти модели несут в себе не только структурные описания, но и описания операций, реализующих заданное поведение системы. Основным средством для представления статических моделей являются диаграммы классов. Вершины диаграмм классов нагружены классами, а дуги (ребра) - отношениями между ними.
Динамические модели обеспечивают представление поведения систем. «Динамизм» этих моделей состоит в том, что в них отражается изменение состояний в процессе работы системы (в зависимости от времени). Средства языка UML для создания динамических моделей многочисленны и разнообразны. Эти средства ориентированы не только на собственно программные системы, но и на отображение требований заказчика к поведению таких систем.
Класс, объект, поля, свойства, методы
Класс
Класс — описание множества объектов, которые разделяют одинаковые свойства, операции, отношения и семантику (смысл). Любой объект — просто экземпляр класса.
Объекты-переменные одного типа образуют класс. То есть класс — это тип объектов. Объекты в этом случае называются также экземплярами класса. Связанные с классом процедуры и функции обычно называют методами, точнее методами экземпляра или функциями-членами. Расширение типов — наследование. Рассматриваются классы-предки (суперклассы) и классы-потомки (субклассы, производные классы).
Класс — универсальный, комплексный тип данных, состоящий из тематически единого набора «полей» (переменных более элементарных типов) и «методов» (функций для работы с этими полями), то есть он является моделью информационной сущности с внутренним и внешним интерфейсами для оперирования своим содержимым (значениями полей). В частности, в классах широко используются специальные блоки из одного или чаще двух спаренных методов, отвечающих за элементарные операции с определённым полем (интерфейс присваивания и считывания значения, геттер-сеттер), которые имитируют непосредственный доступ к полю. Эти блоки называются «свойствами» и почти совпадают по конкретному имени со своим полем (например, имя поля может начинаться со строчной, а имя свойства — с заглавной буквы).
Объект
Объект - сущность в адресном пространстве вычислительной системы, один или несколько однотипных элементов данных, объединенных в одно целое. Объект данных называется элементарным, если представляющее его значение является единым целым. В противном случае, если объект данных представляет собой совокупность некоторых других объектов, который можно называть структурным.
Имя (идентификатор) — это строка символов, используемая для обозначения некоторой сущности в программе. Такими сущностями могут быть переменные, типы, метки, подпрограммы, формальные параметры и другие конструкции языков программирования. В общем случае идентификаторы не имеют какого-либо смысла, а используются только в качестве имен программных объектов или их атрибутов.
Константа — это объект данных, имя которого связано со значением (значениями) в течение всего времени жизни. В языках программирования используются константы двух видов:
- литералы;
- именованные константы.
Литерал представляет собой буквальную запись значения константы. Например, 25 — это десятичная форма записи целочисленной константы,
представляющей собой объект данных со значением 25. Форма записи значений литералов предопределенного типа задается в языке. Именованная константа (константа, определяемая программистом) — это объект данных, который связывает имя с буквальным значением константы. Значения именованных констант известны во время компиляции, поэтому компилятор будет обнаруживать все ошибки, связанные с попыткой присвоения именованной константе нового значения.
Переменная — это объект данных, который явным образом определен и именован в программе. Простая переменная — это именованный элементарный объект данных. Переменные можно характеризовать с помощью следующих атрибутов:
- имя;
- адрес;
- значение;
- тип;
- время жизни;
- область видимости.
Поля
Поле класса или атрибут (переменная-член, data member, class field, instance variable) в объектно-ориентированном программировании — переменная, описание которой создает программист при создании класса. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. Обычно тип данных каждого поля задаётся в описании класса.
Свойства
Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.
Методы
Основными методами (понятиями) объектно-ориентированного программирования являются механизмы абстракции, инкапсуляции, наследования и полиморфизма.
Инкапсуляция
Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Одни языки (например, C++, Java или Ruby) отождествляют инкапсуляцию с сокрытием, но другие (Smalltalk, Eiffel, OCaml) различают эти понятия. Инкапсуляция позволяет изменять реализацию класса без плохо контролируемых последствий для программы в целом.
Абстракция
Абстракция данных позволяет инкапсулировать множество объектов данных (члены класса) и набор абстрактных операций над этими объектами данных (методы класса), ограничивая доступ к данным только через определенные абстрактные операции.
Инкапсуляция и абстракция — взаимодополняющие понятия: абстракция выделяет внешнее поведение объекта, а инкапсуляция содержит и скрывает реализацию, которая обеспечивает это поведение. Инкапсуляция достигается с помощью информационной закрытости. Обычно скрываются структура объектов и реализация их методов. Инкапсуляция является процессом разделения элементов абстракции на секции с различной видимостью. Инкапсуляция служит для отделения интерфейса абстракции от ее реализации.
Наследование
Наследование — это свойство классов создавать из базовых классов производные, которые наследуют свойства базовых классов и могут содержать
новые элементы данных и методы. Наследование позволяет создавать иерархии классов и является эффективным средством внесения изменений и
дополнений в программы
Полиморфизм
Полиморфизм означает возможность одной операции или имени функции ссылаться на любое количество определений функций, зависящих от типа данных параметров и результатов. Это свойство объектно-ориентированных языков программирования обеспечивается динамическим связыванием сообщений (вызовов методов) с определениями методов.
Средства построения объектной модели
Иерархическая организация задает размещение абстракций на различных уровнях описания системы.
Двумя важными инструментами иерархической организации в объектно-ориентированных системах являются:
- структура из классов («is a»-иерархия);
- структура из объектов («part of»-иерархия).
Чаще всего «is а»-иерархическая структура строится с помощью наследования. Наследование определяет отношение между классами, где класс разделяет структуру или поведение, определенные в одном другом (единичное наследование) или в нескольких других (множественное наследование) классах.
- Опалева Э. А., Самойленко В. П. Языки программирования и методы трансляции. — СПб.: БХВ-Петербург, 2005. — 480 с.
- Технологии разработки программного обеспечения: Учебник/ С. Орлов. — СПб.: Питер, 2002. — 464 с.
- Свердлов С. 3. Языки программирования и методы трансляции: Учебное пособие. — СПб.: Питер, 2007. — 638 с.
- Что такое объектно-ориентированное программирование. - Текст: электронный / База Знаний Timeweb Community : [сайт]. - URL: https://timeweb.com/ru/community/articles/obektno-orientirovannoe-programmirovanie (дата обращения 15.05.2022).