Вопрос

Допустим, я создаю расширение для Magento 2, которое… ну… не важно.Допустим, он делает потрясающие вещи.
Но я хочу убедиться, что это построено с использованием надлежащих стандартов, чтобы другие разработчики могли его расширить.

Когда следует использовать DI в сочетании с интерфейсами, а когда нет?
Чтобы прояснить ситуацию, приведем основной пример.

Класс Magento\Core\Helper\Data имеет такой конструктор:

public function __construct(
    \Magento\Framework\App\Helper\Context $context,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Store\Model\StoreManagerInterface $storeManager,
    \Magento\Framework\App\State $appState,
    PriceCurrencyInterface $priceCurrency,
    $dbCompatibleMode = true
) {
    parent::__construct($context);
    $this->_scopeConfig = $scopeConfig;
    $this->_storeManager = $storeManager;
    $this->_appState = $appState;
    $this->_dbCompatibleMode = $dbCompatibleMode;
    $this->_priceCurrency =  $priceCurrency;
}

Мой вопрос сосредоточен на var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig (Я знаю, что в том же конструкторе есть и другие, но я думаю, что одно объяснение подойдет для всех случаев).

Согласно di.xml из основного модуля var будет экземпляром Magento\Framework\App\Config:

<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />

но я могу легко изменить это, если мне нужно.

Когда мне следует использовать подобные интерфейсы в своем коде?
Я создал это неполное образец модуля (извините за рекламу), где я использовал такие интерфейсы, но все они идут из ядра.Я не создал ни одного своего.Нужно ли мне?

Это было полезно?

Решение

Имхо, это не конкретный вопрос Mage2, а более общий вопрос: «Когда использовать интерфейсы».Это зависит от того, где вы хотите, чтобы кто-то мог продлить ваше расширение.Я бы сказал везде, где вы работаете с бизнес-логикой, которая может измениться.;) Помимо этих объектов без поведения (например,простые объекты данных) обычно не меняются.

Если вы хотите быть на 100% гибким, вам придется использовать интерфейсы повсюду.Но я бы не стал переусердствовать.мне лично тоже нравится http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx в качестве введения, когда это действительно полезно.

Другие советы

Magento2 продвигает использование ТВЕРДЫЙ принципы.

Принцип инверсии зависимостей прямо говорит о том, что код должен зависеть от абстракций (интерфейсов).

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

Также PHP не поддерживает множественное наследование классов, но поддерживает множественную реализацию интерфейсов.Это еще один момент для интерфейсов.

Итак, можно использовать простое правило: если вы не знаете, что использовать, ВСЕГДА используйте интерфейсы.

ПС.Производительность — это не причина для меня не использовать интерфейсы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top