วีโอไอพี 2: ใช้ข้อความเปรียบเทียบกับเส้นทางของคลาสโดยตรง?


14

ฉันอาจจะพลาดจุดหนึ่ง แต่ฉันแค่สงสัยว่าทำไมบางครั้งมีคำสั่ง "ใช้" สำหรับชั้นเรียนที่เฉพาะเจาะจงและบางครั้งเราไม่

ตัวอย่าง: app\code\Magento\Email\Model\Template.phpเรามีที่ด้านบนของไฟล์:

namespace Magento\Email\Model;

use Magento\Store\Model\ScopeInterface;
use Magento\Store\Model\StoreManagerInterface;

จากนั้นใน__constructวิธีการเรามีพารามิเตอร์ต่อไปนี้:

public function __construct(
    \Magento\Framework\Model\Context $context,
    \Magento\Framework\View\DesignInterface $design,
    \Magento\Framework\Registry $registry,
    \Magento\Store\Model\App\Emulation $appEmulation,
    StoreManagerInterface $storeManager,
    \Magento\Framework\View\Asset\Repository $assetRepo,
    \Magento\Framework\Filesystem $filesystem,
    \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
    \Magento\Email\Model\Template\Config $emailConfig,
    \Magento\Email\Model\TemplateFactory $templateFactory,
    \Magento\Framework\Filter\FilterManager $filterManager,
    \Magento\Framework\UrlInterface $urlModel,
    \Magento\Email\Model\Template\FilterFactory $filterFactory,
    array $data = []
)

ดังนั้นเราจะเห็นได้อย่างชัดเจนว่าเมื่อเราเรียกuse Magento\Store\Model\StoreManagerInterface;ที่ด้านบนของชั้นเรียนเราสามารถทำได้StoreManagerInterface $storeManagerในพารามิเตอร์ตัวสร้าง

คำถามของฉันคือ:

  • เหตุใดเราจึงทำเช่นนี้สำหรับชั้นเรียนเดียวเท่านั้น
  • ทำไมเราไม่สามารถเพิ่มuseคำสั่งสำหรับทุกคลาสของนวกรรมิกดังนั้นเราจึงไม่ต้องพิมพ์เส้นทางแบบเต็ม?
  • หรือวิธีอื่น ๆ ทำไมเราไม่กำจัดuseคำสั่งและพิมพ์เส้นทางแบบเต็มไปยังStoreManagerInterfaceชั้นเรียน

คำตอบ:


15

ไม่มีเหตุผลทางเทคนิคที่จะชอบอีกอันหนึ่งยกเว้นในกรณีที่มีความขัดแย้งของชื่อ (เช่นคลาส "บริบท" ที่แตกต่างกัน) แต่สิ่งเหล่านั้นสามารถแก้ไขได้ด้วยนามแฝงและนั่นคือสิ่งที่ฉันมักจะทำ:

use Magento\Framework\Model\Context as ModelContext;

ฉันคิดว่าในแกนกลางหลายวิธีโดยเฉพาะอย่างยิ่งตัวสร้างถูกสร้างขึ้นโดยเครื่องมือเช่นเครื่องมือการแปลงในตอนแรกและต่อมาไม่เปลี่ยนเป็นการใช้การนำเข้า "ใช้"

ดังนั้นฉันขอแนะนำว่าในรหัสของคุณเองคุณจะต้องนำเข้าคลาสด้วย "ใช้" เพื่อทำให้รหัสที่แท้จริงน้อยลงและอ่านง่ายขึ้น


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

1
ไม่สำหรับฉันดูเหมือนว่าจะมีการเพิ่มในภายหลังโดยใครบางคนที่ใช้ IDE ซึ่งจะเพิ่มคำสั่งการใช้งานโดยอัตโนมัติเมื่อใช้การเติมข้อความอัตโนมัติ
เฟเบียน Schmengler

2

การใช้งานขึ้นอยู่กับสถานการณ์ที่เฉพาะเจาะจง แนวทางของฉันคือ

คลาสที่กล่าวถึงเพียงครั้งเดียวภายในไฟล์ - FQN

ฝากชื่อที่มีคุณสมบัติครบถ้วน สิ่งนี้ช่วยปรับปรุงความสามารถในการอ่านได้เนื่องจากคุณไม่จำเป็นต้องดูที่ส่วนการใช้งานอีกครั้ง

ชื่อคลาสใช้หลายครั้ง - นำเข้า

วางไว้ในส่วนการใช้งาน ทำให้รหัสสั้นลงเมื่อกล่าวถึงคลาส

คลาสใช้เพียงครั้งเดียว แต่ฉันต้องการสัญกรณ์สั้น ๆ - นำเข้า

อธิบายได้ดีกว่าด้วยตัวอย่าง

FQN

$collection->getSelect()
           ->joinInner(['campaign_products' => $subSelect],
               'campaign_products.product_id = e.entity_id',
               [self::FIELD_SORT_ORDER => "IFNULL(IF(0 = " . \Custome\Module\Api\Data\ProductListInterface::SORT_ORDER . ", NULL, " . \Custome\Module\Api\Data\ProductListInterface::SORT_ORDER . "), {$defaultSortValue})"]
           );

นำเข้า

$collection->getSelect()
           ->joinInner(['campaign_products' => $subSelect],
               'campaign_products.product_id = e.entity_id',
               [self::FIELD_SORT_ORDER => "IFNULL(IF(0 = " . ProductListInterface::SORT_ORDER . ", NULL, " . ProductListInterface::SORT_ORDER . "), {$defaultSortValue})"]
           );

ในความคิดของฉันตัวอย่างที่ 2 ง่ายต่อการอ่าน (แต่พูดอย่างตรงไปตรงมาฉันต้องการใช้ตัวแปรแทนค่าคงที่ที่นี่เพื่อให้อ่านได้ง่ายขึ้น)

การเชื่อมต่อ API ของ Magento 2

มีประกาศเกี่ยวกับจุดสิ้นสุด API ที่เปิดเผยโดยอัตโนมัติของ M2 ในอินเตอร์เฟสที่ใช้สำหรับวิธี REST / SOAP คุณควรใช้ FQN

หมายเหตุประกอบจะถูกวิเคราะห์โดย Magento Framework เพื่อกำหนดวิธีการแปลงข้อมูลไปและกลับจาก JSON หรือ XML

การอิมพอร์ตคลาส (นั่นคือใช้คำสั่งด้านบนคลาส) จะไม่ถูกนำไปใช้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.