Контест Senior Laravel: контейнер и очереди обновлено

Свой DI-контейнер с синглтонами

Условие

Реализуйте упрощённый контейнер. Объявления:

  • class Name Dep1 Dep2 ...: конкретный класс и типы параметров его конструктора (может быть без зависимостей);
  • bind Abstract Concrete: при запросе Abstract создавать Concrete;
  • singleton T: для типа T создаётся один экземпляр на всё время работы (если для T нет bind, создаётся сам T).

Каждое созданное новое значение получает глобальный порядковый номер (с 1, в порядке завершения создания: сначала зависимости, потом сам объект). Объект записывается как Class#номер, а если есть зависимости, то Class#номер(dep1,dep2).

Ошибки: ERROR cannot resolve X, если X (после применения bind) не объявлен классом; ERROR circular A -> B -> A, если создание зациклилось (путь из классов от первого запрошенного).

Ввод: n объявлений, затем q запросов типов (по одному на строку).

Пример

5
class Logger
class Mailer Logger
class UserService Mailer Logger
singleton Logger
bind MailerInterface Mailer
4
UserService
UserService
MailerInterface
PaymentGateway
UserService#3(Mailer#2(Logger#1),Logger#1)
UserService#5(Mailer#4(Logger#1),Logger#1)
Mailer#6(Logger#1)
ERROR cannot resolve PaymentGateway

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.