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

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

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

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

Добавлен: 28.03.2023

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

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

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

Объявление класса на С++:

class Point

{
public:
Point(double rX, double rY);

double Get_X();

double Get_Y();

// Метод поворота с параметром «угол»

void Rotate(double rAngle);

protected:
double m_rX;

double m_rY;

};

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

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

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

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

предоставляющий удобный интерфейс, максимально скрывающий (инкапсулирующий) детали реализации;

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

Модульность является базовым принципом в программировании (не является особенностью ООП).

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

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

Рассмотрим модульность с разных точек зрения. Метод проектирования, который можно называть "модульным", должен удовлетворять пяти основным требованиям:

[x]. Декомпозиции (decomposability).

[x]. Композиции (composability).

[x]. Понятности (understandability).

[x]. Непрерывности (continuity).

[x]. Защищенности (protection).

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


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

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

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

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

Почти во всех языках программирования, в том или ином виде, поддерживаются специальные механизмы модулей или пакетов (Java, Python, Паскаль, С++20). Модуль представляет собой набор типов данных и функций, часть из которых экспортируется — доступна другим модулям.

2.4 Сохраняемость и Параллелизм

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

Параллелизм - организация жизни и взаимодействия объектов.

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

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

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

Уровень команд. Несколько команд выполняются параллельно, в процессоре размещаются сразу несколько конвейеров. Характерен для суперскалярных процессоров.

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


Понятие уровня параллелизма тесно связано с понятием гранулярности. Гранулярность — мера отношения объема вычислений, выполненных в параллельной задаче, к объему коммуникаций (для обмена сообщениями). Степень гранулярности варьируется от мелкозернистой до крупнозернистой. Закон Амдала ориентирован на крупнозернистый
параллелизм.

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

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

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

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

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

Если класс В обладает всеми свойствами класса А и еще имеет дополнительные свойства, то класс А называется базовым (предком, родительским классом), а класс В – подклассом (наследником, производным классом) класса А. Процесс построения иерархии классов очень напоминает процесс построения генеалогических деревьев в реальном мире.


Наследование свойств только одного базового класса называется одиночным (простым) наследованием, а параллельное наследование свойств сразу нескольких базовых классов называется множественным (кратным) наследованием. В С++ возможны оба варианта наследования классов, а в Java и C# – только одиночное наследование, для реализации множественного наследования там применяется другой механизм.

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

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

Применение правила ООП «наследуй и изменяй свойства классов» хорошо согласуется с поэтапным подходом к разработке и созданию больших программных систем. Пример иерархии классов: фигура -> точка -> круг ->цилиндр.

Объектно-ориентированное программирование предложило дополнительный вид отношений между модулями — наследование. Очень подробно этот механизм рассматривается Б. Мейером — он выделяет 12 видов наследования [5], однако, на практике чаще всего применяют наследование, реализующее отношения «является» (is-a, открытое наследование) … [6]. Мак-Колм рассматривает наследование как базовый шаблон проектирования, при этом имеет ввиду is-a-наследование [7].

Принцип подстановки (LSP) изначально сформулирован Барбарой Лисков и регламентирует правильное использование механизма наследования. Выделяются некоторый базовый тип и его подтип (класс-наследник). Согласно LSP, программы должны быть написаны таким образом, чтобы в любом месте вместо базового типа мог быть подставлен подтип. Это означает, что классы наследники должны реализовывать интерфейс согласованно с интерфейсом базового класса. [2]

При выборе отношений между своими классами можно руководствоваться следующим базовым правилом:

если один класс реализует свои функции за счет использования функций другого — применяйте отношение включения;


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

Нужно учитывать, что наследование обеспечивает лучшую инкапсуляцию (за счет секции protected), однако является более сильным видом отношения, т.к. такая зависимость устанавливается при компиляции и ее нельзя изменить, в то время как зависимость по включению одного класса может быть заменено на зависимость от другого (см. композиция и аргегация [8]).

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

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

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

К примеру, в операции "a + b" в зависимости от типов a и b знак операции «+» может обозначать операцию сложения целых, сложения вещественных, объединения множеств или сцепления строк (при желании можно считать, что их имя — знак "+").

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

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

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