На этом шаге рассмотрим типичные приемы моделирования потоков управления, упорядоченных по времени.
Чтобы смоделировать поток управления, проходящий через объекты (находящиеся в контексте системы, подсистемы, операции или класса) и роли, используйте диаграммы взаимодействия; чтобы подчеркнуть временной порядок сообщений, применяйте разновидность диаграмм взаимодействий – диаграмму последовательности.
Чтобы смоделировать поток управления во времени, необходимо:
Отдельная диаграмма последовательности может показать только один поток управления (хотя допускается выражение структурной параллельности средствами управляющих структурных операторов). Обычно приходится иметь дело со множеством диаграмм взаимодействия; некоторые из них первичны, а другие показывают альтернативные пути или исключительные условия. Для организации этих наборов диаграмм последовательностей можно использовать пакеты, присваивая каждой диаграмме соответствующее уникальное имя.
В качестве примера на рис. 1 показана диаграмма последовательности, описывающая поток управления, который инициирует простой телефонный звонок.
Рис.1. Моделирование потока управления во времени
На этом уровне абстракции существуют четыре роли, вовлеченные в процесс: два абонента (Callers) – s и r, безымянный телефон Switch и экземпляр скласса Conversation (Разговор) между двумя абонентами. При том что диаграмма моделирует четыре роли, каждый экземпляр диаграммы имеет конкретные объекты, связанные с каждой из ролей. Один и тот же образец взаимодействия применяется к каждому экземпляру диаграммы.
Последовательность начинается с того, что один Caller (абонент s) посылает сигнал (liftReceiver – снятиеТрубки) объекту Switch. В свою очередь, Switch посылает setDialTone(длинныйГудок) объекту Caller, который начинает итерацию сообщений dialDigit (наборНомера).
Ограничение показывает, что эта последовательность должна занимать не дольше 30 с. Диаграмма ничего не сообщает о том, что случится, если временное ограничение будет нарушено. Чтобы показать последствия этого события, можно включить ветвь или же отдельную диаграмму последовательности.
Затем объект Switch вызывает самого себя для выполнения операции routeCall (передатьВызов). Далее он создает объект Conversation(с), которому поручает всю остальную работу. Хотя здесь это и не показано, объект c должен выполнять дополнительные обязанности как часть механизма, учитывающего стоимость разговоров и выставляющего счета абонентам (данный механизм должен быть описан в другой диаграмме взаимодействия).
Объект Conversation(с) звонит Caller(r), который асинхронно посылает сообщение liftReceiver. Затем объект Conversation говорит Switch, чтобы тот вызвал операцию connect (соединить), и сообщает обоим абонентам, что нужно выполнить connect, после чего они смогут обмениваться информацией, как показано в примечании.
Диаграмма взаимодействия может начинаться или заканчиваться в любой точке последовательности. Полная трассировка потока управления может быть чрезвычайно сложной, поэтому разумно выделить объемные потоки в отдельные диаграммы.
На следующем шаге рассмотрим типичные приемы моделирования потоков управления по организации.