Best practice per Magento 2 DI


19

Diciamo che sto costruendo un'estensione Magento 2 che fa ... beh ... non è importante. Diciamo che fa cose super fantastiche.
Ma voglio assicurarmi che questo sia costruito usando gli standard adeguati in modo che altri sviluppatori possano estenderlo.

Quando dovrei usare il DI in combinazione con le interfacce e quando non dovrei?
Per chiarire qui è un esempio fondamentale.

La classe Magento\Core\Helper\Dataha un costruttore come questo:

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;
}

La mia domanda è focalizzata sul var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(so che ce ne sono altri nello stesso costruttore, ma una spiegazione si adatta a tutti i casi che penso).

Secondo il di.xmlmodulo dal core, var sarà un'istanza di Magento\Framework\App\Config:

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

ma posso facilmente cambiarlo se ne ho bisogno.

Quando dovrei usare interfacce del genere nel mio codice?
Ho creato questo modulo di esempio incompleto (mi dispiace per la pubblicità), dove ho usato tali interfacce, ma tutte provengono dal nucleo. Non ne ho creato uno mio. Dovrei?


"Diciamo che fa cose super fantastiche." Ha una testa mobile di persone che sono online in stackexchange? Perché lo installerei;)
David Manners il

1
@DavidManners Proverò a portare tutte le mie estensioni 1.x su 2.0 in modo che vengano portate anche. Non so della parte fluttuante, ma vedrò cosa posso fare.
Marius

Imho che non è una domanda specifica su Mage2, più in generale "Quando usare le interfacce". Dipende da dove vuoi che qualcuno sia in grado di estendere la tua estensione. Direi ovunque dove lavori con la logica aziendale, che potrebbe cambiare. ;) Inoltre gli oggetti senza comportamento (ad es. Semplici oggetti dati) di solito non cambieranno.
Tobias,

1
@TobiasZander, vuoi dire che devo creare un'interfaccia per quasi TUTTO? Accidenti è un sacco di lavoro.
Marius

@Marius, se vuoi essere flessibile al 100%, in qualche modo sì. Ma non lo progetterei troppo. Personalmente mi piace anche odetocode.com/blogs/scott/archive/2009/06/08/… come introduzione quando è effettivamente utile
Tobias,

Risposte:


9

Imho che non è una domanda specifica su Mage2, più in generale "Quando usare le interfacce". Dipende da dove vuoi che qualcuno sia in grado di estendere la tua estensione. Direi ovunque dove lavori con la logica aziendale, che potrebbe cambiare. ;) Inoltre gli oggetti senza comportamento (ad es. Semplici oggetti dati) di solito non cambieranno.

Se vuoi essere flessibile al 100%, in qualche modo devi usare le interfacce ovunque. Ma non lo progetterei troppo. Personalmente mi piace anche http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx come introduzione quando è effettivamente utile.


7

Magento2 promuove l'utilizzo dei principi SOLID .

Il principio di inversione di dipendenza dice direttamente che il codice dovrebbe dipendere da astrazioni (interfacce).

Il principio di segregazione dell'interfaccia afferma che molte interfacce specifiche del client sono migliori di un'interfaccia per tutti gli usi. Le classi possono anche definire un'interfaccia protetta, quindi le interfacce più preferite dal punto di vista architettonico.

Inoltre PHP non supporta l'ereditarietà multipla delle classi, ma supporta l'implementazione multipla delle interfacce. Questo è un altro punto per le interfacce.

Pertanto, è possibile utilizzare una semplice regola: se non si sa cosa utilizzare, utilizzare SEMPRE le interfacce .

PS. Le prestazioni non sono motivo per me di non usare le interfacce


Sono curioso di sapere se l'uso delle interfacce influisce in qualche modo sulle prestazioni?
entro l'

1
La chiamata della funzione di caricamento automatico non è gratuita. vedi esempio: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.