Добро пожаловать в документацию function-tools

FunctionTools - это библиотека вспомогательных классов для реализации Функций системы.

Договоримся
Необходимо различать функции - объект Python и бизнес-функцию. В тех местах, где речь будет вестить про Python-функции - они будут написаны с маленькой буквы - функции, про бизнес-функции с большой буквы - Функции.

Если обобщо, то система представляет из себя хранилище данных и функционал, который каким-то образом изменяет данные, при этом достигая ожидаего результата описанного в бизнес требованиях. Таким образом, Функции - это ядро системы и необходимо уделять пристальное внимание тому, как Функции реализованы в системе.

В большинстве случаев Функции имеют следующие признаки:

  • Реализованы в виде функций длинной не влазящик ни в один экран монитора;
  • Имеют запутанный код с множеством условных конструкций (умеренное количество допустимо);
  • Взаимодействие с базой данных выстроено таким образом, как будто вся база данных хранится в оперативной памяти и нет необходимости заботиться о количестве запросов и их оптимальности;
  • Наименование функций и названий переменных сокращено настолько, что для понимания кода иногда не хватает простого прочтения и возникает необходимость дебага. Часто это дополнятся размером функций, когда в середине не помнишь, что было в начале.
  • Высокая когнитивная нагрузка связанная со сложностью реализации и правилами, для которых нет описания, но они имеют фундаментальное значение в работе Функций.
  • Низкий уровень самодокументируемости кода из-за плохой его декомпозиции;
  • Перегруженность функций действиями, которые являются вспомогательными и никак не отражают реализованные бизнес требования.
  • Отсутствие валидации входных данных и данных при выполнении функции, что позволяет потенциально испортить данные;
  • Кеширование данных для работы функции часто замешано код функции;
  • Большая вариативность реализаций Функций, что не позволят однозначно найти причину ошибки при ее возникновении в виде Инцидента или Бага (если конечно не сам сегодня эту ошибку совершил).

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

Упрощенная диаграмма классов представлена на Рисунке 1.

Рисунок 1

Рисунок 1

Основные компоненты:

Cache
Кеш объектов некоторой указанной сущности. Служит для однократной выборки данных и дальнейшего их использования в рамках функции (Function).
StorageCache
Хранилище кешей. Состоит из кешей и используется для более удобного хранения и доступа к ним.
Helper
Помощник запускаемого объекта. Содержит вспомогательные функции, кеш.
Validator
Валидатор данных. Имеется у Пускателя и Функции.
Function
Функция, приближенная к бизнес-функции. Имеет помощника и выполняет действия согласно безнес требований.
Runner
Пускатель. Умеет запускать как одинчные функции, так и цепочные функции представленные в виде пускателей.
RunnerManager
Менеджер пускателя. Отвечает за создание функций и пускателей и дальнейший их запуск.
Error
Ошибка, возникающая в процессе работы.
Result
Результат исполнения запускаемого объекта.
ResultPresenter
Презентер результата исполнения запускаемого объекта.

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

Алгоритм работы Функции выглядит следующим образом:

  1. Создается пускатель;
  2. Создаются функции и пускатели, которые добавляются в очередь на исполнение пускателю;
  3. Функции и пускатели создают помощников, которые в свою очередь создают хранилища кешей;
  4. Перед запуском выполняемых объектов производится валидация на уровне пускателя;
  5. Производится запуск функций;
  6. После завершения работы выполняемых объектов и, соответственно, пускателя, производится вывод результата работы пользователю в необходимом виде.

Подробная актуальная диаграммка классов представлена на Рисунке 2.

Рисунок 2

Рисунок 2

Актуальные диаграммы с кратким описанием можно найти в Confluence

Подробное описание компонентов можно найти по ссылкам: