Supervisor создаёт два конкретных worker и последовательно вызывает process. Внедрение списка исполнителей через конструктор убирает жёсткую привязку и позволяет подставлять тестовые реализации.
Оптимизация взаимодействия менеджера с рабочими объектами
Supervisor создаёт два конкретных worker и последовательно вызывает process. Внедрение списка исполнителей через конструктор убирает жёсткую привязку и позволяет подставлять тестовые реализации.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вопрос: что делает представленный фрагмент и какие способы его улучшения возможны? В коде класс Supervisor (ранее Manager) создаёт два рабочих экземпляра — WorkerA и WorkerB (ранее Worker1 и Worker2) — и последовательно вызывает у каждого из них метод process. Нужно проанализировать текущую реализацию и предложить варианты повышения читаемости, расширяемости и тестируемости кода.
class WorkerA:
def __init__(self):
pass
def process(self):
pass
class WorkerB:
def __init__(self):
pass
def process(self):
pass
class Supervisor:
def __init__(self):
self.w1 = WorkerA()
self.w2 = WorkerB()
def run_jobs(self):
for w in (self.w1, self.w2):
w.process()
s = Supervisor()
s.run_jobs()
Ответ
Supervisor создаёт два конкретных worker и последовательно вызывает process. Внедрение списка исполнителей через конструктор убирает жёсткую привязку и позволяет подставлять тестовые реализации.
Пример композиции:
class Supervisor:
def __init__(self, workers):
self.workers = tuple(workers)
def run_jobs(self):
for worker in self.workers:
worker.process()
supervisor = Supervisor([WorkerA(), WorkerB()])
supervisor.run_jobs()
Пустые init в worker можно убрать. Общий process выражается через Protocol/ABC или обычную duck typing. Нужно явно решить, останавливает ли ошибка одного worker остальные. Параллельный запуск не является автоматическим улучшением: он может изменить порядок и нарушить зависимости между работами.