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\Data
memiliki 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.xml
dari 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?
Jawaban:
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.
sumber
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
sumber