Файл: Объектно ориентированный подход Мэтт Вайсфельд 5е международное издание ббк 32. 973. 2018.pdf

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

Категория: Не указан

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

Добавлен: 03.02.2024

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

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

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

Глава.8..Фреймворки.и.повторное.использование
188
}
// покупка товара shop.buyInventory(Inventory[1]);
}
}
Таким образом, мы можем использовать один и тот же программный код как для
PizzaShop
, так и для
DonutShop
. Если мы добавим приложение
GroceryShop
, то нам потребуется лишь обеспечить реализацию и соответствующую строку в основном приложении. Изменять программный код не понадобится.
Резюме
При проектировании классов и объектных моделей жизненно важно понимать, как объекты связаны друг с другом. В этой главе мы рассмотрели основные во- просы создания объектов — наследование, интерфейсы и композицию. Из нее вы узнали, как создавать пригодный для повторного использования код путем проектирования с применением контрактов.
В главе 9 мы завершим наше объектно-ориентированное «путешествие» и ис- следуем, как объекты, которые могут быть абсолютно несвязанными, способны взаимодействовать друг с другом.
Ссылки
‰
Гради Буч, Роберт А. Максимчук, Майкл У. Энгл, Бобби Дж. Янг, Джим
Коналлен и Келли А. Хьюстон, «Объектно-ориентированный анализ и про- ектирование с примерами приложений» (Object-Oriented Analysis and Design with Applications). — 3-е изд. — Бостон, штат Массачусетс: Addison-Wesley,
2007.
‰
Петер Коуд и Марк Мейфилд, «Проектирование на Java» (Java Design). —
Аппер Сэддл Ривер, штат Нью-Джерси: Prentice-Hall, 1997.
‰
Скотт Майерс, «Эффективное использование C++» (Effective C++). —
3-е изд. — Бостон, штат Массачусетс: Addison-Wesley Professional, 2005.

Глава 9
СОЗДАНИЕ ОБЪЕКТОВ
И ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ
ПРОЕКТИРОВАНИЕ
В двух предыдущих главах мы рассмотрели темы наследования и композиции.
Из главы 7 вы узнали, что наследование и композиция — это основные способы создания объектов. А из главы 8 вам стало известно, что существуют разные степени наследования, а также то, как наследование, интерфейсы, абстрактные классы и композиция сочетаются друг с другом.
В этой главе рассматривается, как объекты связаны друг с другом в общей конструкции. Вы могли бы сказать, что эта тема уже была разобрана ранее, и оказались бы правы. И наследование, и композиция — способы взаимодей- ствия объектов. Однако между ними есть одно существенное различие в пла- не подхода к созданию объектов. При использовании наследования конечным результатом, по крайней мере концептуально, является класс, который вклю- чает все поведения и атрибуты иерархии наследования. А при использовании композиции для создания нового класса применяется один или несколько классов.
Хотя наследование представляет собой отношение между двумя классами, на самом деле при использовании этого механизма создается родительский класс, который включает атрибуты и методы дочернего класса. Снова обратимся к при- меру классов
Person и
Employee
(рис. 9.1).
Несмотря на то что в данном случае действительно имеется два отдельно спро- ектированных класса, отношение между ними нельзя назвать просто взаимо- действием — это отношение наследования. По сути,
Employee представляет собой
Person
. Объекту
Employee не нужно отправлять сообщение объекту
Person
Объект
Employee не нуждается в услугах
Person
, ведь объект
Employee
— это объект
Person
Однако в случае с композицией дело обстоит иначе. Композиция — это взаимо- действие между разными объектами. Таким образом, в то время как в главе 8


Глава.9..Создание.объектов.и.объектно-ориентированное.проектирование
1   ...   17   18   19   20   21   22   23   24   25

190
были рассмотрены преимущественно разные типы наследования, в этой главе мы углубимся в различные типы композиции и разберем, как объекты взаимо- действуют друг с другом.
Рис. 9.1. Отношение.наследования
Отношения композиции
Мы уже видели ранее: композиция означает, что тот или иной элемент являет- ся частью некого целого. Отношение наследования выражается как отношение
является экземпляром, а композиция — как отношение содержит как часть. Мы интуитивно знаем, что автомобиль содержит как часть руль (рис. 9.2).
Композицию следует использовать потому, что она позволяет создавать систе- мы путем объединения менее сложных частей. Это распространенный среди людей подход к рассмотрению проблем. Исследования показывают, что даже наиболее способные из нас могут одновременно удержать в кратковременной памяти максимум семь порций данных. Поэтому нам нравится использовать

191
Поэтапное.создание. .
абстрактные концепции. Мы не говорим, что у нас есть большое устройство с рулем, четырьмя покрышками, двигателем и т. д., мы говорим, что у нас есть автомобиль. Так нам легче изъясняться и сохранять ясность.
Рис. 9.2. Отношение.композиции
Композиция также помогает и другим образом, например, в том, чтобы сделать части взаимозаменяемыми. Если бы все рули были одинаковыми, то не имело бы значения, какой конкретно руль устанавливается в конкретном автомобиле.
В сфере разработки программного обеспечения взаимозаменяемые части под- разумевают повторное использование.
В главах 7 и 8 своей книги «Объектно-ориентированное проектирование на
Java» Стивен Гилберт и Билл Маккарти приводят большое количество под- робных примеров ассоциаций и композиции. Я настоятельно рекомендую вам обратиться к этому материалу для более глубокого взгляда на соответствую- щие вопросы. А здесь мы рассмотрим некоторые существенные особенности этих концепций и исследуем несколько вариаций их примеров.
Поэтапное создание
Еще одно основное преимущество использования композиции состоит в том, что системы и подсистемы можно создавать независимо и, пожалуй, что более важно, тестировать и сопровождать независимо.
Нет сомнения, что программные системы довольно сложны. Чтобы создать качественное программное обеспечение, вы должны придерживаться одного важнейшего правила, которое позволит вам добиться успеха: все нужно делать максимально простым. Чтобы большие программные системы работали долж- ным образом и были легки в сопровождении, их следует разделить на менее крупные, более управляемые части. Как это сделать? В 1962 году, в статье под названием «Архитектура сложности» (The Architecture of Complexity) лауреат
Нобелевской премии Герберт Саймон (Herbert Simon) изложил следующие мысли относительно стабильных систем.


