Объектно – ориентированное проектирование программных средств



Анализ сложной системы требует ее декомпозиции — разбиения на составляющие элементы.

Известны две схемы декомпозиции:

· алгоритмическая;

· объектно-ориентированная.

Алгоритмическая декомпозиция применяется в обычных ПС. В основе лежит разбиение по действиям — алгоритмам.

Объектно-ориентированная обеспечивает разбиение по автономным лицам — объектам реального (или виртуального) мира.

Лица (объекты) содержат в себе описания действий и описания данных.

Объектно-ориентированное представление ПС основывается на принципах:

· абстракции (упрощает представление физического объекта);

· инкапсуляции (закрывает детали внутреннего представления абстракций);

· модульности (обеспечивает группировку логически связанных абстракций);

· иерархической организации.

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

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

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

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

Инкапсуляция и абстракция— взаимодополняющие понятия:

· абстракция выделяет внешнее поведение объекта;

· инкапсуляция содержит и скрывает реализацию, которая обеспечивает это поведение.

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

Модульность. В объектно-ориентированных языках (C++, Object Pascal, Ada 95) абстракции классов и объектов формируют логическую структуру системы.

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

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

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

Инструменты иерархической организации:

· структура из классов ("is а"-иерархия);

· структура из объектов ("part оf"-иерархия).

"is а" — иерархическая структура строится с помощью наследования. Наследование определяет отношение между классами, где класс разделяет структуру или поведение, определенные в другом или в нескольких других классах.

"part of" — базируется на отношении агрегации.

Агрегация применяется в сочетании с наследованием:

· агрегация обеспечивает физическую группировку логически связанной структуры;

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

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

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

Объекты — конкретные сущности, которые существуют во времени и пространстве.

Общая характеристика объектов

Объект — это конкретное представление абстракции.

Объект обладает:

· индивидуальностью;

· состоянием;

· поведением.

Структура и поведение подобных объектов определены в их общем классе.

Рис. 1. Характеристики объекта - стула

Термины "экземпляр класса" и "объект" взаимозаменяемы.

Индивидуальность — это характеристика объекта, которая отличает его от всех других объектов.

Состояние объекта характеризуется перечнем всех свойств объекта и текущими значениями каждого из этих свойств.

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

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

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

Виды операций клиента над объектом:

1. модификатор (изменяет состояние объекта);

2. cелектор (дает доступ к состоянию, но не изменяет его);

3. итератор (доступ к содержанию объекта по частям, в строго определенном порядке);

4. конструктор (создает объект и инициализирует его состояние);

5. деструктор (разрушает объект и освобождает занимаемую им память).

  Табл. 1.

 

Вид операции Пример операции
Модификатор пополнеть (кг)
Селектор какойВес():integer
Итератор показатьАссортиментТоваров():string
Конструктор создатьРобот(параметры)
Деструктор уничтожитьРобот()

 

В объектно-ориентированных языках программирования операции объявляются как методы — элементы классов, экземплярами которых являются объекты. Гибридные языки (C++, Ada 95) позволяют писать операции как свободные подпрограммы (вне классов). Методы и свободные подпрограммы, ассоциированные с конкретным объектом, образуют его протокол. Таким образом, протокол определяет оболочку допустимого поведения объекта и заключает в себе цельное (статическое и динамическое) представление объекта.

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

Рис. 2. Протокол объектов

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

По аналогии с автоматами выделяют:

1. активные объекты (самостоятельное поведение);

2. пассивные объекты (поведение по заказу).

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

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

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

Виды отношений между объектами:

1. Связь;

2. Агрегация.

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

Связь обозначает соединение, с помощью которого:

· объект-клиент вызывает операции объекта-поставщика;

· один объект перемещает данные к другому объекту.

Объект может играть одну из трех ролей:

1. актер — объект, который может воздействовать на другие объекты, но никогда не подвержен воздействию других объектов;

