Пример объектно-ориентированного проектирования: метеорологическая станция Требования к метеорологической станции Система должна обеспечивать автоматический мониторинг следующих первичных погодных параметров: скорость и направление ветра; температура; барометрическое давление; влажность воздуха. Система также должна вычислять некоторые производные параметры, в число которых входят: коэффициент резкости погоды; точка росы; относительное изменение температуры; относительное изменение барометрического давления. Требования к метеорологической станции В системе должна быть предусмотрена возможность определения текущего времени и даты Система должна обеспечивать постоянный вывод на дисплей текущих значений всех первичных и производных параметров, их максимальных и минимальных значений, а также время и дату Система должна позволять проводить калибровку датчиков, а также устанавливать время и дату Требования к метеорологической станции В системе должна быть предусмотрена возможность определения текущего времени и даты Система должна обеспечивать постоянный вывод на дисплей текущих значений всех первичных и производных параметров, их максимальных и минимальных значений, а также время и дату Система должна позволять проводить калибровку датчиков, а также устанавливать время и дату Предположения об аппаратной части Используется обычный персональный компьютер Системные время и дата поддерживаются встроенными часами Температура, давление и влажность определяются встроенными контроллерами, которые соединены с соответствующими датчиками Направление ветра измеряется с помощью флюгера с точностью до одного из 16 направлений; скорость ветра определяется анемометром со счетчиком оборотов Ввод команд пользователем осуществляется с помощью клавишной панели Экраном служит жидкокристаллический дисплей Встроенный таймер посылает прерывания через каждую 1/60 долю секунды Состав аппаратной части Класс времени и даты Имя: TimeDate Ответственность: Поддержание информации о текущих времени и дате Операции: currentTime - текущее время currentDate - текущая дата setFormat - установка формата setHour - установка часа setMinute - установка минут setSecond - установка секунд setMonth - установка месяца setDay - установка дня setYear - установка года Атрибуты: time - время date - дата Класс температурный датчик Имя: TemperatureSensor Ответственность: Поддержание информации о текущей температуре Операции: currentTemperature - текущая температура setLowTemperature - установка минимальной температуры setHighTemperature - установка максимальной температуры Атрибуты: temperature - температура Класс датчик давления Имя: PressureSensor Ответственность: Поддержание информации о текущем давлении Операции: currentPressure - текущее давление setLowPressure - установка минимального давления setHighPressure - установка максимального давления Атрибуты: pressure - давление Класс определения тренда Имя: TrendSensor Ответственность: Определение тренда давления или температуры как наклона графика (от -1 до 1) изменения их значений за данный интервал времени Операции: trend - тренд Класс датчик влажности Имя: HumiditySensor Ответственность: Поддержание информации о текущей влажности, выраженной в процентах от 0% до 100% Операции: currentHumidity - текущая влажность setLowHumidity - установка минимальной влажности setHighHumidity - установка максимальной влажности Атрибуты: humidity - влажность Класс для минимальных и максимальных значений параметров Имя: HistoricalSensor Ответственность: Генерация сообщений о максимальных и минимальных значениях параметров за 24-часа Операции: highValue - максимальное значение lowValue - минимальное значение timeOf HighValue - время, соответствующее максимальному значению timeOfLowValue - время, соответствующее минимальному значению Класс датчик скорости ветра Имя: WindSpeedSensor Ответственность: Поддержание информации о скорости ветра Операции: currentSpeed - текущая скорость setLowSpeed - установка минимальной скорости setHighSpeed - установка максимальной скорости Атрибуты: speed - скорость Класс калибровки измеренных значений Имя: CalibratingSensor Ответственность: Обеспечение линейной интерполяции значений, лежащих в известном интервале Операции: currentValue - текущее значение setLowValue - установка минимального значения setHighValue - установка максимального значения Класс датчик направления ветра Имя: WindDirectionSensor Ответственность: Поддержание информации о текущем направлении ветра, указываемом как точка на розе ветров Операции: currentDirection - текущее направление Атрибуты: direction - направление Иерархия классов датчиков Класс для ввода с клавиатуры Имя: Keypad Ответственность: Поддержание информации о коде последней клавиши, нажатой на клавиатуре Операции: lastKeyPress - последняя нажатая клавиша Атрибуты: key - клавиша Класс для дисплея Класс для дисплея Имя: LCDDevice Ответственность: Управление выводом на экран графических элементов Операции: drawText - рисовать текст drawLine - рисовать линию drawCircle - рисовать окружность setTextSize - установка размера текста setTextStyle - установка начертания текста setPenSize - установка ширины линии Класс для таймера Имя: Timer Ответственность: Осуществление прерываний и диспетчеризация функций обратного вызова Операции: setCallback() - установка функции обратного вызова Список ситуаций Мониторинг первичных измеряемых параметров: скорости и направления ветра, температуры, барометрического давления и влажности. Мониторинг производных параметров: коэффициента жесткости погоды, точки образования росы, трендов температуры и барометрического давления. Показ максимальных и минимальных значений выбранных параметров. Установка времени и даты. Калибровка выбранных датчиков. Включение системы. Добавим еще две дополнительные ситуации: Отказ питания. Отказ датчика. Мониторинг Частоты снятия информации: каждые 0.1 секунды направление ветра каждые 0.5 секунды скорость ветра каждые 5 минут температура, давление и влажность Класс Sampler обеспечивает требуюмую частоту снятия информации Класс для дисплея Имя: LCDDevice Ответственность: Управление выводом на экран графических элементов Операции: drawText - рисовать текст drawLine - рисовать линию drawCircle - рисовать окружность setTextSize - установка размера текста setTextStyle - установка начертания текста setPenSize - установка ширины линии Атрибуты: key - клавиша Реализация вывода параметров на экран Имя: DisplayManager Ответственность: Организация отображения параметров на экране дисплея Операции: drawStaticItems - рисование статических элементов displayTime - вывод времени displayDate - вывод даты displayTemperature - вывод температуры displayHumidity - вывод влажности displayPressure - вывод давления displayWindChill - вывод коэффициента жесткости погоды displayDewPoint - вывод точки росы displayWindSpeed - вывод скорости ветра displayWindDirection - вывод направления ветра displayHighLow - вывод максимальных и минимальных значений Связи между классами, связанными с выводом информации на экран Вторичные параметры Класс для управления клавиатурой Имя: InputManager Ответственность: Диспетчеризация команд пользователя Операции: processKeyPress - обработка сигналов с клавиатуры Архитектура системы мониторинга погоды Код классов Sensors и Sampler public enum SensorName { Direction, Speed, WindChill, Temperature, DewPoint, Humidity, Pressure; } class Sensors extends ArrayList { public void addSensor(SensorName sensor, int id); public int numberOfSensors(); public int numberOfSensors(SensorName sensor); public Sensor& sensor(SensorName, int id); } class Sampler { Sensors rSensors; DisplayManager rDisplayManager; public void sample(Tick t) { for (SensorName name = Direction; name <= Pressure; name++) for (int id = 0; id < rSensors.numberOfSensors(name); id++) if (!(t % samplingRate(name))) rDisplayManager.display( rSensors.sensor(name, id).currentValue(), name, id); } } Код классов CalibratingSensor, HistoricalSensor и TrendSensor class CalibratingSensor extends Sensor { CalibratingSensor(SensorName sensor, int id); public void setHighValue(float x, float y); public void setLowValue(float x, float y); public float currentValue(); public float rawValue(); } class HistoricalSensor extends CalibratingSensor { HistoricalSensor(SensorName sensor, int id); public float highValue(); public float lowValue(); public String timeOfHighValue(); public String timeOfLowValue(); } class TrendSensor extends HistoricalSensor { TrendSensor(SensorName sensor, int id); public float trend(); }