Ваш подход в порядке. У вас есть набор классов инструментов, каждый из которых должен знать свою цель. Затем у вас есть класс инструментария, который координирует эти инструменты для конкретной цели.
class AgreePrice:
def __init__(self, connection): ...
class PlaceOrder:
def __init__(self, connection): ...
class ConfirmAvailability:
def __init__(self, connection): ...
class BookingService:
def __init__(self, connection): ...
def book(self):
for Command in (ConfirmAvailability, AgreePrice, PlaceOrder):
command = Command(self.connection)
command.run()
assert command.success()
В таких классовых структурах нет ничего плохого, на самом деле они появляются все время и представляют собой достаточно хороший дизайн, когда отдельные классы инструмента не могут быть удобно размещены в одной функции.
Если вы когда-нибудь окажетесь в классе с десятками методов, многие из которых можно сгруппировать в соответствии с конкретными задачами, это хороший рефакторинг.
Как правило, вы хотите убедиться, что ваши классы "инструмента" (SearchScreen
и т. Д.) Находятся на концептуально более низком уровне, чем ваш контроллер (ваши тестовые примеры). Какие они для тебя.
Простейшие классы этих инструментов являются формой шаблона проектирования Object Object . Хотя в вашем случае вы вызываете более одного метода для каждого объекта, они немного сложнее.
Или, короче говоря. Ваш дизайн в порядке и очень распространен.