понедельник, 24 октября 2011 г.

Задача про датчики: проектирование классов. Часть 2

Продолжение серии статей, посвящённой проектированию системы для метеостанции. Предыдущие статьи смотрите здесь:


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

В предыдущей статье я предложил условно разделять классы на 2 категории:

  1. классы-сервисы:
  2. классы-данные.

Классы-сервисы предназначены для выполнения каких-то особых, специфичных задач. Синонимами понятия класс-сервис являются функциональный модуль или функциональная подсистема.

Классы-данные предназначены для временного или постоянного хранения групп данных, а также – для передачи этих данных от сервиса к сервису. Можно сказать, что классы-сервисы – это обработчики, а классы-данные – это коммуникации между этими обработчиками. У "железячников" есть хороший термин – шина данных. Так вот, проектирование классов-данных сродни прокладке шины данных, соединяющей одни функциональный подсистемы с другими.

Чтобы спроектировать классы-данные, нужно провести анализ потоков данных. Нужно понять, как отдельные функции, выполняемые в рамках процесса, связаны друг с другом по данным. Одним из наглядных инструментов для такого анализа является N-square диаграмма.


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

Это правило запомнить очень просто: вход – сверху, выход – справа.

N-square диаграммы для нашей задачи приведены в таблицах 1 и 2.

Первая функция "Ожидать сообщение или таймаут" получает на вход время ожидания. Она отправляет поток в "спячку" на указанное время или до тех пор, пока на порт не поступит сообщение.

Вторая функция "Прочитать сообщение с порта" получает на вход идентификатор порта, а возвращает – прочитанное сообщение.

Сообщение может содержать как необходимые данные (температуру или атмосферное давление), так и служебную информацию. Функция "Извлечь полезные данные" отфильтровывает служебные сообщения и передаёт дальше только те сообщения, которые содержат либо информацию о температуре, либо информацию об атмосферном давлении.

Возможно, эта функция называется неправильно, и её целесообразнее переименовать в "Отделить информационные сообщения от служебных".

Следующая функция "Определить тип данных" определяет источник сообщения (датчик температуры или датчик атмосферного давления) и отсылает его соответствующему обработчику. Возможно, эта функция тоже называется неправильно, и её целесообразно переименовать в "Определить источник сообщения". Эта функция получает на вход сообщение и возвращает тоже сообщение, возможно, дописав к нему информацию об источнике.

Функция "Извлечь значение температуры и время измерения" получает на вход сообщение, а возвращает – температуру и время. Если температуру можно представить значением и идентификатором шкалы (Цельсия, Кельвина, Фаренгейта), то время – более сложный параметр. Он должен включать в себя дату и время измерения. Возможно, функцию следует переименовать в "Извлечь значение температуры, дату и время измерения" и разбить общий параметр "время" на два – "дату в формате DD/MM/YYYY" и "время в формате HH/MM/SS".

Следующая функция "Преобразовать значение температуры к градусам Цельсия" получает на вход температуру в единицах измерения датчика и возвращает значение температуры по шкале Цельсия.

Функция "Сохранить значение температуры и время измерения в БД" получает на вход температуру и время (а правильнее смказать – дату и время) и сохраняет их в БД.

Если сообщение поступило от датчика давления, то управление получает функция "Извлечь значение атмосферного давления и время измерения". На входе она получает сообщение, а на выходе – возвращает значение атмосферного давления в Паскалях и время. Тут, как и для функции "Извлечь значение температуры и время измерения" будет справедливым замечание о том, что "время" – это слишком общая характеристика данных. Его целесообразно разбить на две составляющие – "дату в формате DD/MM/YYYY" и "время в формате HH/MM/SS", а функцию целесообразно переименовать к "Извлечь значение атмосферного давления, дату и время измерения".

Функция "Преобразовать значение атмосферного давления к миллиметрам ртутного столба" получает на вход давление в Паскалях, а возвращает – давление в миллиметрах ртутного столба.

Функция "Сохранить значение атмосферного давления и время измерения в БД" получает на вход атмосферное давление и время и не возвращает ничего. Как было отмечено ранее, параметр "время" следует разбить на две составляющие – "дату" и "время", а функцию – переименовать в Сохранить значение атмосферного давления, дату и время измерения в БД".


Анализ потоков данных и построение N-square диаграмм позволяет:

  1. лучше понять, какие данные нужны;
  2. найти кандидаты в классы-данные;
  3. выявить пропущенные функции.

В нашем случае стало понятным, что:

  1. некоторые функции названы неправильно, и их лучше переименовать;
  2. слишком общий параметр время лучше разбить на два параметра – дату и время и специфицировать их форматы;
  3. нужно добавить функции-преобразователи даты и времени из одних форматов в другие.

Изменённые N-square диаграммы приведены в таблицах 3 и 4.



Добавление новых функций привело к изменению функциональной архитектуры и функционально-физической матрицы. Новые варианты приведены в таблицах 5 и 6.

Табл. 5. Функциональная архитектура программы для метеостанции

1. Получить данные от датчиков
1.1. Ожидать сообщение или таймаут
1.2. Прочитать сообщение с порта
1.3. Отделить информационные сообщения от служебных
1.4. Определить источник сообщения
1.5. Извлечь значение температуры, дату и время измерения
1.6. Преобразовать значение температуры к градусам Цельсия
1.7. Преобразовать дату измерения к формату DD/MM/YYYY
1.8. Преобразовать время измерения к формату HH/MM/SS
1.9. Сохранить значение температуры, дату и время измерения в БД
1.10. Извлечь значение атмосферного давления, дату и время измерения
1.11. Преобразовать значение атмосферного давления к миллиметрам ртутного столба
1.12. Сохранить значение атмосферного давления, дату и время измерения в БД
2. Отобразить данные на экране
2.1. Ожидать ввод пользователя или таймаут
2.2. Получить значение температуры, дату и время измерения из БД
2.3. Преобразовать значение температуры к градусам Фаренгейта
2.4. Преобразовать дату к формату MM/DD/YY
2.5. Преобразовать время к 12-часовому формату
2.6. Отобразить значение температуры, дату и время измерения на экране
2.7. Получить значение атмосферного давления, дату и время измерения из БД
2.8. Преобразовать значение атмосферного давления к Паскалям
2.9. Отобразить значение атмосферного давления, дату и время измерения на экране


Кандидаты в классы-данные находятся простым выписыванием входов и выходов функций из N-square диаграммы. Кандидаты в классы-данные программы для метеостанции представлены в таблице 7.

Табл. 7. Кандидаты в классы-данные программы для метеостанции.

Кандидат в класс
1
Порт
2
Сообщение
3
Сообщение от датчика температуры
4
Сообщение от датчика атмосферного давления
5
Дата
6
Дата в формате DD/MM/YYYY
7
Дата в формате MM/DD/YY
8
Время
9
Время в формате HH/MM/SS
10
Время в 12-часовом формате
11
Время ожидания
12
Температура
13
Температура в градусах Цельсия
14
Температура в градусах Фаренгейта
15
Атмосферное давление
16
Атмосферное давление в Паскалях
17
Атмосферное давление в миллиметрах ртутного столба

ЛИТЕРАТУРА:

  1. NAS System Engineering Manual Section 4.4.
  2. NASA System Engineering Handbook.
  3. System Engineering Fundamentals.

Продолжение следует...