Цепочки преобразований

Архитектура последовательной обработки данных

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

Базовый принцип заключается в разделении процессов на три уровня:

  • Парсинг (parse) — преобразование строкового представления в структурированные данные
  • Нормализация (normalize) — приведение данных к внутреннему унифицированному виду
  • Форматирование (format) — преобразование структурированных данных в локализованное представление

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


Концепция цепочки преобразований

Цепочка преобразований в контексте Globalize — это не обязательно синтаксическая конструкция, а логическая модель обработки данных:

input → parse → internal representation → transform → format → output

Каждый шаг использует данные CLDR (Unicode Common Locale Data Repository), обеспечивающие корректность локализации для чисел, дат, валют и единиц измерения.

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


Разделение ответственности этапов

Парсинг как первый слой цепочки

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

  • учет десятичного разделителя
  • учет разделителей тысяч
  • поддержка локальных вариантов записи

На этом этапе данные ещё не пригодны для вычислений, но уже структурированы.


Нормализация как промежуточное звено

После парсинга данные приводятся к стандартному виду. Это позволяет устранить различия между локалями:

  • унификация формата дат в объект Date
  • приведение чисел к IEEE-формату
  • нормализация валютных значений в базовые единицы

Нормализация выступает связующим звеном между локализованным вводом и универсальной внутренней моделью.


Форматирование как финальный этап

Форматирование преобразует нормализованные данные в строку, соответствующую локали:

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

Этот этап зависит от локали и может радикально менять внешний вид результата при одинаковых входных данных.


Цепочки в числовых преобразованиях

Числовые операции демонстрируют базовую модель последовательных преобразований.

Процесс можно представить следующим образом:

"1 234,56" → parseNumber → 1234.56 → математическая операция → formatNumber → "1.234,56"

Каждый этап независим:

  • парсер не знает о форматировании
  • форматтер не знает о парсинге
  • математические операции выполняются только над нормализованным числом

Это позволяет переиспользовать этапы в различных комбинациях.


Цепочки в работе с датами

Работа с датами в Globalize особенно наглядно демонстрирует принцип многоступенчатой обработки:

"31/12/2026" → parseDate → Date → addDays → Date → formatDate → "01.01.2027"

Здесь цепочка включает не только преобразование формата, но и промежуточную трансформацию значения.

Ключевые стадии:

  • интерпретация локализованной строки
  • преобразование в объект Date
  • применение операций (сложение, вычитание, сравнение)
  • обратное форматирование с учетом локали

Цепочки в валютных операциях

Обработка валютных данных включает дополнительные уровни семантики:

"1 000,00 €" → parseCurrency → 1000 → convertCurrency → 1080 → formatCurrency → "1.080,00 $"

Здесь цепочка расширяется за счет этапа конвертации:

  • разбор валютного символа
  • извлечение числового значения
  • применение курса обмена
  • форматирование в целевую валюту

Каждый шаг сохраняет чистоту ответственности и не зависит от локали предыдущего этапа.


Композиция преобразований

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

  • парсинг числа
  • округление
  • вычисление
  • форматирование результата

Пример логической композиции:

formatNumber(
  round(
    convert(
      parseNumber(input)
    )
  )
)

Несмотря на вложенность, каждый уровень остаётся независимым модулем.


Промежуточные представления данных

Ключевым элементом цепочек является промежуточное представление, которое не зависит от локали. Оно обеспечивает:

  • стабильность вычислений
  • предсказуемость преобразований
  • повторное использование результатов

Такие представления включают:

  • числа в формате IEEE 754
  • даты как timestamp или Date объект
  • валюты как числовые значения с кодом валюты отдельно

Локаль как параметр цепочки

Локаль не является частью данных, она становится параметром каждого этапа цепочки:

  • влияет на парсинг (разделители)
  • влияет на форматирование (вывод)
  • не влияет на внутренние вычисления

Это разделение позволяет выполнять одинаковые операции над данными независимо от региона, изменяя только финальное представление.


Ошибки разрыва цепочки

Нарушение последовательности преобразований приводит к некорректным результатам:

  • попытка форматировать непарсенные строки
  • выполнение операций над локализованными строками
  • смешивание локалей в промежуточных данных

Такие ошибки возникают при пропуске этапа нормализации, когда данные не приводятся к единому виду перед вычислениями.


Расширяемость цепочек

Цепочки преобразований в Globalize могут быть расширены дополнительными этапами:

  • валидация входных данных
  • кастомные преобразования
  • постобработка результата

Пример расширенной цепочки:

input → validate → parse → normalize → transform → round → format → output

Каждый дополнительный шаг не нарушает структуру, а лишь вставляется в существующий поток обработки.


Параллельные цепочки обработки

В сложных сценариях данные могут проходить несколько цепочек одновременно:

  • одна цепочка для отображения пользователю
  • другая для вычислений
  • третья для логирования

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


Стабильность результатов в цепочках

Последовательная модель обработки обеспечивает детерминированность:

  • одинаковый вход всегда даёт одинаковый результат
  • независимость от порядка форматирования
  • изоляция вычислений от локали

Это особенно важно при обработке финансовых и временных данных, где точность и повторяемость критичны.