2. сервер — объект, который никогда не воздействует на другие объекты, он только используется другими объектами;

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

Рис. 3. Роли

Для того чтобы объект А мог послать сообщение в объект В, надо, чтобы В был виден для А.

Формы видимости между объектами:

1. Объект-поставщик (сервер) глобален для клиента.

2. Объект-поставщик (сервер) является параметром операции клиента.

3. Объект-поставщик (сервер) является частью объекта-клиента.

4. Объект-поставщик (сервер) является локально объявленным объектом в операции клиента.

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

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

Рис. 4. Перемещение от целого (агрегата) к его частям (свойствам).

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

Рис. 5. Агрегация по ссылке

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

· связи обеспечивают низкое сцепление между объектами;

· агрегация инкапсулирует части как секреты целого.

Класс — это абстракция существенных характеристик объекта. Любой объект - экземпляр класса.

 

Общая характеристика классов

Класс — описание множества объектов, которые разделяют одинаковые свойства, операции, отношения и семантику (смысл).

Рис. 6. Класс

Различают внутреннее представление класса (реализацию) и внешнее представление класса (интерфейс).

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

Интерфейс состоит из:

· объявлений всех операций, применимых к экземплярам класса;

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

Интерфейс разделен на 3 части:

1. публичную (public), объявления которой доступны всем клиентам;

2. защищенную (protected), объявления которой доступны только самому классу, его подклассам и друзьям;

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

Другом класса называют класс, который имеет доступ ко всем частям этого класса (публичной, защищенной и приватной). То есть, от друга у класса нет секретов.

 

Виды отношений между классами

Классы, как и объекты, существуют во взаимосвязи и формируют структуры из классов системы с помощью отношений:

· ассоциация (фиксирует структурные отношения — связи между экземплярами классов);

· зависимость (отображает влияние одного класса на другой класс);

· обобщение-специализация ("is а"-отношение);

· целое-часть ("part оf"-отношение).

Большинство объектно-ориентированных языков программирования поддерживает следующие отношения:

1. ассоциацию;

2. наследование;

3. агрегацию;

4. зависимость;

5. конкретизацию;

6. метакласс;

7. реализацию;

8. полиморфизм.

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

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

Ассоциация обозначает семантическое соединение классов.

Пример: в системе обслуживания читателей имеются две ключевые абстракции — Книга и Библиотека.

Класс Книга играет роль элемента, хранимого в библиотеке.

Класс Библиотека играет роль хранилища для книг.

Рис. 7. Пример

Ассоциация предполагает двухсторонние отношения:

· для данного экземпляра Книги выделяется экземпляр Библиотеки, обеспечивающий ее хранение;

· для данного экземпляра Библиотеки выделяются все хранимые Книги.

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

Мощность ассоциации бывает одного из трех типов:

1. один-к-одному;

2. один-ко-многим;

3. многие-ко-многим.

Рис. 8. Типы мощности

Наследование — это отношение, при котором один класс разделяет структуру и поведение, определенные в одном другом (простое наследование) или во многих других (множественное наследование) классах.

Между n классами наследование определяет иерархию "является" ("is а"), при которой подкласс наследует от одного или нескольких более общих суперклассов. Говорят, что подкласс является специализацией его суперкласса (за счет дополнения или переопределения существующей структуры или поведения).

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

Агрегация. Отношения агрегации между классами аналогичны отношениям агрегации между объектами.

Пример агрегации по ссылке и по величине (композиции) (рис. 9):

класс-агрегат Дом и класс-агрегат Окно, причем указаны роли и множественность частей агрегата.

Рис. 9. Пример

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

Рис. 10. Зависимость

Конкретизация - процесс наполнения шаблона (родового или параметризованного класса).

Цель - получение класса, от которого возможно создание экземпляров.

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

Рис. 11. Конкретизация


Дата добавления: 2021-03-18; просмотров: 156; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!