Пример 2. Автоматизированная гидропонная система (АСУ ТП).

В тепличном хозяйстве в парниковой установке выращиваются растения без грунта на специальном растворе с использованием методов гидропоники. Для нормального роста и созревания урожая необходимо соблюдение режима выращивания. Управление режимом парниковой установки осуществляется автоматически с помощью контроллера. Целью управления является поддержание в заданном диапазоне показателей среды (температура, кислотность почвы) и включение/отключение освещения в соответствии со временем суток согласно плану выращивания. План выращивания создается (вводится в контроллер) оператором и в дальнейшем используется контроллером в процессе управления устройствами. Система должна вести протокол выращивания, который по запросу оператора предоставляется ему в экранной и печатной формах

Измерение температуры и кислотности почвы осуществляются датчиками температуры и рH. Регулирование температуры, кислотности и освещения производится путем включения/выключения соответствующих устройств (вентилятора, нагревателя, вентиля подачи воды из резервуара воды и вентиля подачи жидкого удобрения из резервуара удобрений; а так же осветителя). Оператор может по ходу выращивания вносить коррективы в план выращивания. Цикл выращивания имеет определенную продолжительность в сутках и заканчивается по истечении этого времени.

 
 

 


Датчик температуры

       
   
 
 

 

 


Датчик кислотности рН

                   
   
   
       
       
 
 

 


Нагреватель Вентиль воды

 

 

Вентилятор Осветитель Вентиль удобрений

 

 


4.2. Логическое проектирование. Диаграмма классов (Class Diagram)

Второй важнейшей диаграммой концептуального уровня в UML является диаграмма классов, использующая фундаментальное для ООП понятие класса.

Отметим, что диаграмма классов строится на логическом и далее на физическом уровнях и каждый раз по смыслу (семантике) – это новая диаграмма, то есть диаграммы не просто уточняются, а видоизменяются по содержанию и семантике, становясь все более близкими к системе программирования.

Класс (class) – описание множества объектов, обладающих общими атрибутами, операциями, отношениями и поведением. Класс является результатом операции обобщения

Поэтому класс – всегда абстрактное понятие. Задание конкретных значений атрибутов определяет экземпляр класса - объект, обладающий конкретным поведением. Объект может появляться во всех отношениях класса и всех его предков.

Для некоторых классов создание прямых экземпляров невозможно, такие классы используются только для описания общей структуры потомков и называются абстрактными. Класс, имеющий конкретные экземпляры, называется конкретным (хотя на самом деле он абстрактен).

Класс имеет имя, список операций, методов и атрибутов.

Операция (operation) – спецификация (описание) результата преобразования или запроса, которые должен выполнить вызываемый объект. Имеет имя и список параметров.

Метод (method) – процедура, непосредственно реализующая операцию; у нее есть алгоритм и описание процедуры.

Другой способ реализации операции: событие вызова, переводящее активный объект в другое состояние. Более подробно этот способ реализации рассмотрим позже, когда будет изучаться диаграмма состояний (statechart diagram), использующая аппарат теории конечных автоматов.

Операция может быть абстрактной, то есть не иметь определенного способа реализации, для нее нельзя определить ни метод, ни событие вызова. Фактически абстрактная операция, определенная для абстрактного класса, является слишком общей, предками и потомками у нее могут быть более общие или менее общие абстрактные операции (классы операций).

Графически класс изображается прямоугольником, который дополнительно делится горизонтальными линиями на разделы или секции. В них указываются имя класса, его атрибуты и операции:


 

 

 


Атрибуты класса (class attributes) (свойства, properties) – свойства или характеристики данного класса, которые могут принимать только одно значение из некоторого множества значений определенного типа.

Совокупность конкретных значений атрибутов определяет экземпляр класса – объект или абстрактный класс – потомок. Атрибуты сами можно толковать как простые, конкретные классы (строки, даты, денежные единицы, целые, вещественные, вес, масса, ФИО и так далее), экземпляры которых определяют экземпляр основного объекта, которому они принадлежат.