Глава.9..Создание.объектов.и.объектно-ориентированное.проектирование
192
‰
«Стабильные сложные системы обычно представлены в форме иерархии,
где любая система состоит из более простых подсистем, каждая из которых
тоже состоит из более простых подсистем» — вам, возможно, уже знаком этот принцип, поскольку он лежит в основе функциональной декомпози- ции — метода, стоящего за процедурной разработкой программного обеспе- чения. При объектно-ориентированном проектировании аналогичные прин- ципы распространяются и на композицию — создание сложных объектов из более простых частей.
‰
«Стабильные сложные системы почти не поддаются декомпозиции» — это означает, что вы можете идентифицировать части, образующие систему, и отличить взаимодействия между частями и внутри частей. В стабильных системах меньше связей между их частями, чем внутри их частей. Таким образом, модульная стереосистема с простыми связями между звуковыми колонками, плеером и усилителем по своей природе более стабильна, чем интегрированная система, декомпозиция которой не является легкой.
‰
«Стабильные сложные системы почти всегда состоят из подсистем лишь
нескольких разных типов, упорядоченных в разных комбинациях» — эти подсистемы, в свою очередь, обычно состоят из частей лишь нескольких разных типов.
‰
«Стабильные сложные системы почти всегда развиваются из простых
рабочих систем» — вместо того чтобы создавать новую систему «с нуля», то есть изобретать велосипед, в качестве ее основы следует использовать проверенные конструкции, которые ей предшествуют.
Допустим, в нашем примере стереосистема (рис. 9.3) является полностью ин- тегрированной и не разделенной на образующие ее компоненты (то есть пред- ставляет собой систему в виде одного большого черного ящика). Что бы было, если бы CD-плеер сломался и стал непригодным к использованию? Вам при- шлось бы нести в ремонт всю систему целиком. Это оказалось бы сложнее и до- роже, кроме того, вы не смогли бы пользоваться другими компонентами.
Эта концепция становится очень важной для языков программирования вроде
Java и других, включенных во фреймворк .NET. Поскольку объекты загружа- ются динамически, разделение конструкции является очень важным. Например, если вы распределите Java-приложение и при этом понадобится воссоздать один из файлов классов (для устранения ошибок или сопровождения), то вам при- дется перераспределить только этот конкретный файл класса. Если бы весь код располагался в одном файле, то потребовалось бы перераспределять все при- ложение целиком.
Допустим, система разделена на компоненты, а не является единым блоком.
Если при этом сломается CD-плеер, то вы сможете отсоединить его и отнести в ремонт (заметьте, что все компоненты связаны соединительными шнурами).
Это будет легче и дешевле, а также займет меньше времени, чем если бы вам


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

Глава.9..Создание.объектов.и.объектно-ориентированное.проектирование
194
должны быть уверены в том, что это программное обеспечение было протести- ровано, не говоря уже о том, что оно должно как следует выполнять заявленные функции. По-прежнему существует много таких людей, которые предпочитают создать свои собственные компоненты, нежели доверять тем, что были созданы другими.
Типы композиции
В целом существует два типа композиции — ассоциация и агрегация. В обоих случаях отношения представляют собой взаимодействия между объектами.
В примере со стереосистемой, который только что использовался для объясне- ния одного из основных преимуществ композиции, была продемонстрирована ассоциация.
ЯВЛЯЕТСЯ ЛИ КОМПОЗИЦИЯ ФОРМОЙ АССОЦИАЦИИ? ______________________________
Композиция.—.это.еще.одна.область.в.объектно-ориентированных.технологиях,.где.
имеет.место.вопрос.«что.было.раньше.—.курица.или.яйцо?».В.одних.учебниках.го- ворится,.что.композиция.является.формой.ассоциации,.а.в.других.—.что.ассоциация.
является.формой.композиции..Так.или.иначе,.в.этой.книге.мы.считаем.наследование.
и.композицию.двумя.основными.способами.создания.классов..Таким.образом,.в.этой.
книге.ассоциация.считается.формой.композиции.
Все формы композиции включают отношение «содержит как часть». Однако между ассоциациями и агрегациями имеются тонкие различия, которые зависят от того, как вы представляете себе части целого. В случае с агрегациями вы обычно видите только целое, а в случае с ассоциациями — части, которые об- разуют целое.
Агрегации
Пожалуй, наиболее интуитивно понятной формой композиции является агре- гация. Она означает, что сложный объект состоит из других объектов. Теле- визор представляет собой ясный и точный пример устройства, которое вы используете для развлечения. Глядя на свой телевизор, вы видите один теле- визор. Большую часть времени вы не думаете о том, что в состав телевизора входят микрочипы, экран, тюнер и т. д. Естественно, вы видите переключатель для включения/выключения телевизора и, конечно же, экран. Однако люди обычно не так представляют себе телевизоры. Когда вы приходите в магазин бытовой техники, продавец не говорит: «Позвольте показать вам эту агрегацию микрочипов, экрана, тюнера и т. д.» Он говорит: «Позвольте показать вам этот телевизор».