Это первая статья в серии, посвященная системам типа Inversion of Coupling Control. Серия покажет, как полученная система типов позволяет легко составлять. Это позволяет нам избежать значительной сложности функциональной / объектно-ориентированной композиции.
В этой серии четыре статьи:
- В этой статье обсуждается система типов процедур первого класса
- Первоклассный модуль
- Демонстрационное приложение.
- Основная теоретическая модель для композиции.
Первоклассная процедура
В этой статье мы рассмотрим систему типов и состав процедур первого класса .
Ранее мы уже говорили о матрице ОО и о том, как метод (и в этом отношении функция) страдает от связи. Мы также обсудили, как эта связь может быть уменьшена с помощью инверсии управления сцеплением . Мы также показали, как эти перевернутые методы / функции можно легко объединить . Мы даже видели, как индустрия движется к этим концепциям с помощью микросервисов .
То, что мы еще не обсуждали, это система типов и композиция, доступные в Первоклассных Процедурах.
Чтобы обсудить это, давайте начнем с хорошо известной концепции внедрения зависимостей.
Вам также может понравиться:
Локальные микросервисы: первоклассные процедуры .
Внедрение зависимости
Метаданные внедрения зависимостей описывают список зависимостей со следующими тремя атрибутами:
- Поле (или параметр конструктора) для внедрения зависимости (предоставляя имя зависимости — например, имя поля)
- Тип зависимости
- Необязательный квалификатор (различает зависимости одного типа)
С помощью этой информации может быть выполнено сопоставление с зависимостями. Обратите внимание, что в некоторых структурах внедрения зависимостей есть улучшения. Тем не менее, приведенные выше метаданные, как правило, адекватны для авто-зависимостей объекта
Продолжение впрыска
Внедрение продолжения сводит вызов функции / метода к такому же простому набору атрибутов (аналогично внедрению зависимости).
Поскольку может быть передан только один параметр (остальные являются зависимыми), требуется только один тип. Это необязательный тип параметра. Кроме того, продолжения от Первоклассной Процедуры все названы.
Обратите внимание, что автоматическое продолжение считается подверженным ошибкам. Для автоматического подключения продолжения к процедурам первого класса требуются разные типы параметров для каждого продолжения в системе. На практике большую часть времени это те же самые простые типы данных предметной области, которые передаются. Таким образом, вам в конечном итоге придется квалифицировать каждое продолжение.
Кроме того, квалификационные продолжения обеспечивают небольшое улучшение в снижении сложности. При квалификации всех продолжений вы заканчиваете тем, что пишете конфигурации для каждого продолжения. Другими словами, вы в конечном итоге предоставляете сопоставление каждого имени продолжения с обслуживанием процедуры первого класса. Эта конфигурация очень подвержена ошибкам. Мы покажем, как это делается менее подверженным ошибкам и может быть легко понятным в ближайшее время.
Следовательно, каждое требуемое продолжение с помощью процедуры первого класса описывается следующими метаданными:
- Название продолжения.
- Тип параметра для продолжения (т.е. тип аргумента, отправляемого в продолжение).
Обратите внимание, что исключения из метода / функции также моделируются как продолжения. Тип является типом исключения. Имя — это имя типа исключения.
Первоклассная система типов процедур
Соединяя метаданные Continuction Injection с метаданными Dependency Injection, мы получаем следующую информацию о метаданных (тип) для процедуры первого класса:
Джава
1
FirstClassProcedureType {
2
Class<?> parameterType;
3
ContinuationType[] continuations;
4
DependencyType[] dependencies;
5
}
6
ContinuationType {
8
String name;
9
Class<?> argumentType;
10
}
11
DependencyType {
13
String name;
14
Class<?> objectType;
15
String qualifier;
16
}
Приведенный выше тип может описывать все процедуры первого класса. Поскольку для метода / функции требуются параметры, они описаны в DependencyType
листинге. Поскольку метод / функции требуют вызова других методов / функций, это описано в ContinuationType
листинге. Поскольку в процедуре первого класса есть только один параметр, тип параметра описывает тип аргумента, который должен быть предоставлен вызовом ContinuationType
.
Обратите внимание, что мы не обсуждали тип ввода Thread Injection. На самом деле это происходит из DependencyType
листинга путем сопоставления типа объекта с пулом потоков. См. Thread Injection для получения дополнительной информации.
Поскольку теперь мы можем печатать Первоклассную Процедуру, мы можем рассмотреть использование этой системы типов для композиции.
Первоклассная процедура составления
Состав процедур первого класса ориентирован на продолжение проводки вместе. Внедрение зависимостей обеспечивает объекты (состояние) для методов / функций. Эта разводка зависимостей делается отдельно от продолжений. Поэтому нам нужно только сосредоточиться на продолжениях, связанных с обслуживанием их первоклассных процедур.
Теперь это можно сделать в коде и даже в файлах конфигурации. Однако по мере усложнения системы эта жестко заданная спецификация имени продолжения для обслуживания процедур первого класса становится очень громоздкой. Попытка расшифровать поведение системы из списков связей становится очень сложной.
Поэтому мы смотрим на Первоклассную Процедуру следующим образом:
- Узел обработки с входным якорем.
- Различное количество выходных якорей для каждого из его продолжений.
- Linkages as lines from the output anchor to input anchor.
This representation makes for a graphical configuration of the composition. The First-Class Procedure is defined by nodes in the graph with lines representing the continuations between them. Therefore, the composition of First-Class Procedures is quite literally drawing lines between them.
As the graphical configuration is easy to comprehend visually, it makes it very easy for other developers to understand the application.
Summary
We have demonstrated how Continuation Injection simplifies the invocation of methods/functions. This simple meta-data model for Continuation Injection is similar to Dependency Injections for objects.
This simple meta-data enables a type system for First-Class Procedures. This type system enables the graphical composition of First-Class Procedures.
The next article will discuss how the First-Class Procedure type system is actually made more general to enable modularising of the application. However, these modules still maintain a similar type system for inclusion in the graphical configuration.