Как уже упоминалось выше, UML содержит шесть основных типов диаграмм: диаграммы классов (содержащие в себе диаграммы пакетов и диаграммы объектов), диаграммы вариантов использования, диаграммы взаимодействия (подразделяющиеся на диаграммы последовательности и на диаграммы коллективного взаимодействия), диаграммы состояний, диаграммы действий и диаграммы размещения. Для описания заданной в задаче о двух баках системы будут использованы диаграммы классов, диаграмма вариантов использования, диаграмма взаимодействия (из двух альтернативных типов диаграмм выбрана диаграмма последовательности), диаграмма состояний и диаграмма деятельностей. Диаграмма размещения не используется, так как предназначается для описания физических взаимосвязей между аппаратными и программными компонентами системы, которые в данной системе отсутствуют.
Диаграммы классов, диаграммы пакетов, диаграммы объектов
Для того, чтобы построить диаграмму классов, необходимо, для начала, выделить в системе отдельные относительно независимые элементы и определить каким образом они взаимосвязаны между собой.
В задаче с двумя баками в первую очередь можно выделить два основных элемента: саму систему из двух баков и некое управляющее открытием/закрытием кранов устройство, называемое контроллером.
Как говорилось ранее, контроллер посылает системе из двух баков сигналы, управляющие поведением кранов Vinput, V1 и V2. Для правильного управления системой баков ему необходимо иметь значения интервалов времени Time1 и Time2, уровней L_plus и L_minus, а также получать от системы баков значение уровня воды во втором баке h2, необходимое для управления поведением выходного крана V2. Обобщая все вышеописанное, контроллер можно представить классом Controller:
Рисунок 48 - Диаграмма классов №1
Как видно из рис. 48, класс Controller содержит атрибуты h2 (для ясности описанный как элемент группы "inputs"), VinOn, VinOff , V1On, V1Off, V2On , V2Off (объединенные в группу "outputs "), Time1, Time 2, L_plus , L_minus (объединенные в группу "state "). Также класс содержит операции send_VinOn (), send_V 1On (), send _V2On (), send_V 2Off, необходимые для подачи сигналов на включение входного крана Vinput, крана V1, крана V2 и отключение крана V2. В описание класса внесена некая избыточность в виде сигналов VinOff, V1Off (избыточность, так как эти сигналы никогда не посылаются). Это сделано для того, чтобы в дальнейшем логичнее построить модель системы (так как логично предполагать, что если кран можно включить, то его можно и отключить). Также они введены на случай, если в задании потребуется, например, в определенный момент отключить подачу воды в систему, или изолировать баки друг от друга. И хотя в данном варианте задания эти сигналы никогда не будут посылаться, в дальнейшем в других элементах системы теоретическое существование этих сигналов также будет учитываться.
Как описано в задании, система двух баков должна реагировать на сигналы контроллера, а именно, управлять открытием/закрытием кранов, а также отслеживать ситуацию, когда уровень воды во втором баке становится выше уровня Н и при возникновении такой ситуации изменять скорость поступления воды во второй бак в соответствии с формулой (3). Также система должна отслеживать ситуацию переполнения баков и должным образом на нее реагировать. Исходя из этих требований можно провести декомпозицию системы на несколько частей, а именно выделить элемент, отвечающий за открытие (закрытие) крана Vinput, элемент, управляющий открытием/закрытием задвижек Р1 и Р2 (один для обоих кранов, так как описанные в формуле (5) функции, определяющие индивидуальные свойства кранов V1 и V2 совпадают друг с другом с точностью до коэффициента при 10-4 и коэффициента в показателе экспоненты). Третьим элементом системы можно выделить сами два бака, на которые возлагается задача управления протеканием воды между баками и отслеживания аварийной ситуации переполнения.
Первый элемент можно описать следующим классом Vinput_Control:
Рисунок 49 - Диаграмма классов №2
Как видно из рис. 49, класс Vinput_Control содержит атрибуты VinOn, VinOff (объединенные в группу "inputs"), Vin (для ясности описанный как элемент группы "outputs") описывающий входной поток воды в систему. Также класс содержит операции open_Vin (), close_Vin () управляющие входным потоком в зависимости от получаемых от контроллера сигналов в соответствии с формулой (1).
Второй элемент можно описать классом К_Control:
Рисунок 50 - Диаграмма классов №3
Как видно из рис. 50, класс K_Control содержит атрибуты Param_1, Param_2 (объединенные в группу "parameters") и представляющие собой как раз те коэффициенты, различающие между собой формулы (5) и (6) , VXOn, VXOff (объединенные в группу "inputs"), атрибут K (для ясности описанный как элемент группы "outputs"), описывающий выходной поток воды из первого и второго бака; атрибут Р (для ясности описанный как элемент группы "state") и управляющий положением задвижки в кранах V1 и V2. Также класс содержит операции up_K (), open_K (), down_K (), close_K () управляющие значением функций, определяющих свойства кранов V1 и V2 в зависимости от получаемых от контроллера сигналов в соответствии с формулами (5) - (6).
Третий элемент можно описать классом Two_Tanks:
Рисунок 51 - Диаграмма классов №4
Как видно из рис. 51, класс Two_Tanks содержит атрибуты K1, K2, Vin (объединенные в группу "input"), представляющие собой управляющие потоками V12 и Vout функции и входной поток в систему, h1 и h2 (объединенные в группу "outputs") представляющие собой уровни воды в первом и втором баках; H, D1, D2, A1, A2, V12, Vout (объединенные в группу "state") представляющие собой расстояние между дном первого и второго баков, диаметры баков, площади их оснований , а также выходные потоки воды из первого и второго баков. Также класс содержит операции up_V12_Vout (), down_V 12_Vout () вычисляющие значения h1 и h2 и управляющие выходным потоком из первого бака (в зависимости от уровня воды во втором баке и значения К1 в соответствии с формулой (3)) и выходным потоком из системы (в зависимости от значения К2 в соответствии с формулой (4)).
Так как классы Vinput_Control, K_Control и Two_Tanks были ранее выделены как элементы системы двух баков, то логично создать класс Tank_System, находящийся в отношении композиции с этими классами (рис. 52):
Рисунок 52 - Диаграмма классов №5
В свою очередь, класс Tank_System и класс Controller логично связать отношением композиции с классом System, представляющий собой всю систему двух баков (рис. 53):
Рисунок 53 - Диаграмма классов №6
На диаграмме объектов №1 для данной системы представлены объект класса Controller, объект класса Vinput_Control, объект класса Two_Tanks и два объекта класса K_Control, определяющие поведение крана К1 и К2 (рис. 54):
Рисунок 54 - Диаграмма объектов №1
На диаграммах объектов №2 и №3 представлены два составных объекта – объект класса Tank_System и класса System (рис. 55 и рис. 56):
Рисунок 55 - Диаграмма объектов №2
Рисунок 56 - Диаграмма объектов №3
2.3.2 Диаграмма вариантов использования
Как уже говорилось ранее, вариант использования - это пример взаимодействия пользователя и системы, чаще всего представляющий реализацию некого конкретного требования к системе.
В примере задачи с двумя баками можно выделить один основной вариант использования - "Режим нормальной работы системы". Но, как говорилось в задании, в системе существуют три аварийные ситуации, а именно: "Переполнение первого бака", "Переполнение второго бака" и "Периодическое открытие/закрытие выходного крана".
"Режим нормальной работы системы" содержит следующие требования:
1) В начальный момент времени контроллер посылает системе двух баков сигнал открыть входной кран,
2) По истечении Time1 контроллер посылает системе двух баков сигнал открыть кран V1,
3) В течении 80 сек. происходит открытие крана V1,
4) По истечении Time2 контроллер посылает системе двух баков сигнал открыть кран V2,
5) В течении 80 сек. происходит открытие крана V2.
Далее система работает в нормальном режиме, то есть, вода протекает свободно через систему, при этом не происходит переполнения баков.
"Периодическое открытие/закрытие выходного крана" расширяет основной вариант использования и содержит следующие дополнительные требования:
1) Если после включения входного крана уровень воды во втором баке становиться ниже уровня L_minus, то контроллер посылает системе двух баков сигнал закрыть кран V2.
2) В течении 80 сек. происходит закрытие крана V2.
3) Если уровень воды во втором баке становится выше уровня L_plus, то контроллер посылает системе двух баков сигнал открыть кран V2.
4) В течении 80 сек. происходит открытие крана V2.
Далее цикл замыкается и система работает в режиме периодического открытия/закрытия выходного крана.
"Переполнение первого бака" также расширяет основной вариант использования и содержит следующие дополнительные требования:
Если в любой момент работы системы происходит переполнение первого бака, система блокируется (то есть, прекращается всякое движение воды в системе).
"Переполнение второго бака" также расширяет основной вариант использования и содержит следующие дополнительные требования:
Если в любой момент работы системы происходит переполнение второго бака, система блокируется (то есть, прекращается всякое движение воды в системе).
Диаграмма вариантов использования представлена на рис. 57: