воскресенье, 2 октября 2011 г.

Задача про датчики: построение функциональной архитектуры


Один из идеологов объектно-ориентированного подхода и один из авторов языка моделирования UML Джеймс Рамбо пишет:

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

Дж. Рамбо, М. Блаха. UML 2.0. Объектно-ориентированное моделирование и разработка. 2-е изд. – СПб.: Питер, 2007, стр. 42.

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


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


Согласно функциональному подходу, чтобы спроектировать программу, нужно:

  1. сформулировать ключевые функции будущей системы;
  2. описать процесс выполнения полезных функций (в английском языке есть удачный термин – flow); для этого надо:
    1. "разбить" функции на элементарные операции;
    2. упорядочить эти операции во времени;
  3. разделить слишком длинные или слишком сложные процессы на подпроцессы;
  4. описать полученные подпроцессы при помощи блок-схем или functional flow block diagram (FFBD);
  5. составить функциональную архитектуру системы, сведя найденные элементарные операции в таблицу.

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

  1. Получение данных от датчиков и сохранение их в БД.
  2. Считывание данных из БД и отображение их на экране.

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

Отобразим каждый из двух подпроцессов сначала в виде блок-схем, а затем – в виде FFBD диаграмм.

Рис. 1. Получение данных от датчиков (блок-схема).



Рис. 2. Отображение данных на экране (блок-схема).



Рис. 3. Получение данных от датчиков (FFBD).



Рис. 4. Отображение данных на экране (FFBD).



На мой взгляд, проектировщику следует применять оба вида диаграмм: блок-схема удобна для описания flow, а functional flow block diagram удобна для выявления и учёта элементарных операций. Впоследствии эти элементарные операции можно свести в таблицу, которая называется функциональной моделью или функциональной архитектурой системы.

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

Название функции
1
Получить данные от датчиков.
1.1
Ожидать сообщение или таймаут.
1.2
Прочитать сообщение с порта.
1.3
Извлечь полезные данные.
1.4
Определить тип данных – температура или атмосферное давление.
1.5
Извлечь значение температуры и время измерения.
1.6
Преобразовать значение температуры к градусам Цельсия.
1.7
Сохранить значение температуры и время измерения в БД.
1.8
Извлечь значение атмосферного давления.
1.9
Преобразовать значение атмосферного давления к миллиметрам ртутного столба.
1.10
Сохранить значение атмосферного давления и время измерения в БД.
2
Отобразить данные на экране.
2.1
Ожидать ввод пользователя или таймаут.
2.2
Получить значение температуры и время измерения из БД.
2.3
Преобразовать значение температуры к градусам Фаренгейта.
2.4
Отобразить значение температуры и время измерения на экране.
2.5
Получить значение атмосферного давления и время измерения из БД.
2.6
Преобразовать значение атмосферного давления к Паскалям.
2.7
Отобразить значение атмосферного давления и время измерения на экране.