Файл: Объектно-ориентированное программирование.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 116

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Основой объектно-ориентированного стиля программирования является объектная модель, построенная на следующих принципах:

  • абстрагирование;
  • инкапсуляция;
  • модульность;
  • иерархия.

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

  • типизация;
  • параллелизм;
  • сохраняемость [17].

2.1. Абстрагирование

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

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

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

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

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

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

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

  • сущности – объект является моделью некоторой определенной сущности из рассматриваемой предметной области;
  • поведения – объект представляет собой множество операций (действий) реальной сущности;
  • виртуальной машины – объект группирует операции, которые вместе используются более высоким уровнем управления, либо сами применяют некоторый набор операций низкого уровня;
  • прочие – объекты, состоящие из операций, никак не связанных между собой [19].

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

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

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

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

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

2.3. Модульность

Ранее уже говорилось, что использование модулей послужило развитию абстракций в области программирования.

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

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


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

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

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

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

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

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

2.4. Иерархия

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

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

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


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

  • структуры классов;
  • структуры объектов.

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

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

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

Если класс имеет несколько родительских классов, такое наследование называется множественным [13].

2.5. Типизация

Абстракция является основой создания понятия типа.

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

Важно отметить, что различные языки программирования по-разному определяют понятия «тип» и «класс», однако во всех языках эти понятия неразделимы.

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

Типизация представляется собой способ защиты от использования объектов одного класса вместо другого. Центральным местом типизации являются механизмы согласования и преобразования типов.

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


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

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

И в C++, и в Java имеются средства явного преобразования и проверки типов во время исполнения.

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

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

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

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

Монорфизм представляет собой противоположность полиморфизма. Данный принцип характерен для языков с сильной типизацией и статическим связыванием [18].

2.6. Параллелизм

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

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

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