Диаграммы классов, диаграммы пакетов, диаграммы объектов
Для того, чтобы построить диаграмму классов, необходимо, для начала, выделить в системе отдельные относительно независимые элементы и определить каким образом они взаимосвязаны между собой.
В задаче с двумя баками в первую очередь можно выделить два основных элемента: саму систему из двух баков и некое управляющее открытием/закрытием кранов устройство, называемое контроллером.
Как говорилось ранее, контроллер посылает системе из двух баков сигналы, управляющие поведением кранов Vinput, V1 и V2. Для правильного управления системой баков ему необходимо иметь значения интервалов времени Time1 и Time2, уровней L_plus и L_minus, а также получать от системы баков значение уровня воды во втором баке h2, необходимое для управления поведением выходного крана V2. Обобщая все вышеописанное, контроллер можно представить классом Controller:
Рисунок 2 "Диаграмма классов №1"
Как видно из рис.2, класс 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:
Рисунок .3 "Диаграмма классов №2"
Как видно из рис.3, класс Vinput_Control содержит атрибуты VinOn, VinOff (объединенные в группу "inputs"), Vin (для ясности описанный как элемент группы "outputs") описывающий входной поток воды в систему. Также класс содержит операции open_Vin (), close_Vin () управляющие входным потоком в зависимости от получаемых от контроллера сигналов в соответствии с формулой (1).
Второй элемент можно описать классом К_Control:
Рисунок 4 "Диаграмма классов №3"
Как видно из рис.4, класс 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:
Рисунок 5 "Диаграмма классов №4"
Как видно из рис.5, класс 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, находящийся в отношении композиции с этими классами (рис.6):
Рисунок 6 "Диаграмма классов №5"
В свою очередь, класс Tank_System и класс Controller логично связать отношением композиции с классом System, представляющий собой всю систему двух баков (рис.7):
Рисунок 7 "Диаграмма классов №6"
На диаграмме объектов №1 для данной системы представлены объект класса Controller, объект класса Vinput_Control, объект класса Two_Tanks и два объекта класса K_Control, определяющие поведение крана К1 и К2 (рис.8):
Рисунок 8 "Диаграмма объектов №1"
На диаграммах объектов №2 и №3 представлены два составных объекта – объект класса Tank_System и класса System (рис.9 и рис.10):
Рисунок 9 "Диаграмма объектов №2"
Рисунок 10 "Диаграмма объектов №3"
Диаграмма вариантов использования
Вариант использования - это пример взаимодействия пользователя и системы, чаще всего представляющий реализацию некого конкретного требования к системе.
В примере задачи с двумя баками можно выделить один основной вариант использования - "Режим нормальной работы системы". Но, как говорилось в задании, в системе существуют три аварийные ситуации, а именно: "Переполнение первого бака", "Переполнение второго бака" и "Периодическое открытие/закрытие выходного крана".
"Режим нормальной работы системы" содержит следующие требования:
В начальный момент времени контроллер посылает системе двух баков сигнал открыть входной кран,
По истечении Time1 контроллер посылает системе двух баков сигнал открыть кран V1,
В течении 80 сек. происходит открытие крана V1,
По истечении Time2 контроллер посылает системе двух баков сигнал открыть кран V2,
В течении 80 сек. происходит открытие крана V2.
Далее система работает в нормальном режиме, то есть, вода протекает свободно через систему, при этом не происходит переполнения баков.
"Периодическое открытие/закрытие выходного крана" расширяет основной вариант использования и содержит следующие дополнительные требования:
Если после включения входного крана уровень воды во втором баке становиться ниже уровня L_minus, то контроллер посылает системе двух баков сигнал закрыть кран V2,
В течении 80 сек. происходит закрытие крана V2,
Если уровень воды во втором баке становится выше уровня L_plus, то контроллер посылает системе двух баков сигнал открыть кран V2;
В течении 80 сек. происходит открытие крана V2.
Далее цикл замыкается и система работает в режиме периодического открытия/закрытия выходного крана.
"Переполнение первого бака" также расширяет основной вариант использования и содержит следующие дополнительные требования:
Если в любой момент работы системы происходит переполнение первого бака, система блокируется (то есть, прекращается всякое движение воды в системе).
"Переполнение второго бака" также расширяет основной вариант использования и содержит следующие дополнительные требования:
Если в любой момент работы системы происходит переполнение второго бака, система блокируется (то есть, прекращается всякое движение воды в системе).
Диаграмма вариантов использования представлена на рис.11:
Рисунок 11 "Диаграмма вариантов использования"
Диаграмма последовательности
Диаграмма последовательности (являющаяся разновидностью диаграмм взаимодействия) представляет взаимодействие объектов в рамках одного варианта использования. Данный тип диаграмм удобно использовать в ситуациях, когда имеет место простое поведение, без возникновения циклов и сложных условных переходов.
В задаче о двух баках диаграммой последовательности удобно описать поведение системы в основном варианте использования - "Режим нормальной работы системы".
Диаграмма последовательности для данного варианта использования представлена на рис.12 (временные интервалы соответствуют параметрам, представленным в табл.1):
Рисунок 12 "Диаграмма последовательности"
Диаграмма деятельностей
Диаграммы деятельностей удобны для изображения взаимодействия вариантов использования. Также они удобны для описания вариантов использования, содержащих условные переходы.
В задаче с двумя баками удобно диаграммой деятельностей представить взаимодействие вариантов использования, а также описать каждый из "аварийных" вариантов использования.
На рис.13 представлена диаграмма, описывающая взаимодействие вариантов использования:
Рисунок 13 "Диаграмма деятельностей №1"
На рис.14 представлено описание варианта использования "Периодическое открытие/закрытие выходного крана":
Рисунок 14 "Диаграмма деятельностей №2"
На рис.15 представлено описание вариантов использования Переполнение первого бака и Переполнение второго бака:
Рисунок 15 "Диаграмма деятельностей №3"
Диаграмма состояний
Диаграммы состояний определяют все возможные состояния, в которых может находиться конкретный объект, а также смены состояний объекта в результате влияния неких событий.
Исходя из этого, а также используя ранее построенные диаграммы, в задаче о двух баках можно определить диаграммы состояний следующих объектов: Controller : Controller, Two_Tanks : Two_Tanks, Vin_Control : Vinput _Controller; а также диаграмма состояний объектов K1_Control и K2_Control класса K_Control (общая для обоих объектов, так как у них одинаковая логика поведения).
Диаграмма состояний объекта Controller : Controller представлена на рис.16:
Рисунок 16 "Диаграмма состояний №1"
Данная диаграмма отражает логику поведения объекта Controller. Процесс начинается с начальной точки, затем следует мгновенный переход в состояние Ожидание_1, в котором входным действием является посылка сигнала VinOn, открывающего входной кран Vinput. По истечении времени Time1 происходит переход в состояние Ожидание_2, в котором входным действием является посылка сигнала V1On, открывающего кран между баками. По истечении времени Time2 происходит переход в состояние Ожидание_3, в котором входным действием является посылка сигнала V2On, открывающего выходной кран V2. В данном состоянии объект находится до тех пор, пока не станет истинным условие перехода h2<L_minus, говорящий о том, что уровень воды во втором баке стал ниже уровня L_minus. Если условие выполняется, то объект переходит в состояние Ожидание_4, в котором входным действием является посылка сигнала V2Off, отключающее кран V2. Объект находится в этом состоянии до тех пор, пока не выполняется условие перехода h2>=L_plus, говорящее о том, что что уровень воды во втором баке стал выше уровня L_plus. Тогда объект переходит обратно в состояние Ожидание_3 и цикл замыкается.
Диаграмма состояний объекта Two_Tanks : Two_Tanks представлена на рис.17:
Рисунок 17 "Диаграмма состояний №2"
Данная диаграмма отражает логику поведения объекта Two_Tanks. Процесс начинается с начальной точки, затем следует мгновенный переход в состояние Вычисление_1, в котором выполняется вычисление значений V12, Vout, h1 и h2 до тех пор пока не станет истинным одно из условий перехода. Если истинным станет условие [(h1>=1)^(h2>=1)], то есть, произойдет переполнение какого-либо из баков, то происходит переход в состояние Блокировка, где система блокируется от подачи воды и баки изолируются друг от друга (то есть система как бы «застывает» в состоянии в котором произошла данная аварийная ситуация). Если становится истинным условие [h2>H], то есть, уровень воды во втором баке поднимается выше уровня подключения к нему трубы от первого бака, то объект переходит в состояние Вычисление_2 в котором уменьшается скорость подачи воды во второй бак и так же происходит вычисление значений V12, Vout, h1 и h2. Это происходит до тех пор, пока истинным не станет одно из условий перехода. Если истинным станет условие [(h1>=1)^(h2>=1)], то произойдет переход в состояние Блокировка, а если истинным станет условие [h2<=H], то есть уровень воды во втором баке опустится до уровня подключения к нему трубы от первого бака, то объект переходит в состояние Вычисление_1 и цикл замкнется.
Диаграмма состояний объекта Vin_Control : Vinput_Control представлена на рис.18:
Рисунок 18 "Диаграмма состояний №3"
Данная диаграмма отражает логику поведения объекта Vin_Control. Процесс начинается с начальной точки, затем следует мгновенный переход в состояние Выключен, в котором выполняется выключение крана Vinput. Объект находится в этом состоянии до тех пор, пока не поступит сигнал VinOn и не станет истинным условие [VinOn=true]. Тогда объект переходит в состояние Включен, в котором происходит включение крана Vinput. Объект находится в этом состоянии до тех пор, пока не станет истинным условие [VinOff=true], то есть не будет получен сигнал о выключении входного крана. Тогда объект вернется в состояние Выключен и цикл замкнется.
Диаграмма состояний объектов К1_Control и К2_Control представлена на рис.19:
Рисунок 19 "Диаграмма состояний №4"
Данная диаграмма отражает логику поведения объектов К1_Control и К2_Control.
Она состоит из двух суперсостояний - Закрытие и Открытие, определяющих закрытие и открытие крана V1 (или V2). Процесс начинается с начальной точки, затем следует мгновенный переход в состояние Закрытие, в котором объект находится до тех пор, пока не выполниться условие [VXOn=true], обозначающее приход сигнала VXOn, включающего кран V1 (или V2). Тогда объект переходит в состояние Открытие, в котором находится до тех пор, пока не придет сигнал на закрытие крана, то есть не станет истинным условие [VXOn=true]. По этому сигналу объект возвращается в предыдущее состояние и цикл замыкается. В суперсостоянии Закрытие содержаться два подсостояния - Выключение и выключен. При попадании в данное суперсостояние объект сразу попадает в состояние Выключение в котором происходит выключение крана до тех пор, пока не выполниться условие [P>=80]. Это означает, что задвижка крана дошла до предельного состояния. В этот момент выполняется выходное действие, закрывающее кран, и объект переходит в состояние Выключен. В нем он находится до тех пор, пока не будет получен сигнал на переход во второе суперсостояние. При попадании во второе суперсостояние объект сразу попадает в состояние Включение в котором происходит включение крана до тех пор, пока не выполниться условие [P<=0]. Это означает, что задвижка крана дошла до предельного состояния. В этот момент выполняется выходное действие, открывающее кран, и объект переходит в состояние Включен. В нем он находится до тех пор, пока не будет получен сигнал на переход обратно в первое суперсостояние. Тогда объект переходит обратно в состояние Закрытие и цикл замыкается.