Проблемная задача: Построение блоковых графиков по выборочным данным
Функциональные требования к программе:
1) ввод выборки непосредственно в программу (таблица) или загрузка из файла (cvs);
2) расчет статистических характеристик выборки - медиана, среднее, процентильные значения, стандартное отклонение, минимальное и максимальное значение;
3) исключение «выпадающих значений»;
4) построение графика по заданным вариантам (указание pr и k, выбор показателей границ, центра и разброса);
5) настройка отображение задание цвета, типа линий для отрезка, рисунка заполнения для блока, символа – для отображения центра;
6) сохранение графика для переноса в другую программу или печати или записи в файл.
Фильтр преобразует данные, которые он получает из каналов, к которым он подключен. Фильтр может иметь любое количество входных каналов и любое количество выходных каналов.
Канал — это соединитель, который передает данные от одного фильтра к другому. Это направленный поток данных, который обычно реализуется с помощью буфера данных для хранения всех данных до тех пор, пока следующий фильтр не успеет их обработать.
Источником данных или производителем может быть статический текстовый файл или устройство ввода с клавиатуры, постоянно создающее новые данные.
Приемник или потребитель данных может быть другой файл, база данных или экран компьютера.
Простейший случай - это прямой вызов между соседними фильтрами для передачи или извлечения данных. Это подход легко реализуем на паттерне Декоратор в направлении от источника к приемнику (push), сценарий на рис. А, что позволяет просто комбинировать фильтры.
Рис. А - Соединение фильтров вида «точка-точка» для случая прямой передачи данных от источника к приемнику
Рис. Б - Смешанная обработка
Системные требования:
Архитектура «каналы и фильтры».
Класс канала, который принимает входные данные от фильтра.
Интерфейс фильтра, реализованный всеми обработчиками.
Примерные этапы обработки: проверка данных, расчеты статистических характеристик, формирование модели графика, отображение графика и/или его числовых значений.
1. Разделите задачу системы на последовательность этапов обработки. Каждый этап должен зависеть только от выхода своего прямого предшественника. Все этапы концептуально связаны потоком данных. При необходимости определите альтернативные обработки для каждого этапа.
2. Определите формат данных для передачи по каждому каналу. Определение общего для всех фильтров формата обеспечивает максимальную гибкость, поскольку упрощает перестановку фильтров, но зачастую требует дополнительных преобразований на входе и выходе фильтра.
3. Решите, как реализовать каждое соединение. Это зависит от того, планируете ли вы фильтры как активные или пассивные компоненты.
Гибкое решение - использование отдельного конвейерного механизма, который синхронизирует соседние активные фильтры. Если все каналы используют один и тот же механизм, возможна произвольная перекомбинация фильтров. В Канал предоставляется в виде очереди фильтров, которые могут производить и потреблять данные. Современные средства межпроцессного взаимодействия для каналов позволяют построить систему активных фильтров на основе паттерна «Поставщик-Потребитель»
4. Перед реализацией определите классы и методы, реализующие фильтры. Каждый фильтр должен выполнять только одну функцию по преобразованию. Альтернативные алгоритмы этого преобразования могут быть реализованы через методы (делегация другому классу по паттерну Стратегия) или выбор класса обработки (паттерн Медиатор)
5. Предусмотрите пути обработки ошибок. Важно решить как будут обрабатывать некорректные данные, для того чтобы поток обработки данных не прерывался[1]. Поскольку ошибочными могут быть только входные данных можно предусмотреть отдельный фильтр. Также дополнить систему отдельным каналов ошибок (использовать логирование).
6. Реализуйте графический интерфейс пользователя, позволяющий управлять последовательность фильтров и настройкой их алгоритмов и запуском самой программы.
[1] Как правило, такие системы не предназначены для ручного ввода, а также являются компонентами сложной системы. Поэтому переложить обработку ошибок на поставщика данных нельзя. Любые входные данные должны обязательно обрабатываться.