Frage

Nehmen wir an, ich baue eine Magento 2-Erweiterung, die dies tut....gut...nicht wichtig.Sagen wir, es macht super tolle Sachen.
Aber ich möchte sicherstellen, dass dies nach den richtigen Standards erstellt wird, damit andere Entwickler es erweitern können.

Wann sollte ich die DI in Kombination mit Schnittstellen verwenden und wann nicht?
Um es hier deutlich zu machen, ist ein Kernbeispiel.

Klasse Magento\Core\Helper\Data hat einen Konstruktor wie diesen:

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

Meine Frage konzentriert sich auf den var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig (Ich weiß, dass es andere im selben Konstruktor gibt, aber eine Erklärung passt zu allen Fällen, denke ich).

Nach dem di.xml aus dem Kernmodul wird die Variable eine Instanz von sein Magento\Framework\App\Config:

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

aber ich kann das leicht ändern, wenn ich es brauche.

Wann sollte ich solche Schnittstellen in meinem Code verwenden?
Ich habe das unvollständig erstellt beispielmodul (entschuldigung für die Werbung), wo ich solche Schnittstellen verwendet habe, aber alle stammen aus dem Kern.Ich habe keinen eigenen geschaffen.Sollte ich?

War es hilfreich?

Lösung

Imho ist das keine Mage2-spezifische Frage, allgemeiner "Wann Schnittstellen zu verwenden sind".Das hängt davon ab, wo Sie möchten, dass jemand Ihre Erweiterung erweitern kann.Ich würde sagen, überall dort, wo Sie mit Geschäftslogik arbeiten, was sich ändern könnte.;) Außerdem können Objekte ohne Verhalten (z.b. einfache Datenobjekte) ändert sich normalerweise nicht.

Wenn man 100% flexibel sein will, muss man irgendwie überall Schnittstellen nutzen.Aber ich würde es nicht übertreiben.Ich persönlich mag auch http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx als Einführung, wenn es tatsächlich nützlich ist.

Andere Tipps

Magento2 fördert die Verwendung von SOLIDE Grundsatz.

Abhängigkeitsinversionsprinzip direkt sagt, dass Code von Abstraktionen (Schnittstellen) abhängen sollte.

Schnittstellentrennungsprinzip besagt, dass viele kundenspezifische Schnittstellen besser sind als eine allgemeine Schnittstelle.Klassen können auch geschützte Schnittstellen definieren, daher sind die Schnittstellen aus architektonischer Sicht bevorzugter.

Auch PHP unterstützt keine Mehrfachvererbung von Klassen, sondern unterstützt mehrere Implementierungen von Schnittstellen.Das ist ein weiterer Punkt für Schnittstellen.

So kann eine einfache Regel verwendet werden: wenn Sie nicht wissen, was Sie verwenden sollen, verwenden Sie IMMER Schnittstellen.

PS.Leistung Es ist kein Grund für mich, keine Schnittstellen zu verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top