Использование атрибутов в модели предметной области Атрибут -- это абстрактное свойство объекта. В модель предметной области включаются те атрибуты, присутствие которых позволяет лучше понять суть решаемой проблемы. Например: в классе Поезд можно записать номер, время отправления, время прибытия. +-----------+ | Train | +-----------+ |numb:int | |depart:time| |arriv:time | +-----------+ Некоторые сущности рекомендуется представлять не в виде атрибутов, а в форме ассоциаций. Например: +-----------+ | Train | +-----------+ плохо! | . . . . . | |itinerary | +-----------+ +-----+ +---------+ |Train| |Itinerary| +-----+1..* 1+---------+ | +------+ | | | | | +-----+ +---------+ Непримитивные типы Тип атрибута может оказаться непримитивным типом (классом) даже если его значение выглядит как значение стандартного типа. Это может происходить в следующих случаях: 1) если значение составлено из отдельных частей (например, в адресе может быть указана страна, город, улица); 2) если с этим значением ассоциируются операции, такие как синтаксический анализ и проверка (например, номер страхового полиса); 3) если значение предусматривает наличие других атрибутов (например, льготная цена с началом и концом и категорией клиентов); 4) если это значение используется для количества с единицами измерения (например, стоимость в единицах (рублях, гривнах, тугриках)); 5) если это абстракция одного или нескольких типов (например, +-------------+ +------------+ | Payment | | Payment | +-------------+ Плохо! +------------+ |amount:number| |amount:Money| +-------------+ +------------+ Уточнение модели предметной области. Агрегация Агрегация -- это вид ассоциации, полезный для моделирования взаимосвязей "целое--часть" между сущностями. Целое обычно называется композитным объектом. Композитная агрегация (объединение) означает, что части (компоненты) связаны только с одним композитным объектом. +-----+1содержит1..*+--------+ |Train+----------+Carriage| +-----+ +--------+ Совместная агрегация означает, что со стороны составного объекта кратность может быть больше единицы. +---------+ содержит +-------+ |Itinerary|<>----------+Station| +---------+1..* 1..* +-------+ ------------------> . . . . . . . . . . /--------------\ / v Обобщение -- это процесс, связанный с идентификацией общности между понятиями. Обобщение предсматривает определение суперкласса (обобщённое понятие) и связанным с ним подклассом (специализированное понятие). +-----+оплачивается+------------+ |Order+------------+ Payment | +-----+ +------------+ |amount:Money| +------------+ ^ + + +--------------- +---+ | | |CashPayment -----------------+ Классы вместо атрибутов и классы-ассоциации Если в модели предметной области некоторый объект класса C может иметь одновременно несколько значений одного и того же атрибута A, то вместо атрибута A следует создать отдельный класс, связанный с классом C ассоциацией "один ко многим". +-------+ +-----------+ |Employe|1 имеет 1..*|ContactInfo| +-------+-------------+-----------+ |address| |PhoneNumber| +-------+ +-----------+ +----+Принимает+-------+ |prof| экзамен |StGroup| +----+---------+-------+ |name|1..* 1..*|idGroup| +----+ +-------+ +----+ +-------+ |prof| |StGroup| +----+----+----+-------+ |name| . |idGroup| +----+ . +-------+ . +-------+ | Exem | +-------+ |Subject| |Date | |... | +-------+ Диаграммы взаимодействия После построения диаграмм концептуальных классов создают диаграммы взаимодействия. В отличие от диаграмм концептуальных классов, которые отражают статику системы, диаграммы взаимодействия иллюстрируют взаимодействие объектов в процессе выполнения системных требований. Диаграммы взаимодействия являются наиболее важным артефактом, используемым при объектно-ориентированном конструировании. Начиная с диаграмм взаимодействия, конструирование приобретает формализованную сущность. На этом этапе требования, представленные ранее в виде словесного описания, приобретают однозначное графическое отображение. Для улучшения качества будущего программного продукта в процессе разработки диаграмм взаимодействия используются шаблоны и принципы конструирования. Системы обозначений для диаграмм взаимодействия Термин "диаграмма взаимодействия" используется в качестве общего названия для двух конкретных типов диаграмм, а именно: диаграмм кооперации и диаграмм последовательностей. Тип диаграмм |Преимущества |Недостатки --------------------+--------------------------+------------------------- Диаграмма последова-|Явно отображает последова-|Расширяется вправо и вниз тельности |тельность и временной по- |при добавлении новых объ- |рядок сообщений, простые |ектов, занимает много ме- |обозначения, при использо-|ста |вании CASE-средств обеспе-| |чивает обратное проектиро-| |вание | --------------------+--------------------------+------------------------- Диаграмма кооперации|Экономия пространства (мо-|Сложнее отследить после- |жно добавлять новые объек-|довательность сообщений, |ты во всех направлениях), |более сложная система |лучше иллюстрируют сложные|обозначений |зависимости, итерационные | |процессы и параллельные | |события | Обозначение классов и экземпляров объектов +-----+ +-------+ +----------+ |Train| |_Train_| |_T1:Train_| +-----+ +-------+ +----------+ Основные обозначения диаграмм кооперации Связь является экземпляром ассоциации. Это соединение между двумя экземплярами класса, определяющее некоторую форму перемещения и видимости между ними. По одной линии связи могут передаваться несколько сообщений в обоих направлениях, например: ----> 1:msg1() 2:msg2() +---------+ |---> +---------+ |_:classA_+--------------+_:classB_| +---------+ | <---- +---------+ | 21:msg3() +--+--+ |связь|\ | +-+ +-------+ Сообщения могут передаваться объектом самому себе. Для создания объекта можно использовать любые сообщения, однако в языке UML для этого принято использовать сообщение create. newA()+--------+1:create()+---------+ ----->|_classB_| ------> |_:classB_| -------+--------+----------+---------+ Порядок передачи сообщений иллюстрируется с помощью порядковых номеров, при этом первое сообщение не нумеруется, если сообщение, передаваемое некоторому объекту, вызвало в свою очередь другие сообщения, то их номера начинаются с номера входного сообщения, а далее через точку записывается номер порождённого сообщения, определяемый порядком его возникновения. -----> 1:msg2() msg1() +---------+ -----> +---------+ ----------------+_:classA_+-----------+_:classB_| +----+----+ +----+----+ | 1.1:msg4()v | | 2.1:msg5()^ | | 2:msg3() +----+----+ +----------------+_:classC_| -----> +----+----+ 2.2:msg6()v| +----+----+ |_:classD_| +---------+ Условные сообщения изображаются с помощью номера, за которым в квадратных скобках указывается условное выражение. Например: msg1() +---------+1[a>b]:msg2()+---------+ -----> |_:classA_+-------------+_:classB_| --------+---------+ -----> +---------+ Обозначение взаимноисключающих сообщений +---------+ |_classD_ | +----+----+ msg1() | ---> +----+----+1d[a>b]:msg2() ---> +---------+ ------+_:classA_+--------------------+_:classB_| +----+----+ +-----+---+ v|1b[a<=b]:msg3() 1a.1:msg5()|v | +-----+---- +-------------- | | ------------+ Обозначение циклов msg1() -> 1*[k:1..10]:R=msg2() --------[_classA]------------------[_:classB_] a:=<имя сообщ.>(b:type1,c:type2) Условные обозначения диаграмм последовательностей В этих диаграммах объекты, участвующие во взаимодействии, располагаются горизонтально вверху диаграммы. От каждого объекта исходит пунктирная вертикальная линия (линия жизни). Время направлено сверху вниз по пунктирным линиям. Связи на диаграммах последовательностей не отображаются. Сообщения между объектами (взаимодействие) изображаютс в виде линий со стрелками на конце. Они соединяют линии жизни объектов. Порядок передачи сообщений определяется расположением сверху вниз. Прямоугольник на линии жизни объекта обозначает интервал времени, в течение которого данный объект является активным, и называются блоками активности. Эти блоки не обязательны. Возврат значения при передаче сообщений обозначается пунктирной линией со стрелкой, исходящей из блоков активации. [_:classA_] [_:classB_] . . +-----+ msg1() . .-------------+линия|\ --------->++msg2() . |жизни+-+ |+--------------------------->++ +-------+ || msg4() ||.-----------+-------+ ||<...........................++ | |\ || msg3() . |блок +-+ ++--------------------------->++ |активации| . || +---------+ . ++ . . [_:classA_] . msg1() . -------->++ |+---+ || |clear() |++<-+ ||| |++ ++ . При создании экземпляра объекта вводится новый уровень. Факт уничтожения объекта отображается символом X в конце линии жизни. [_:classA_] . msg1() . --------->++ create() |+------------>[_:classB_] || . || <> . ||<-----------------. ++ X Для отображения взаимоисключающих условий используется несколько линий сообщений, исходящих из одной точки. Например: [_:classA_] [_:classB_] [_:classC_] . . . msg1() . . . -------->++[a>b]msg2() . . |+------------------------->++ . || || . || ++ . ||[c>d]msg3() . . |+------------------------->++ . ||\ || . || \[c<=d]msg4() ++ . ++ -------------------------------------->++ Отображение циклов на диаграммах последовательности [_:classA_] [_:classB_] msg1() . . ---------->++ . +--++-------------------------------+ | || msg2() . | | |+---------------------->++ | | || msg3() || | | ||<......................+| | | || msg4() || | | |+---------------------->++ | | || *[i=1..k] . | +--++-------------------------------+ ++ . . . Использование шаблонов (паттернов) в конструировании В процессе разработки программных систем и моделирования бизнес-процессов возникает много проблем, которые имеют одинаковые или похожие схемы решения. Попытки выявить похожие проблемы и предложить для их решения схемы или структуры на основании успешного опыта работы над проектами (в рамках объектно-ориентированного анализа и проектирования) привели к появлению понятия паттерна (шаблона), которое из понятия абстрактного превратилось в предмет современных технологий.