Magento 2: gunakan pernyataan versus jalur kelas langsung?

14

Saya mungkin kehilangan satu poin tetapi saya hanya bertanya-tanya mengapa kadang-kadang ada pernyataan "gunakan" untuk kelas tertentu dan terkadang kita tidak.

Contoh:, app\code\Magento\Email\Model\Template.phpkami ada di bagian atas file:

namespace Magento\Email\Model;

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

Kemudian dalam __constructmetode ini kita memiliki parameter berikut:

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 = []
)

Jadi kita dapat dengan jelas melihat bahwa ketika kita memanggil use Magento\Store\Model\StoreManagerInterface;bagian atas kelas, kita dapat melakukannya StoreManagerInterface $storeManagerdi parameter konstruktor.

Pertanyaan saya adalah:

  • Mengapa kita melakukan ini hanya untuk satu kelas?
  • Mengapa kita tidak bisa menambahkan usepernyataan untuk setiap kelas konstruktor sehingga kita tidak perlu mengetikkan path kelas penuh?
  • Atau sebaliknya, mengapa kita tidak menyingkirkan usepernyataan itu dan mengetikkan path lengkap ke StoreManagerInterfacekelas?
Raphael di Digital Pianism
sumber

Jawaban:

15

Tidak ada alasan teknis untuk lebih memilih satu daripada yang lain, kecuali jika ada konflik nama (seperti kelas "Konteks" yang berbeda). Tapi itu bisa diselesaikan dengan alias dan itulah yang biasanya saya lakukan:

use Magento\Framework\Model\Context as ModelContext;

Saya berasumsi bahwa pada intinya banyak metode, terutama konstruktor, yang dihasilkan oleh alat-alat seperti alat konversi pada awalnya dan kemudian tidak diubah untuk menggunakan impor "gunakan".

Jadi saya menyarankan bahwa dalam kode Anda sendiri, Anda selalu mengimpor kelas dengan "gunakan" untuk membuat kode yang sebenarnya kurang verbose dan lebih mudah dibaca.

Fabian Schmengler
sumber
Jadi hanya untuk memperjelas tidak ada poin yang ditambahkan tim inti useuntuk kelas spesifik yang saya tunjuk kan?
Raphael di Digital Pianism
1
Tidak. Bagi saya sepertinya telah ditambahkan kemudian oleh seseorang yang menggunakan IDE yang secara otomatis menambahkan pernyataan penggunaan saat menggunakan pelengkapan otomatis.
Fabian Schmengler
2

Penggunaannya tergantung pada situasi tertentu. Pendekatan saya adalah:

Kelas yang disebutkan hanya sekali di dalam file - FQN

Tinggalkan nama yang sepenuhnya memenuhi syarat . Ini meningkatkan keterbacaan karena Anda tidak perlu melihat bagian penggunaan lagi.

Nama kelas yang digunakan beberapa kali - impor

Masukkan ke dalam bagian penggunaan . Ini membuat kode lebih pendek di mana kelas disebutkan.

Kelas digunakan sekali tetapi saya perlu notasi pendek - impor

Lebih baik jelaskan dengan contoh.

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})"]
           );

impor

$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})"]
           );

Menurut saya contoh ke-2 lebih mudah dibaca. (Tapi jujur ​​saja, saya lebih suka menggunakan variabel daripada konstanta di sini untuk membuatnya lebih mudah dibaca.)

Antarmuka API Magento 2

Ada pemberitahuan tentang titik akhir API M2 yang terpapar otomatis. Dalam antarmuka yang digunakan untuk metode REST / SOAP Anda harus selalu menggunakan FQNs.

Anotasi diuraikan oleh Magento Framework untuk menentukan bagaimana mengkonversi data ke dan dari JSON atau XML.

Impor kelas (yaitu, gunakan pernyataan di atas kelas) tidak diterapkan!

Arkadij Kuzhel
sumber