Извините за плохой заголовок, но если бы я знал класс проблем, над которыми я работал, возможно, я мог бы найти ответ.
В идеальной ситуации создается объект со всеми необходимыми зависимостями, а затем используется предмет. Однако в некоторых случаях информация, необходимая для создания зависимости, не известна до того, как объект будет использован.
Я попытаюсь создать конкретный пример, связанный с постройкой дома. Ниже перечислены зависимости
class WallMakerAlgorithm(abc.ABC):
def build(self):
# Put specific algorithm here that will build the wall
pass
class DoorMakerAlgorithm(abc.ABC):
def __init__(self, color: float, material: str):
# subclasses can override init to add more fancy stuff
self.color = color
self.material = material
def build(self):
# Put specific algorithm here that will build the door
pass
Они используются классом строителя дома. В идеальном случае HouseBuilder
будет знать свои зависимости от init:
class BasicHouseBuilder:
def __init__(self, door_maker_algorithm: DoorMakerAlgorithm, wall_maker_algorithm: WallMakerAlgorithm):
self.door_maker_algorithm = door_maker_algorithm
self.wall_maker_algorithm = wall_maker_algorithm
def build(self):
self.wall_maker_algorithm.build()
self.door_maker_algorithm.build()
Но теперь предположим, что по какой-то (надуманной) причине заказчик не определился с цветом дверей. Они говорят вам, что как только стена будет построена, они будут знать цвет, потому что они смогут его видеть. Это создает проблему типа курицы и яйца. Я не могу создать HouseBuilder
, потому что я не могу создать алгоритм создания двери, и я не могу создать алгоритм создания двери, не запустив на самом деле HouseBuilder
. Примерно так:
class DecideColorLaterHouseBuilder:
def __self__(self, wall_maker_algorithm: WallMakerAlgorithm, query_color: Callbale, ???):
self.wall_maker_algorithm = wall_maker_algorithm
self.query_color = query_color
???
def build(self):
self.wall_maker_algorithm.build()
desired_door_color = self.query_color()
# Now I want to build the door. But I don't have the door algorithm because I don't know the color!
Есть ли какой-нибудь шаблон проектирования, который решает такие проблемы? Мои абстракции вообще испорчены? Я потенциально могу добавить color
в качестве аргумента к build
из DoorMakingAlgorithm
, но это просто испортит мои абстракции.