Объектно-ориентированный подход. Объектно_ориентированный_подход. Объектно ориентированный подход Мэтт Вайсфельд 5е международное издание ббк 32. 973. 2018
Скачать 5.43 Mb.
|
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 должны быть уверены в том, что это программное обеспечение было протести- ровано, не говоря уже о том, что оно должно как следует выполнять заявленные функции. По-прежнему существует много таких людей, которые предпочитают создать свои собственные компоненты, нежели доверять тем, что были созданы другими. Типы композиции В целом существует два типа композиции — ассоциация и агрегация. В обоих случаях отношения представляют собой взаимодействия между объектами. В примере со стереосистемой, который только что использовался для объясне- ния одного из основных преимуществ композиции, была продемонстрирована ассоциация. ЯВЛЯЕТСЯ ЛИ КОМПОЗИЦИЯ ФОРМОЙ АССОЦИАЦИИ? ______________________________ Композиция.—.это.еще.одна.область.в.объектно-ориентированных.технологиях,.где. имеет.место.вопрос.«что.было.раньше.—.курица.или.яйцо?».В.одних.учебниках.го- ворится,.что.композиция.является.формой.ассоциации,.а.в.других.—.что.ассоциация. является.формой.композиции..Так.или.иначе,.в.этой.книге.мы.считаем.наследование. и.композицию.двумя.основными.способами.создания.классов..Таким.образом,.в.этой. книге.ассоциация.считается.формой.композиции. Все формы композиции включают отношение «содержит как часть». Однако между ассоциациями и агрегациями имеются тонкие различия, которые зависят от того, как вы представляете себе части целого. В случае с агрегациями вы обычно видите только целое, а в случае с ассоциациями — части, которые об- разуют целое. Агрегации Пожалуй, наиболее интуитивно понятной формой композиции является агре- гация. Она означает, что сложный объект состоит из других объектов. Теле- визор представляет собой ясный и точный пример устройства, которое вы используете для развлечения. Глядя на свой телевизор, вы видите один теле- визор. Большую часть времени вы не думаете о том, что в состав телевизора входят микрочипы, экран, тюнер и т. д. Естественно, вы видите переключатель для включения/выключения телевизора и, конечно же, экран. Однако люди обычно не так представляют себе телевизоры. Когда вы приходите в магазин бытовой техники, продавец не говорит: «Позвольте показать вам эту агрегацию микрочипов, экрана, тюнера и т. д.» Он говорит: «Позвольте показать вам этот телевизор». 195 Типы.композиции. . Аналогичным образом, когда вы отправляетесь покупать автомобиль, вы не планируете выбирать все его отдельные компоненты. Вы не собираетесь решать, какие свечи зажигания или дверные ручки купить. Вы идете покупать автомо- биль. Разумеется, вы все же выберете некоторые его функции, но по большей части будете выбирать автомобиль как целое, сложный объект, состоящий из множества других сложных и простых объектов (рис. 9.4). Рис. 9.4. Иерархия.агрегаций.для.Car Ассоциации В то время как агрегации представляют отношения, при которых вы обычно видите целое, ассоциации представляют как целое, так и части. Как уже отме- чалось в примере со стереосистемой, разные компоненты располагаются по отдельности и подключаются к целому соединительными шнурами (которые связывают разные компоненты). Глава.9..Создание.объектов.и.объектно-ориентированное.проектирование 196 В качестве примера взгляните на компьютерную систему (рис. 9.5). Как вы по- нимаете, компьютерная система — это целое. Компонентами являются монитор, клавиатура, мышь и системный блок компьютера. Каждый из них — это отдель- ный объект, однако все вместе они образуют целую компьютерную систему. Системный блок использует клавиатуру, мышь и монитор, чтобы поручить им некоторую часть работы. Другими словами, системный блок компьютера нуж- дается в услугах мыши и при этом не способен предоставить такую услугу сам. Поэтому он запрашивает соответствующую услугу у отдельной мыши через определенный порт и кабель, соединяющий мышь с этим системным блоком компьютера. АГРЕГАЦИЯ В ПРОТИВОПОСТАВЛЕНИИ С АССОЦИАЦИЕЙ ____________________________ Агрегация.—.это.сложный.объект,.состоящий.из.других.объектов..Ассоциация. .используется,.когда.одному.объекту.нужно,.чтобы.другой.объект.оказал.ему.ус- лугу. Рис. 9.5. Ассоциации.как.отдельная.услуга Использование ассоциаций в сочетании с агрегациями Во всех этих примерах вы, возможно, заметили одну вещь: разделительная ли- ния между тем, что такое ассоциация, и тем, что такое агрегация, часто оказы- вается размытой. Достаточно сказать, что многие из ваших наиболее интересных проектных решений будут сводиться к выбору того, использовать ассоциации или же агрегации. Например, образец компьютерной системы, приводившийся ранее для описания ассоциаций, также включает агрегацию. Несмотря на то что взаимодействие между системным блоком компьютера, монитором, клавиатурой и мышью яв- ляется ассоциацией, системный блок компьютера как таковой представляет собой агрегацию. Вы видите только системный блок компьютера, но на самом деле это сложная система, состоящая из других объектов, включая чипы, мате- ринскую плату, видеокарту и т. д. 197 Избегание.зависимостей. . Допустим, объект Employee состоит из объектов Address и Spouse . Вы, возможно, посчитаете, что объект Address является агрегацией (по сути, частью объекта Employee ), а объект Spouse — ассоциацией. В целях пояснения предположим, что оба — Employee и Spouse — представляют работников. Если соответствующий работник будет уволен, то Spouse все равно останется в системе, однако произой- дет нарушение ассоциации. Аналогичным образом, в примере со стереосистемой у ресивера имеется ассо- циация со звуковыми колонками, а также с CD-плеером. Кроме того, звуковые колонки и CD-плеер сами по себе являются агрегациями других объектов, как, например, силовые кабели. Хотя в примере с автомобилем двигатель, свечи зажигания и двери представ- ляют композицию, стереосистема также представляет отношение ассоциации. ОДНОГО ПРАВИЛЬНОГО ОТВЕТА НЕТ _________________________________________________ Как.и.обычно,.нет.какого-то.одного.абсолютно.правильного.ответа,.когда.дело.ка- сается.принятия.проектного.решения..Проектирование.не.является.точной.наукой.. Хотя.мы.можем.устанавливать.общие.правила,.чтобы.жить.по.ним,.они.не.являются. жесткими. Избегание зависимостей При использовании композиции желательно не делать объекты сильно завися- щими друг от друга. Один из способов сделать объекты сильно зависящими друг от друга заключается в смешении доменов. Объект в одном домене не должен смешиваться с объектом в другом домене за исключением определенных ситу- аций. Вернемся к примеру со стереосистемой, чтобы разобраться в этой концеп- ции. Если ресивер и CD-плеер будут «располагаться» в отдельных доменах, то сте- реосистему будет легче поддерживать в работоспособном состоянии. Например, если сломается такой компонент, как CD-плеер, то вы сможете отправить его в ремонт отдельно. В данном случае CD-плеер и MP3-плеер «обладают» от- дельными доменами. Это обеспечивает гибкость, например возможность купить CD- и MP3-плеер от разных производителей. Таким образом, если вы решите заменить CD-плеер устройством от другого производителя, то сможете это сделать. Иногда смешение доменов несет в себе определенное удобство. Хороший пример этого: существование комбинаций «телевизор/видеомагнитофон» и «телевизор/ DVD-плеер». Стоит согласиться, что сочетание обоих устройств в одном моду- ле очень удобно. Но если вдруг телевизор выйдет из строя, то плеер уже не получится использовать, поскольку в этом случае он является частью одного и того же устройства. Глава.9..Создание.объектов.и.объектно-ориентированное.проектирование 198 Вам необходимо решить, что важнее при определенных обстоятельствах: удоб- ство или стабильность. Одного правильного ответа не существует. Все зависит от приложения и среды. В случае с комбинацией «телевизор/видеомагнитофон» мы решили, что удобство интегрированного блока значительно перевешивало риск его более низкой стабильности (рис. 9.6). Вспомните стереосистему на рис. 9.3, чтобы закрепить представление о том, что такое неинтегрированная система. Рис. 9.6. Удобство.в.противопоставлении.со.стабильностью СМЕШЕНИЕ ДОМЕНОВ _______________________________________________________________ Важно.понять,.обеспечит.ли.смешение.доменов.удобство..Если.преимущества.об- ладания.комбинацией.«телевизор/видеомагнитофон».перевешивают.риск.и.потен- циальное.время.простоя.отдельных.компонентов,.то.смешение.доменов.может. оказаться.предпочтительным.выбором.при.проектировании. Кардинальность В книге «Объектно-ориентированное проектирование на Java» Гилберт и Мак- карти описывают кардинальность как количество объектов, участвующих в ас- социации, с указанием того, является это участие обязательным или необяза- тельным. Чтобы определить кардинальность, Гилберт и Маккарти ставят следующие вопросы. Какие именно объекты будут взаимодействовать с какими именно другими объектами? Сколько объектов будет принимать участие при каждом взаимодействии? Взаимодействие будет обязательным или необязательным? 199 Кардинальность. . К примеру, взглянем на следующий образец. Мы создадим класс Employee , ко- торый будет наследовать от Person и иметь отношения с приведенными далее классами: Division ; JobDescription ; Spouse ; Child Что эти классы делают? Являются ли они необязательными? Сколько их тре- буется Employee ? Division y Этот объект содержит информацию, касающуюся отдела, в котором тру- дится работник. y Каждый работник должен трудиться в отделе, поэтому отношение явля- ется обязательным. y Работник трудится в одном и только одном отделе. JobDescription y Этот объект содержит сведения о служебных обязанностях, в том числе, скорее всего, такую информацию, как шкала заработной платы и диапазон уровня заработной платы. y У каждого работника должны иметься служебные обязанности, поэтому отношение является обязательным. y Работник может занимать разные должности в течение срока пребывания в компании. Таким образом, у работника может иметься большое коли- чество должностных обязанностей. Сведения о них могут быть сохранены как история, если произойдет смена должности работника, либо может получиться так, работник одновременно занимает две разные должности. Например, начальник отдела может принять на себя обязанности работ- ника, если тот уволится, а человек ему на замену еще не будет нанят. Spouse y В этом упрощенном примере класс Spouse содержит только дату годов- щины. y Работник может состоять или не состоять в браке. Таким образом, Spouse является необязательным. y У работника может быть только один супруг. Глава.9..Создание.объектов.и.объектно-ориентированное.проектирование 200 Child y В этом упрощенном примере класс Child содержит только строку FavoriteToy y У работника могут иметься или не иметься дети. y У работника может не быть детей либо иметься несметное количество детей (ого!). Вы могли бы принять проектное решение относительно верхнего предела количества детей, с которым сможет справиться си- стема. Чтобы можно было подытожить все это, в табл. 9.1 представлена кардинальность ассоциаций классов, которые мы только что рассмотрели. |