Magento 2 DI praktik terbaik

19

Katakanlah saya sedang membangun ekstensi Magento 2 yang tidak .... well ... tidak penting. Katakanlah itu melakukan hal-hal yang luar biasa.
Tapi saya ingin memastikan bahwa ini dibangun menggunakan standar yang tepat sehingga pengembang lain dapat memperpanjangnya.

Kapan saya harus menggunakan DI dalam kombinasi dengan antarmuka dan kapan saya seharusnya tidak?
Untuk membuatnya jelas di sini adalah contoh inti.

Kelas Magento\Core\Helper\Datamemiliki konstruktor seperti ini:

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

Pertanyaan saya terfokus pada var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig (saya tahu ada orang lain di konstruktor yang sama, tetapi satu penjelasan akan cocok untuk semua kasus yang saya pikir).

Menurut di.xmldari modul inti var akan menjadi turunan dari Magento\Framework\App\Config:

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

tetapi saya dapat dengan mudah mengubahnya jika perlu.

Kapan saya harus menggunakan antarmuka seperti itu dalam kode saya?
Saya telah membuat modul sampel yang tidak lengkap ini (maaf untuk iklan), tempat saya menggunakan antarmuka seperti itu, tetapi semuanya berasal dari inti. Saya belum membuat sendiri. Haruskah saya?

Marius
sumber
"Katakan saja itu sangat luar biasa." Apakah ada kepala mengambang orang yang sedang online di stackexchange? Karena saya akan menginstalnya;)
David Manners
1
@ Davidvider Saya akan mencoba untuk port semua ekstensi 1.x saya ke 2.0 sehingga akan porting juga. Saya tidak tahu tentang bagian mengambang, tetapi saya akan melihat apa yang bisa saya lakukan.
Marius
Imho itu bukan pertanyaan spesifik Mage2, lebih umum "Kapan menggunakan antarmuka". Itu tergantung di mana Anda ingin seseorang dapat memperpanjang ekstensi Anda. Saya akan mengatakan di mana pun Anda bekerja dengan logika bisnis, yang mungkin berubah. ;) Selain itu objek tanpa perilaku (misalnya objek data sederhana) biasanya tidak akan berubah.
Tobias
1
@TobiasZander, Anda bermaksud mengatakan bahwa saya harus membuat antarmuka untuk hampir SEGALA SESUATU? Sial itu banyak pekerjaan.
Marius
@Marius, jika Anda ingin menjadi 100% fleksibel, entah bagaimana ya. Tapi saya tidak akan terlalu-insinyur itu. Saya pribadi juga suka odetocode.com/blogs/scott/archive/2009/06/08/... sebagai pengantar ketika itu sebenarnya berguna
Tobias

Jawaban:

9

Imho itu bukan pertanyaan spesifik Mage2, lebih umum "Kapan menggunakan antarmuka". Itu tergantung di mana Anda ingin seseorang dapat memperpanjang ekstensi Anda. Saya akan mengatakan di mana pun Anda bekerja dengan logika bisnis, yang mungkin berubah. ;) Selain itu objek tanpa perilaku (misalnya objek data sederhana) biasanya tidak akan berubah.

Jika Anda ingin menjadi 100% fleksibel, Anda harus menggunakan antarmuka di mana saja. Tapi saya tidak akan terlalu-insinyur itu. Saya pribadi juga suka http://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspx sebagai pengantar ketika itu sebenarnya berguna.

Tobias
sumber
7

Magento2 mempromosikan penggunaan SOLID prinsip .

Ketergantungan prinsip inversi langsung mengatakan, bahwa kode harus bergantung pada abstraksi (antarmuka).

Prinsip pemisahan antarmuka mengatakan bahwa banyak antarmuka khusus klien lebih baik daripada satu antarmuka tujuan umum. Kelas juga dapat mendefinisikan antarmuka yang dilindungi, sehingga antarmuka lebih disukai dari sudut pandang arsitektur.

PHP juga tidak mendukung multiple inheritance of class, tetapi mendukung beberapa implementasi antarmuka. Itu satu poin lagi untuk antarmuka.

Jadi, aturan sederhana dapat digunakan: jika Anda tidak tahu apa yang harus digunakan, SELALU menggunakan antarmuka .

PS. Performa itu bukan alasan bagi saya untuk tidak menggunakan antarmuka

KAndy
sumber
Saya ingin tahu apakah penggunaan antarmuka memengaruhi kinerja?
amitshree
1
Panggilan fungsi pengisian otomatis tidak gratis. lihat contoh: ( dl.dropboxusercontent.com/u/3103646/... )
KAndy