Тип-безопасный двухэтапная вычислительная трубопроводов


У меня есть несколько "расчет трубопроводов", которые разделяют те же цели и количество шагов, даже если на шаге реализации и классам промежуточные значения, которые передаются между ними различны для каждого трубопровода. Например, они могут быть

$$ и \caption{ПТР}[1]{\вытесненным{\mathtt{#1}}{\longrightarrow}} \texttt{запрос} \ПТР{Шаг 1} а \ПТР{действие 2} \texttt{ответ} $$

или

$$ \texttt{запрос} \ПТР{Шаг 1} Б \ПТР{действие 2} \texttt{ответ} $$

Начало и конец трубопровода всегда одинаковы.

Я хочу, чтобы избежать дублирования общих "интерстициальный код" между шагами, которые могут делать такие вещи, как ведение журнала или обработка ошибок. Я также хочу убедиться, что:

  • Наследование реализации не используется. Это исключает "метод шаблона" шаблон.
  • Безопасность типов поддерживается, в том смысле, что шаг реализации не должны потупив промежуточное значение в любой точке.

Я придумал следующее решение. Во-первых, универсальный Pipeline интерфейс, настраиваемые с типом промежуточных значений и с одного метода на каждом шаге:

public interface Pipeline<A> {

    A step1(Request request);

    Response step2(A intermediate);
}

Во-вторых, Runner класс, который не знает точный тип промежуточных шагов:

public final class Runner {

    private final Pipeline<?> pipeline;

    public Runner(Pipeline<?> pipeline) {
        super();
        this.pipeline = pipeline;
    }

    public Response runPipeline(Request request) {
        // This doesn't fly, wildcard trouble  
        // return pipeline.step2(pipeline.step1(request)); 

        // With the helper it works
        return runPipeline(request,pipeline);
    }

    // wildcard capture helper
    public static <A> Response runPipeline(Request request, Pipeline<A> pipeline) {
        A intermediate = pipeline.step1(request);
        //
        // shared interstitial code here 
        //
        return pipeline.step2(intermediate);
    }
}

Есть ли лучший способ сделать это? Это типа решение имеет названия, он используется где-нибудь еще?



106
0
задан 4 марта 2018 в 12:03 Источник Поделиться
Комментарии