Задать вопрос

Является ли хорошей практикой неявная зависимость без наследования с целью избавиться от дублирования инстансов?

Доброго дня.
Не хочу штамповать инстансы гипотетического класса Depend (например, вычисления при создании инстанса), при этом необходимо, чтобы в нем был доступ к классу Vendor. При этом, инстанс класса Vendor должен быть один на систему, но он не должен быть синглтоном. Vendor используется в нескольких классах, и прежде всего в точке входа - классе Main.

Наследовать Depend от Main избыточно - ведь по смыслу Depend не является зависимым от содержимого Main (кроме свойства, хранящего в себе инстанс Vendor, но наследование не для этого). Придумал такую схему, в которой доступ ко всем так или иначе зависимым классам осуществляется через точку входа (или контейнер с зависимостями, если создать еще один слой), которая передается зависимым классам, чтобы они (зависимые классы) могли получить уже созданный ранее инстанс.

class Main {
    public $Vendor;

    private $Depend;

    public function __construct() {
        $this->Vendor = new Vendor;
        $this->Depend = new Depend($this);
    }
}

class Depend {
    private $Vendor;

    public function __construct(Main $Container) {
        $this->Vendor = $Container->Vendor;
    }
}

class Vendor {
    public function __construct() {}
}

Насколько данное решение хорошо? Не является ли такой подход антипаттерном? Есть ли лучшие альтернативы?

Заранее спасибо.
  • Вопрос задан
  • 195 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dev400
используйте автозагрузку зависимостей, чтобы нужные подтягивались сами.

Я у себя в проекте реализовал такую штуку
/**
     * AccountController constructor.
     * @param ViewInterface $view
     * @param ModelInterface $model
     * @param AuthHandler $authHandler
     * @Dependencies(
     *   'app\Core\View\BaseView',
     *   'src\Models\Auth\AuthModel',
     *   'src\Middleware\Auth\AuthHandler'
     * )
     */
    public function __construct(ViewInterface $view,ModelInterface $model, AuthHandler $authHandler) {

        $this->view = $view;
        $this->model = $model;
        $this->authHandler = $authHandler;

    }


В аннотациях перечисляю зависимости класса, парсер вытаскивает нужные зависимости и кладет в конструктор.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы