Лекционные материалы (1158642), страница 4
Текст из файла (страница 4)
Диаграммы пакетов21можно считать основным средством управления общей структуройсистемы.Пакеты являются жизненно необходимым средством для большихпроектов. Их следует использовать в тех случаях, когда диаграммаклассов, охватывающая всю систему в целом и размещеннаяна единственном листе бумаги формата А4, становится нечитаемой.1.5.4. АтрибутыАтрибут – это элемент информации, связанный с классом.
Например,у класса Company (компания) могут быть атрибуты Name (Название),Address (Адрес) и NumberOfEmployees (Число служащих).Так как атрибуты содержатся внутри класса, они скрыты от другихклассов. В связи с этим может понадобиться указать, какие классы имеютправо читать и изменять атрибуты. Это свойство называется видимостьюатрибута (attribute visibility).У атрибута можно определить четыре возможных значения этогопараметра.
Рассмотрим каждый из них в контексте примера (рис. 1.8).Пусть у нас имеется класс Employee с атрибутом Address и класс Company:– Public (общий, открытый). Это значение видимости предполагает,что атрибут будет виден всеми остальными классами. Любой классможет просмотреть или изменить значение атрибута. В таком случаекласс Company может изменить значение атрибута Address классаEmployee. В соответствии с нотацией UML общему атрибутупредшествует знак « + ».– Private (закрытый, секретный). Соответствующий атрибутне виден никаким другим классом.
Класс Employee будет знатьзначение атрибута Address и сможет изменять его, но класс Companyне сможет его ни увидеть, ни редактировать. Если это понадобится,он должен попросить класс Employee просмотреть или изменитьзначение этого атрибута, что обычно делается с помощью общихопераций. Закрытый атрибут обозначается знаком « – »в соответствии с нотацией UML.– Protected (защищенный). Такой атрибут доступен только самомуклассу и его потомкам.
Допустим, что у нас имеется два различных22типа сотрудников – с почасовой оплатой и на окладе. Таким образом,мы получаем два других класса HourlyEmp и SalariedEmp,являющихся потомками класса Employee. Защищенный атрибутAddress можно просмотреть или изменить из классов Employee,HourlyEmp и SalariedEmp, но не из класса Company. Нотация UMLдля защищенного атрибута – это знак « # ».– Package or Implementation (пакетный). Предполагает, что данныйатрибут является общим, но только в пределах его пакета. Допустим,что атрибут Address имеет пакетную видимость. В таком случае онможет быть изменен из класса Company, только если этот класснаходится в том же пакете.
Этот тип видимости не обозначаетсяникаким специальным значком.Employee-Employee ID : Integer = 0#SSN : String#Salary : float+Address : String+City : String+State : String+Zip Code : long+Departament : String+Hire()+Fire()+Promote()+Demote()+Transfer()Рис. 1.8. Видимость атрибутовВ общем случае, атрибуты рекомендуется делать закрытыми илизащищенными. Это позволяет лучше контролировать сам атрибут и код.С помощью закрытости или защищенности удается избежать ситуации,когда значение атрибута изменяется всеми классами системы. Вместоэтого логика изменения атрибута будет заключена в том же классе,что и сам этот атрибут. Задаваемые параметры видимости повлияютна генерируемый код.231.5.5.
ОперацииОперации реализуют связанное с классом поведение. Операциявключает три части – имя, параметры и тип возвращаемого значения.Параметры – это аргументы, получаемые операцией «на входе». Типвозвращаемого значения относится к результату действия операции.На диаграмме классов можно показывать как имена операций, так иимена операций вместе с их параметрами и типом возвращаемогозначения. Чтобы уменьшить загруженность диаграммы, полезно бываетна некоторых из них показывать только имена операций, а на других ихполную сигнатуру.В языке UML операции имеют следующую нотацию:Имя Операции (аргумент1 : тип данных аргумента1, аргумент2 :тип данных аргумента2, ...) : тип возвращаемого значенияСледует рассмотреть четыре различных типа операций.Операции реализацииОперации реализации (implementor operations) реализуют некоторыебизнес-функции.
Такие операции можно найти, исследуя диаграммывзаимодействия. Диаграммы этого типа фокусируются на бизнесфункциях, и каждое сообщение диаграммы, скорее всего, можно соотнестис операцией реализации.Каждая операция реализации должна быть легко прослеживаемадо соответствующего требования. Это достигается на различных этапахмоделирования. Операция выводится из сообщения на диаграммевзаимодействия, сообщения исходят из подробного описания потокасобытий, который создается на основе варианта использования,а последний – на основе требований. Возможность проследить всю этуцепочку позволяет гарантировать, что каждое требование будетреализовано в коде, а каждый фрагмент кода реализует какое-тотребование.Операции управленияОперации управления (manager operations) управляют созданием иуничтожением объектов.
В эту категорию попадают конструкторы идеструкторы классов.24Операции доступаАтрибуты обычно бывают закрытыми или защищенными. Темне менее, другие классы иногда должны просматривать или изменять ихзначения. Для этого существуют операции доступа (access operations).Пусть, например, у нас имеется атрибут Salary класса Employee. Мыне хотим, чтобы все остальные классы могли изменять этот атрибут.Вместо этого к классу Employee мы добавляем две операции доступа –GetSalary и SetSalary. К первой из них, являющейся общей, могутобращаться и другие классы.
Она просто получает значение атрибутаSalary и возвращает его вызвавшему ее классу. Операция SetSalary такжеявляется общей, она помогает вызвавшему ее классу установить новоезначение атрибута Salary. Эта операция может содержать любые правилаи условия проверки, которые необходимо выполнить, чтобы зарплатамогла быть изменена.Такой подход дает возможность безопасно инкапсулировать атрибутывнутри класса, защитив их от других классов, но все же позволяетосуществить к ним контролируемый доступ. Создание операций Get и Set(получения и изменения значения) для каждого атрибута класса являетсястандартом.Вспомогательные операцииВспомогательными (helper operations) называются такие операциикласса, которые необходимы ему для выполнения его ответственностей,но о которых другие классы не должны ничего знать.
Это закрытыеи защищенные операции класса.Чтобы идентифицировать операции, выполните следующие действия:1. Изучите диаграммы последовательности и кооперативныедиаграммы. Большая часть сообщений на этих диаграммахявляется операциями реализации. Рефлексивные сообщения будутвспомогательными операциями.2. Рассмотрите управляющие операции. Может потребоватьсядобавить конструкторы и деструкторы.3. Рассмотрите операции доступа. Для каждого атрибута класса,с которым должны будут работать другие классы, надо создатьоперации Get и Set.251.5.6.
СвязиСвязь представляет собой семантическую взаимосвязь междуклассами. Она дает классу возможность узнавать об атрибутах, операцияхи связях другого класса. Иными словами, чтобы один класс мог послатьсообщение другому на диаграмме последовательности или кооперативнойдиаграмме, между ними должна существовать связь.Существуют четыре типа связей, которые могут быть установленымежду классами: ассоциации, зависимости, агрегации и обобщения.АссоциацииАссоциация (association) – это семантическая связь между классами.Их рисуют на диаграмме классов в виде обыкновенной линии.NewClassNewClass2Рис. 1.9. АссоциацияАссоциации могут быть двунаправленными, как в примере, илиоднонаправленными.
На языке UML двунаправленные ассоциации рисуютв виде простой линии без стрелок или со стрелками с обеих ее сторон.На однонаправленной ассоциации изображают только одну стрелку,показывающую ее направление.Направление ассоциации можно определить, изучая диаграммыпоследовательности и кооперативные диаграммы. Если все сообщенияна них отправляются только одним классом и принимаются только другимклассом, но не наоборот, между этими классами имеет местооднонаправленная связь.
Если хотя бы одно сообщение отправляетсяв обратную сторону, ассоциация должна быть двунаправленной.Ассоциации могут быть рефлексивными. Рефлексивная ассоциацияпредполагает, что один экземпляр класса взаимодействует с другимиэкземплярами этого же класса.26ЗависимостиСвязизависимости(dependency)такжеотражаютсвязьмежду классами, но они всегда однонаправлены и показывают, что одинкласс зависит от определений, сделанных в другом.
Зависимостиизображают в виде стрелки, проведенной пунктирной линией.NewClassNewClass2Рис. 1.10. ЗависимостьПри генерации кода для этих классов к ним не будут добавлятьсяновые атрибуты. Однако, будут созданы специфические для языкаоператоры, необходимые для поддержки связи. Например, на языке С++в код войдут необходимые операторы #include.АгрегацииАгрегации (aggregations) представляют собой более тесную формуассоциации. Агрегация – это связь между целым и его частью. Например,у вас может быть класс Автомобиль, а также классы Двигатель, Покрышкии классы для других частей автомобиля. В результате объект классаАвтомобиль будет состоять из объекта класса Двигатель, четырех объектовПокрышек и т.
д. Агрегации визуализируют в виде линии с ромбикому класса, являющегося целым:WholePartРис. 1.11. АгрегацияВ дополнение к простой агрегации UML вводит более сильнуюразновидностьагрегации,называемуюкомпозицией.Согласно27композиции, объект-часть может принадлежать только единственномуцелому, и, кроме того, как правило, жизненный цикл частей совпадаетс циклом целого: они живут и умирают вместе с ним.
Любое удалениецелого распространяется на его части.Такое каскадное удаление нередко рассматривается как частьопределения агрегации, однако оно всегда подразумевается в том случае,когда множественность роли составляет 1..1; например, если необходимоудалить Клиента, то это удаление должно распространиться и на Заказы(и, в свою очередь, на Строки заказа).ОбобщенияС помощью обобщений (generalization) показывают связинаследования между двумя классами. Большинство объектноориентированных языков непосредственно поддерживают концепциюнаследования. Она позволяет одному классу наследовать все атрибуты,операции и связи другого.