Атрибуты находятся в отношении ассоциации с основным классом, которая всегда подразумевается, но в явном виде не изображается на диаграмме. В свою очередь, каждый атрибут как класс, также обладает свойствами. Основной набор этих свойств фиксирован, однако, дополнительные свойства разработчик может указать отдельной строкой в описании атрибута. Рассмотрим свойства атрибутов класса.

Имя (name) – имя атрибута, строка, уникальная в своём классе и у всех его предков. Имена не должны дублировать ассоциации, доступные классу, пишутся с малой буквы.

Тип (type) – имя класса или типа данных, экземплярами которых являются значения данного атрибута. Может быть экземпляром потомка данного класса или типа данных. Указывается через двоеточие, например, ФИО_сотрудника: String (определяется принятым для реализации языком программирования).

Изменяемость (changeability) – указывает, может ли значение атрибута изменяться после инициализации (в динамике), может принимать значения:

· changeable (изменяемый, значение по умолчанию) - без ограничений на изменение, в том числе добавление новых значений, удаление старых.

· addOnly – только для множественных атрибутов, разрешает добавлять новое значение, которые затем не может быть удалено или изменено. Для удаления или изменения таких значений надо данный экземпляр объекта удалить и создать новый.

· frozen (“заморожено”) – после инициализации объекта значения изменять нельзя. В само множество значений (тип) также нельзя вносить никаких изменений.

 

Например, пусть атрибут имя – отчество [1..2]: String может иметь 2 варианта:

1. Одна строка – только имя (Иван).

2. Две строки – имя/отчество (Иван Владимирович)

Если этот атрибут определен как addOnly, новое значение к имени может быть добавлено после инициализации (Владимирович), однако, изменить или редактировать его уже невозможно – запрещается. Нужно целиком удалять экземпляр Ивана Владимировича, затем создавать новый – возможно сразу с именем и отчеством.

Для одинарных атрибутов (без вариантов) это свойство не применяется.

Начальное значение (initial value) (необязательно) – выражение, определяющее то значение, которое атрибут получает сразу после инициализации объекта. Значение должно принадлежать указанному типу. Интерпретация происходит в момент создания экземпляра объекта. Если начальное значение не задано, оно не определено или определяется в другой части модели.

Процедура явного создания экземпляра (конструктор) может замещать начальное значение своим (то есть “перебивать” это указание).

Порядок инициализации разных атрибутов в классе языком UML не оговаривается, то есть считается произвольным.

Примеры:

цвет: Color = (255, 0, 0) {красный цвет RGB-модели}

имя сотрудника [1,2]: String = Игорь Петрович

форма: многоугольник = прямоугольник

Множественность (multiplicity), кратность – допустимое количество одновременно существующих значений атрибута. Обычно “ровно один” – скалярный - по умолчанию, больше одного – вектор. Способы описания множественности (берутся для атрибутов в квадратные скобки) рассмотрены далее.

[1] – ровно один, обязательно (по умолчанию)

[0..1] – “нуль” или “один” – необязательность значения (атрибут может отсутствовать в экземпляре)

[нижняя_граница_1..верхняя_граница_1, нижняя_граница_2..верхняя_граница_2, … , нижняя_граница_k..верхняя_граница_k]

Границы здесь – положительные целые числа, каждая пара задает некоторый интервал, все интервалы объединены в теоретико-множественном смысле (принцип ИЛИ).

В качестве верхней границы в последнем интервале может использоваться * - произвольное целое положительное.

Пример. У каждого Заказчика (Customer) может быть только одно имя (name), один или сколько угодно номеров телефонов (phone) и от 1 до3 ссылок (references) на других заказчиков.

Видимость (visibility) (область видимости), принимает значения:

· + public (открытый, общедоступный) – атрибут доступен или виден из любого другого класса пакета, в котором определена диаграмма;

· # protected (защищённый) – атрибут недоступен или невиден для всех классов, за исключением потомков данного класса;

· - private (закрытый) – атрибут недоступен или невиден для всех других классов без исключения, он доступен и виден только внутри данного класса. Потомкам класса (подклассам) он недоступен.

Могут быть и другие виды видимостей, определяемые языком программирования при реализации классов. Дополнительная видимость задаётся в строке свойств.

В обозначениях атрибутов могут использоваться как указанные символы (+, #, -), так и ключевые слова (public, protected, private).

Имена абстрактных классов задаются курсивом и вообще в UML любой текст, относящийся к абстрактному объекту, записывается курсивом.

Классы могут объединяться в пакеты, в этом случае для указания используется двойное двоеточие: <имя пакета> :: <имя класса>. Например: Банк :: Счёт.

Область действия (scope) – в пределах скольких экземпляров действует данный атрибут. Различают два вида области действия.

1) Область действия владельца (owner scope)определяет, действует ли атрибут в пределах одного экземпляра (значение instance, по умолчанию) или одновременно это значение присваивается всем экземплярам данного класса (значение class, общий атрибут класса). Значение обычного атрибута (в масштабе экземпляра) не существует до того момента, пока не создан экземпляр объекта. Общий атрибут класса содержит значение, действительное на протяжении всего существования системы.


2) Целевая область действия (target scope) – значением атрибута является экземпляр целевого класса (значение instance, по умолчанию) или сам класс (значение class). В первом случае целевая область действия атрибута – экземпляры целевого класса, а во втором – класс. Используется редко, обычно в каких-либо супермоделях (метамоделях – обобщениях модели).

Подчёркивание атрибута говорит о том, что область действия владельца значений атрибута – весь класс, а не экземпляр.

Пример.

Атрибут % подоходного налога: Integer {owner scope = class} в классе Сотрудник принимает одно и тоже значение для всех экземпляров класса. Это свойство можно также указать подчёркиванием атрибута: % подоходного налога: Integer

Строка свойств в фигурных скобках {} служит для указаний значений свойств атрибута, которым присваиваются определённые имена (синонимы, теги). Эти значения называются именованными. Общий синтаксис записи значений свойств:

тег = значение

Вместе с ключевыми словами список именованных значений помещается в строку свойств через запятую. Таким образом могут быть определены дополнительные свойства атрибута, например, базовое значение оклада для определённой категории сотрудников (действует в пределах этого класса) и т.д.

Общий синтаксис записи атрибута: строка текста

«стереотип» <видимость> <имя><множественность>: тип = <начальное значение> {строка свойств}.

В этой строке всё необязательно, кроме имени атрибута. Если множественность включает в себя 0 и начальное значение не указано (необязательность), то атрибут инициализируется при создании экземпляра со значением null.

Стереотип – некоторое ключевое слово, взятое в угловые кавычки. Обозначает особый вариант данного атрибута, отличающийся своим набором свойств. Может быть предопределённым или определённым разработчиком в конкретной модели. Например, атрибут со стереотипом «справка», если он выделяется как базовый текст определённого вида. Примеры спецификации атрибутов будут приведены далее в примерах описаний классов.

 

Операция (operation) – спецификация преобразования или запроса, который должен выполнить вызываемый объект. Имеет имя и список параметров.

Операция реализуется методом (method) или событием вызова (call event). У метода есть алгоритм и описание процедуры. Событие вызова предполагает автоматное задание реализации и его описание в виде диаграммы состояний. Логика события вызова соответствует известному оператору «переключатель» (case) в процедурном программировании и более подробно будет рассмотрена в разделе .

Совокупность операций определяет поведение класса, а сами операции можно трактовать как некоторые сервисы (простые варианты использования), предоставляемые классом вызывающему объекту.

Рассмотрим основные свойства операции.

