Сведения о языке UML (1183998), страница 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Рис.