Для некоторых наших интеграций у нас есть довольно «шаблонные» реализации в нашей кодовой базе, которые можно удобно поместить в шаблон «канал и фильтр», ИМХО.
«Компоненты» могут выглядеть следующим образом:
class Component1<In, Out, Xin, Xout>
class Component2<Xin, Xout, Yin, Yout>
class Component3<Yin, Yout> // only has 2 params but could be <Yin, Yout, None, None> for a custom 'None' type
Идея состоит в том, чтобы иметь что-то, что позволит им быть «привязанными», чтобы сделать что-то вроде этого:
const c1 = new Component1<A,B,C,D>(...) //perhaps pass the param types in constructor? Other options?
const c2 = new Component2<C,D,E,F>(...)
const c3 = new Component3<E,F, None, None>(...)
const chain = c1.andThen(c2).andThen(c3) // The "last" item in the chain would "always" be a component of type <X,Y, None, None>
chain.run() // Not sure if this is needed but to make it clear that something "runs" this chain
Я не могу придумать какой-либо «общий» способ создания этих компонентов, где эта цепочка может быть «определена» во время компиляции, чтобы ограничить, какие компоненты могут быть связаны с другими (т. Е. Типы ввода/вывода должны совпадать). Таким образом, за c1
может следовать только c2
, но не c3
, но после c3
ничего не может быть сцеплено.
Это вообще возможно? Что-нибудь, чтобы получить это достаточно близко?
(Для любознательных: попытка добиться аналогичной «композитивности», которую Finagle предлагает в мире Scala)