Статьи

Первоклассная система типов процедур для композиции

Это первая статья в серии, посвященная системе типов Inversion of Coupling Control. Серия покажет, как полученная система типов позволяет легко составлять. Это позволяет избежать значительной сложности функциональной / объектно-ориентированной композиции. Результирующая система типов и ее итоговая композиция достаточно просты даже для начинающих разработчиков.

Первоклассная процедура

В этой статье мы рассмотрим систему типов и состав процедур первого класса .

Ранее мы говорили о матрице ОО и о том, как метод (и в этом отношении функция) страдает от связи. Мы также обсудили, как эта связь может быть уменьшена с помощью инверсии управления сцеплением . Мы также показали, как эти перевернутые методы / функции можно легко объединить . Мы даже видели, как индустрия движется к этим концепциям с помощью микросервисов .

То, что мы еще не обсуждали, это система типов и композиция, доступные в Первоклассных Процедурах.

Чтобы обсудить это, давайте начнем с хорошо известной концепции внедрения зависимостей.

Внедрение зависимости

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

  • Поле (или параметр конструктора) для внедрения зависимости (предоставляя имя зависимости — например, имя поля)
  • Тип зависимости
  • Необязательный квалификатор (различает зависимости одного типа)

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

Продолжение впрыска

Внедрение продолжения сводит вызов функции / метода к такому же простому набору атрибутов, как Внедрение зависимости.

Поскольку может быть передан только один параметр (остальные являются зависимыми), требуется только один тип. Это необязательный тип параметра.

Кроме того, продолжения от Первоклассной Процедуры все названы.

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

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

Следовательно, каждое требуемое продолжение с помощью процедуры первого класса описывается следующими метаданными:

  • Наименование продолжения
  • Тип параметра для продолжения (т.е. тип аргумента, отправляемого в продолжение)

Обратите внимание, что исключения из метода / функции также моделируются как продолжения. Тип является типом исключения. Имя — это имя типа исключения.

Первоклассная система типов процедур

Соединяя метаданные Continuction Injection с метаданными Dependency Injection, мы получаем следующую информацию о метаданных (тип) для процедуры первого класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
FirstClassProcedureType {
    Class<?> parameterType;
    ContinuationType[] continuations;
    DependencyType[] dependencies;
}
 
ContinuationType {
    String name;
    Class<?> argumentType;
}
 
DependencyType {
    String name;
    Class<?> objectType;
    String qualifier;
}

Приведенный выше тип может описывать все процедуры первого класса. Поскольку для метода / функции требуются параметры, они описываются списком DependencyType. Поскольку метод / функции требуют вызова другого метода / функции, это описывается списком ContinuationType. Поскольку в процедуре первого класса есть только один параметр, тип параметра описывает тип аргумента, который должен быть предоставлен путем вызова ContinuationType.

Обратите внимание, что мы не обсуждали тип ввода Thread Injection. На самом деле это происходит из списка DependencyType путем сопоставления типа объекта с пулом потоков. См. Thread Injection для получения дополнительной информации.

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

Первоклассная процедура составления

Состав процедур первого класса ориентирован на соединение продолжений. Внедрение зависимостей обеспечивает объекты (состояние) для методов / функций. Это подключение зависимостей выполняется отдельно от продолжений. Поэтому нам нужно только сосредоточиться на том, чтобы продолжения были подключены к их первоклассным процедурам обслуживания.

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

Поэтому мы смотрим на Первоклассную Процедуру следующим образом:

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

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

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

Резюме

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

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

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

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

Смотрите оригинальную статью здесь: Первоклассная система типов процедур для композиции

Мнения, высказанные участниками Java Code Geeks, являются их собственными.