Melhores práticas do Magento 2 DI

19

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\Datatem 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.xmlmó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?

Marius
fonte
"Vamos dizer que faz coisas super impressionantes". Ele tem cabeças flutuantes de pessoas que estão online no stackexchange? Porque eu iria instalar isso;)
David Manners
1
@DavidManners Vou tentar portar todas as minhas extensões 1.x para 2.0, para que também sejam portadas. Não sei sobre a parte flutuante, mas vou ver o que posso fazer.
Marius
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.
22414 Tobias
1
@TobiasZander, você quer dizer que eu tenho que criar uma interface para quase TUDO? Porra, isso é muito trabalho.
Marius
@ Marius, se você quiser ser 100% flexível, de alguma forma, sim. Mas eu não exageraria. Eu, pessoalmente, também como odetocode.com/blogs/scott/archive/2009/06/08/... como uma introdução ao que é realmente útil
Tobias

Respostas:

9

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.

Tobias
fonte
7

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

KAndy
fonte
Estou curioso para saber se o uso de interfaces afeta o desempenho de alguma forma?
amitshree
1
A função de chamada de carregamento automático não é gratuita. veja o exemplo: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy