Процессор расчетов.


Инструментальная платформа ЭКСПРЕСС

Большой спектр задач решаемых при помощи программных систем можно отнести к классу расчетных. То есть, для решения такой задачи существует полное описание алгоритма преобразования исходных данных в результирующую информацию. Ярким примером такой задачи является расчет заработной платы. Что характерно для этой задачи, и какие проблемы обычно встают у разработчиков прикладных программ:

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

-          Привязка к временной шкале. Как правило, задачи оперируют данными за некоторый период времени, в течение которого эти данные могли меняться

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

-          Частая смена алгоритма расчета. Это особенность больше характеризует устойчивость российской законодательной базы. Большая подвижность нормативных документов порождает постоянные изменения в алгоритмах расчета зарплаты, что в свою очередь предъявляет требования к корректировке программных систем.

 

Другими словами программная система, предназначенная для решения расчетных задач, должна обладать следующими свойствами:

-          декомпозированный алгоритм

-          сквозной учет временной шкалы при расчетах

-          возможность наглядного анализа пошагового расчета

-          гибкая настройка алгоритма расчета вне программного кода

 

Все это становиться возможным при применении модели графа расчета. Граф расчета – это множество узлов расчета с направленными связями. Связи между узлами называются связями передачи данных. Эти связи отражают зависимость расчета одних узлов от результатов других, и показывают направление передачи результатов расчета одних узлов к другим. Например, для описания алгоритма «Сумма на руки = Начисления – Удержания » можно сформировать следующий граф:

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

-          выполнить алгоритм преобразования входных данных и сохранить на выходе

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

 

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

 

 

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

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

 

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

 

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

 

Таким образом можно сделать вывод, модель графа расчета позволяет решить несколько коренных проблем сложных расчетных задач:

-          управление сложностью

-          наглядное представление результатов расчета, включая промежуточные

-          поддержка временной шкалы

-          независимость реализации от программного кода