Pregunta

Digamos que me estoy construyendo una Magento 2 extensión que hace....bueno...no es importante.Digamos que lo hace super cosas increíbles.
Pero quiero asegurarme de que esta construcción es el uso de los estándares apropiados para que otros desarrolladores pueden extender.

Cuando debo usar el DI en combinaciones con interfaces y cuando no debería?
Para aclarar aquí es un núcleo ejemplo.

La clase Magento\Core\Helper\Data tiene un constructor 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;
}

Mi pregunta se centra en la var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig (Sé que hay otros en el mismo constructor, pero una explicación que se ajuste a todos los casos, creo).

De acuerdo a la di.xml desde el módulo principal de la var será una instancia de Magento\Framework\App\Config:

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

pero se puede cambiar fácilmente que si me necesita.

Cuando debo usar interfaces como que en mi código?
He creado esta incompleta ejemplo de módulo de (perdón por la publicidad), a los que yo he utilizado estas interfaces, pero todos ellos vienen desde el núcleo.Yo no he creado uno propio.Debo?

¿Fue útil?

Solución

En mi humilde opinión, que no es un Mage2 pregunta específica, más en general, "Cuando el uso de interfaces".Eso depende de donde usted quiere que alguien sea capaz de ampliar su extensión.Yo diría que en todas partes donde se trabaja con la lógica de negocio, que puede cambiar.;) Además de que los objetos sin comportamiento (por ejemplo,simples objetos de datos) por lo general no va a cambiar.

Si quieres ser 100% flexible, de alguna manera tienes que utilizar interfaces en todas partes.Pero no quiero sobre-ingeniería.A mi personalmente también me gusta http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx como introducción cuando es realmente útil.

Otros consejos

Magento2 promover el uso de SÓLIDO principios.

La dependencia principio de la inversión directa, dice, que el código debe depender de abstracciones (interfaces).

La interfaz de la segregación principio dice que muchos de cliente de interfaces específicas son mejor que uno de propósito general de la interfaz.Las clases también se puede definir la interfaz protegida, por lo que las interfaces más preferible desde un punto de vista arquitectónico.

También PHP no admiten la herencia múltiple de clases, pero el apoyo de múltiples implementación de interfaces.Que es un punto más para las interfaces.

Así, una simple regla puede ser utilizado: si usted no sabe qué utilizar SIEMPRE el uso de interfaces.

PS.El rendimiento no es razón para que yo no uso de interfaces

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top