Magento 2 DI best practice


19

สมมติว่าฉันกำลังสร้างส่วนเสริม Magento 2 ที่ทำได้ .... ก็ดี ... ไม่สำคัญ สมมติว่ามันทำสิ่งที่ยอดเยี่ยมที่สุด
แต่ฉันต้องการตรวจสอบให้แน่ใจว่านี่คือการสร้างโดยใช้มาตรฐานที่เหมาะสมเพื่อให้นักพัฒนารายอื่นสามารถขยายได้

เมื่อใดที่ฉันควรใช้ DI ร่วมกับส่วนต่อประสานและเมื่อใดที่ฉันไม่ควรใช้
เพื่อให้ชัดเจนนี่คือตัวอย่างหลัก

ชั้นเรียนMagento\Core\Helper\Dataมีตัวสร้างเช่นนี้:

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

คำถามของฉันมุ่งเน้นไปที่ var \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig(ฉันรู้ว่ามีคนอื่นในนวกรรมิกเดียวกัน แต่คำอธิบายเดียวจะเหมาะกับทุกกรณีที่ฉันคิด)

ตามที่di.xmlได้จากโมดูลหลัก var จะเป็นตัวอย่างของการMagento\Framework\App\Config:

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

แต่ฉันสามารถเปลี่ยนได้อย่างง่ายดายถ้าฉันต้องการ

เมื่อใดที่ฉันควรใช้อินเทอร์เฟซเช่นนั้นในรหัสของฉัน
ฉันได้สร้างโมดูลตัวอย่างที่ไม่สมบูรณ์นี้(ขออภัยสำหรับการโฆษณา) ซึ่งฉันได้ใช้อินเทอร์เฟซดังกล่าว แต่ทั้งหมดมาจากแกนกลาง ฉันไม่ได้สร้างหนึ่งของฉันเอง ฉันควร?


"สมมติว่ามันทำสิ่งที่ยอดเยี่ยมที่สุด" มันมีหัวลอยของคนที่ออนไลน์ใน stackexchange หรือไม่ เพราะฉันจะติดตั้ง;)
David Manners

1
@DavidManners ฉันจะพยายามพอร์ตส่วนขยาย 1.x ทั้งหมดของฉันเป็น 2.0 เพื่อที่จะได้พอร์ต ฉันไม่รู้เกี่ยวกับส่วนที่ลอยอยู่ แต่ฉันจะเห็นสิ่งที่ฉันสามารถทำได้
Marius

Imho นั้นไม่ใช่คำถามเฉพาะของ Mage2 โดยทั่วไปแล้ว "เมื่อไรที่จะใช้อินเทอร์เฟซ" ขึ้นอยู่กับที่คุณต้องการให้ใครบางคนสามารถขยายส่วนขยายของคุณได้ ฉันจะบอกทุกที่ที่คุณทำงานกับตรรกะทางธุรกิจซึ่งอาจมีการเปลี่ยนแปลง ;) นอกจากนั้นวัตถุที่ไม่มีพฤติกรรม (เช่นวัตถุข้อมูลแบบง่าย) มักจะไม่เปลี่ยนแปลง
โทเบียส

1
@TobiasZander คุณหมายถึงว่าฉันต้องสร้างส่วนต่อประสานสำหรับเกือบทุกอย่างหรือไม่ ประณามนั่นเป็นงานมาก
Marius

@Marius ถ้าคุณต้องการที่จะมีความยืดหยุ่น 100% อย่างใดใช่ แต่ฉันจะไม่ทำมันเกิน ฉันเองก็ชอบodetocode.com/blogs/scott/archive/2009/06/08/…เพื่อเป็นการแนะนำเมื่อมันมีประโยชน์จริง ๆ
Tobias

คำตอบ:


9

Imho นั้นไม่ใช่คำถามเฉพาะของ Mage2 โดยทั่วไปแล้ว "เมื่อไรที่จะใช้อินเทอร์เฟซ" ขึ้นอยู่กับที่คุณต้องการให้ใครบางคนสามารถขยายส่วนขยายของคุณได้ ฉันจะบอกทุกที่ที่คุณทำงานกับตรรกะทางธุรกิจซึ่งอาจมีการเปลี่ยนแปลง ;) นอกจากนั้นวัตถุที่ไม่มีพฤติกรรม (เช่นวัตถุข้อมูลธรรมดา) มักจะไม่เปลี่ยนแปลง

หากคุณต้องการความยืดหยุ่น 100% คุณต้องใช้ส่วนต่อประสานทุกที่ แต่ฉันจะไม่ทำมันเกิน ฉันเองชอบhttp://odetocode.com/blogs/scott/archive/2009/06/08/when-do-i-use-interfaces.aspxเป็นการแนะนำเมื่อมันมีประโยชน์จริง ๆ


7

Magento2 ส่งเสริมการใช้หลักการSOLID

หลักการผกผันของการพึ่งพาอาศัยโดยตรงกล่าวว่ารหัสนั้นควรขึ้นอยู่กับ abstractions (อินเตอร์เฟส)

หลักการแบ่งแยกอินเตอร์เฟสบอกว่าอินเตอร์เฟสเฉพาะไคลเอ็นต์จำนวนมากนั้นดีกว่าอินเตอร์เฟสวัตถุประสงค์ทั่วไปเดียว คลาสยังสามารถกำหนดอินเตอร์เฟสที่ได้รับการป้องกันดังนั้นอินเตอร์เฟสที่ต้องการเพิ่มเติมจากมุมมองสถาปัตยกรรม

PHP ยังไม่สนับสนุนการสืบทอดหลายคลาส แต่สนับสนุนการใช้งานอินเทอร์เฟซหลายอย่าง นั่นคืออีกหนึ่งจุดสำหรับอินเตอร์เฟส

ดังนั้นกฎง่ายๆสามารถนำมาใช้: ถ้าคุณไม่ทราบว่าจะใช้อินเตอร์เฟซที่ใช้งานเสมอ

PS ประสิทธิภาพไม่ใช่เหตุผลที่ฉันจะไม่ใช้อินเทอร์เฟซ


ฉันอยากรู้ว่าการใช้อินเตอร์เฟสเอฟเฟกต์มีประสิทธิภาพในทางใด?
amitshree

1
ฟังก์ชั่นการโทรของ autoload ไม่ฟรี ดูตัวอย่าง: ( dl.dropboxusercontent.com/u/3103646/… )
KAndy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.