Допустим, я создаю расширение для 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 продвигает использование принципов SOLID .
Принцип прямого обращения зависимостей говорит, что код должен зависеть от абстракций (интерфейсов).
Принцип разделения интерфейса говорит о том, что многие клиентские интерфейсы лучше, чем один универсальный интерфейс. Классы также могут определять защищенный интерфейс, поэтому интерфейсы более предпочтительны с архитектурной точки зрения.
Также PHP не поддерживает множественное наследование классов, но поддерживает множественную реализацию интерфейсов. Это еще один момент для интерфейсов.
Таким образом, можно использовать простое правило: если вы не знаете, что использовать, ВСЕГДА используйте интерфейсы .
PS. Производительность это не причина для меня, чтобы не использовать интерфейсы
источник