AbstractFactory и принцип подстановки Лискова

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

Моя первоначальная реализация заключалась в создании абстрактного класса для каждого шага:

class AbstractStep1(metaclass=ABCMeta):
    @abstractmethod
    def process(common_input) -> "AbstractStep1Output":
        pass

class AbstractStep2(metaclass=ABCMeta):
    @abstractmethod
    def process(input: "AbstractStep1Output") -> "AbstractStep2Output":
        pass

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

class Type1Step1(AbstractStep1):
    def process(common_input) -> "Type1Step1Output":
        # implementation

class Type1Step2(AbstractStep2):
    def process(input: "Type1Step1Output") -> "Type1Step2Output":
        # implementation

Обратите внимание, что выходные данные каждого шага имеют определенный тип.

Потом я использовал mypy и получил много ошибок о нарушении "принципа подстановки Лискова". Читая об этом, я столкнулся с паттерном AbstractFactory. Это выглядело как хорошее совпадение, но потом я запутался в наследовании / интерфейсе. Даже если бы я создал абстрактную фабрику, которая создает все экземпляры шагов, какие типы я должен указать в сигнатурах функций шага?

С одной стороны, технологический метод Type1Step2 может работать только с выходом Type1Step1, с другой стороны, изменение сигнатуры функции нарушает принцип подстановки Лискова.

Если бы я избавился от абстракции, что бы сохранило структуру шагов? Моя главная цель - иметь:

factory = Type1Factory()
step1 = factory.get_step_1()
step1_output = step1.process(common_input)
step2 = factory.get_step_2()
step2_output = step2.process(step1_output) # note that step2 of specific type can only work with step1_output of the SAME type

Любая помощь будет высоко ценится!

Спасибо

0 ответов

Другие вопросы по тегам