Digamos que eu estou construindo uma extensão Magento 2 que faz ... bem ... não é importante. Digamos que ele faça coisas super impressionantes.
Mas quero garantir que isso seja construído usando os padrões adequados para que outros desenvolvedores possam estendê-lo.
Quando devo usar o DI em combinações com interfaces e quando não devo?
Para deixar claro aqui, é um exemplo central.
A classe Magento\Core\Helper\Data
tem um construtor como este:
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;
}
Minha pergunta está focada no var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
(eu sei que existem outros no mesmo construtor, mas uma explicação será adequada para todos os casos, eu acho).
De acordo com o di.xml
módulo principal, o var será uma instância de Magento\Framework\App\Config
:
<preference for="Magento\Framework\App\Config\ScopeConfigInterface" type="Magento\Framework\App\Config" />
mas posso mudar isso facilmente, se precisar.
Quando devo usar interfaces como essa no meu código?
Criei este módulo de amostra incompleto (desculpe pela publicidade), onde usei essas interfaces, mas todas elas vêm do núcleo. Eu não criei um dos meus. Eu devo?
Respostas:
Imho que não é uma pergunta específica do Mage2, mais geralmente "Quando usar interfaces". Isso depende de onde você deseja que alguém possa estender sua extensão. Eu diria em todos os lugares onde você trabalha com a lógica de negócios, o que pode mudar. ;) Além disso, objetos sem comportamento (por exemplo, objetos de dados simples) geralmente não mudam.
Se você quer ser 100% flexível, de alguma forma precisa usar interfaces em qualquer lugar. Mas eu não exageraria. Pessoalmente, também gosto de http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx como uma introdução quando é realmente útil.
fonte
Magento2 promove o uso dos princípios do SOLID .
O princípio da inversão de dependência diz diretamente que o código deve depender de abstrações (interfaces).
O princípio de segregação de interface diz que muitas interfaces específicas do cliente são melhores que uma interface de uso geral. As classes também podem definir a interface protegida, portanto, as interfaces são mais preferidas do ponto de vista arquitetural.
Além disso, o PHP não suporta herança múltipla de classes, mas suporta implementação múltipla de interfaces. Esse é mais um ponto para interfaces.
Portanto, uma regra simples pode ser usada: se você não souber o que usar, SEMPRE use interfaces .
PS. Desempenho, não é motivo para eu não usar interfaces
fonte