Имя операции (name) название операции, строка. Вместе со списком типов параметров (имена параметров не включаются) составляет сигнатуру операции, она должна быть уникальна в пределах класса и его предков. Дублирование воспринимается как повторное объявление одной и той же операции. За единственно правильное объявление принимается объявление в самом старшем предке. При этом модель считается плохо согласованной. Имя операции начинается с малой (строчной) буквы.

Параллелизм (concurrency) – возможность выполнения операции параллельно (одновременно) (параллельные вызовы операции одного и того же экземпляра).

Принимает следующие значения:

· sequential (последовательный)можно одновременно сделать только один вызов данной операции, иначе система “развалится”; другие операции, пока не завершится данная, вызывать нельзя (блокировка).

· guarded (охраняемый) – возможно несколько вызовов от параллельных потоков управления, но все вызовы должны быть строго упорядочены во времени и выстраиваются в очередь, в случае, если первый вызов не завершился к моменту второго вызова. Нужно контролировать исключительные ситуации и гарантировать отсутствие взаимоблокировок.

· concurrent (параллельный)– к данной операции могут поступить несколько вызовов, все они могут выполняться одновременно, а также с другой охраняемой, последовательной или параллельной операцией, но за корректностью нужно следить.

Параллелизм задаётся в строке свойств, при отсутствии значения семантика выполнения операции не определена, нужно ориентироваться на худший случай – последовательного выполнения.


Полиморфизм (polymorphism)указывает, могут ли классы-потомки заменять реализацию операции (метод или событие вызова). Если полиморфизм есть, то реализация может быть подменена в классе-потомке: он может представить другое определение метода или другой переход в конечном автомате (т.е. реализация может принимать различные формы, операция полиморфна).

При отсутствии полиморфизма текущая реализация операции наследуется всеми потомками и имеет единственную форму. Записывается как isPolymorphic = true (по умолчанию) или isPolymorphic = false.

Запрос (query) указывает, оставляет ли операция состояние системы неизменным. Да – операция возвращает значение и ничего больше не делает. Нет – может изменить состояние системы. Запись: query или isQuery = true; isQuery = false (по умолчанию) в строке свойств.

Возвращаемое значение (return type)список типов значений, которые возвращаются вызовом операции (если они есть). При отсутствии возвращаемых значений это свойство имеет значение null. Многие языки программирования не поддерживают возврата нескольких значений, тогда можно использовать один или несколько параметров операции в качестве выходных. Указывается после двоеточия, может отсутствовать. Строка содержит список имён через запятую (классов, типов данных).

Область действия (scope)- указывает, применяется ли операция к отдельным объектам или ко всему классу.

Экземпляр (instance)операцию можно применять только к отдельным объектам.

Класс (class) операция применяется к самому классу, например, создание экземпляра класса.

Видимость (visibility) – аналогично свойству атрибута:

+public, общедоступная операция;

#protected, защищённая операция;

-private, закрытая операция.

.

Спецификация (specification)– выражение, описывающее действия, производимые в результате выполнения операций (например, условия до и после). В UML синтаксис (формат спецификации) не оговаривается, может быть различным. Записывается в виде строки. Ограничения указываются в комментарии к операции (рекомендуется использовать язык OCL).

Метод (method) рассматривается как реализация операции, он обладает всеми её свойствами, а также дополнительными свойствами:

· Поведение (behavior)необязательный конечный автомат, описывающий реализацию метода.

· Тело (body) выражение, описывающее процедуру (содержание) метода. Может быть фрагментом текста или кода на языке программирования. Если задан конечный автомат, то обычно не указывается.

· Кооперация (collaboration) упорядоченное множество сообщений, которыми обмениваются объекты во время исполнения метода.

Метод объявляется так же, как операция. Если операция абстрактна, то ставится стереотип «abstract» или имя пишется курсивом, метода она не имеет.



.php">22
  • Далее ⇒