@Alex_Gerasimov

Как перейти к конкретной реализации при использовании принципа Dependency inversion?

Принцип заключается в том чтобы вместо конкретных реализаций использовать высокоуровневые абстракции.

Пример:
interface ProductCreatorInterface
{
	public function create();
}

class ProductCreator implements ProductCreatorInterface
{
	public function create()
	{
		return new Product();
	}
}

class ProductController
{
	private $productCreator;

	public function __construct(ProductCreatorInterface $productCreator)
	{
		$this->productCreator = $productCreator;
	}

	public function createAction()
	{
		$this->productCreator->create();
	}
}


Если в контроллере на строчке "$this->productCreator->create();" перейти через IDE к реализации метода create(), то произойдет переход к интерфейсу ProductCreatorInterface, так как он указан в type hint в конструкторе контроллера. То же самое касается и подтягивания документации — она будет подтягиваться из интерфейса, а не из конкретной реализации.

Ну в общем получается не очень удобно — да, я абстрагируюсь от конкретной реализации и могу легко их заменять в случае необходимости, но если нужно перейти и посмотреть какая конкретно используется реализация приходится сначала переходить из кода к интерфейсу, а потом искать где этот интерфейс используется в данный момент.

Задавался ли кто-то таким вопросом и получалось ли его решить?
  • Вопрос задан
  • 124 просмотра
Решения вопроса 1
@Flying
Поскольку вопрос не о выполнении кода, а об IDE - то конкретный ответ будет сильно зависеть от того какая IDE используется и даже от того какой framework используется.

По сути вопрос сводится к умению IDE (самостоятельно или через плагины) доставать информацию относящуюся к runtime'у приложения. А это в свою очередь зависит от того умеет ли конкретное приложение (или framework на котором оно построено) предоставлять эту информацию в виде, который умеет понимать IDE. Если да - будет вам счастье перехода на реально используемые реализации, нет - будете переходить на абстрактные интерфейсы и искать реализацию самостоятельно. В целом здесь начинает хорошо помогать привычка прописывать везде типы через аннотации (в вашем примере этого нет), но, конечно, у этого подхода есть свои минусы т.к. необходимо самому следить чтобы указанные типы совпадали с реальными. Здесь в свою очередь помогают ещё несколько хороших привычек связанных с процессом написания кода, но так можно глубоко забраться в offtopic...

В качестве примера приведу пожалуй PHPStorm в связке с плагином Symfony Support в сценарии работы с Symfony. Поскольку в Symfony DI container является компилируемым и, помимо этого, он генерирует машинно-читаемое представление контейнера - через плагин IDE получает кучу информации о том что там в реальности используется в runtime'е и навигация по коду (а также масса других вещей) становится сильно проще.

Но не всем наборам IDE + framework так везёт, к примеру поддержка приложения на ZF2, которым тоже приходится заниматься, такого не предоставляет, приходится искать всё руками. PHPStorm и здесь, конечно, очень выручает, но со сценарием Symfony конечно не сравнить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dmitriylanets
@dmitriylanets
веб-разработчик
указывайте конкретику в phpdoc и будет вам счастье
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы