Magento 2 kelas instantiating melalui pabrik manajer objek


9

Dalam Magento 2 kelas adalah yang dipakai menggunakan pabrik manajer objek: \Magento\Framework\ObjectManager\Factory\Factory::create().
Sejauh ini sangat buruk. Tetapi ada sesuatu yang tidak saya mengerti di sini.
Setelah memeriksa apakah tidak ada referensi melingkar dalam argumen yang harus diteruskan ke konstruktor untuk DI dan setelah argumen ditentukan ada ini ( $argsadalah argumen yang harus diteruskan ke konstruktor):

    switch (count($args)) {
        case 1:
            return new $type($args[0]);
        case 2:
            return new $type($args[0], $args[1]);
        case 3:
            return new $type($args[0], $args[1], $args[2]);
        case 4:
            return new $type($args[0], $args[1], $args[2], $args[3]);
        case 5:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4]);
        case 6:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]);
        case 7:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]);
        case 8:
            return new $type($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]);
        default:
            $reflection = new \ReflectionClass($type);
            return $reflection->newInstanceArgs($args);
    }

Mengapa switchpernyataan panjang ini ? Mengapa tidak menggunakan langsung kode dari defaultcabang?
Atau mengapa menghentikan casejam 8? Kenapa tidak 5 atau 10 atau 127?


very bed coding
Keyul Shah

1
@KeyulShah. Bisa jadi, tapi saya hampir yakin ada alasan di balik ini.
Marius

Jawaban:


11

Alasannya adalah kinerja. Instansiasi melalui yang baru sedikit lebih cepat daripada refleksi. Sebagian besar kelas memiliki kurang dari 8 argumen sehingga switch ini mencakup sebagian besar kasus.

Mungkin itu akan dihapus.


1
Terima kasih atas jawabannya. Saya harus mengatakan saya sedikit kecewa. Saya mengharapkan sesuatu yang mewah. :)
Marius

1
Performa bukan alasan yang cukup baik? :)
Anton Kril

3
Juga, dalam kasus itu tidak jelas dari jawabannya, implementasi yang sedikit lebih cepat dalam sesuatu yang sering terjadi (yaitu instantiating objek) sangat berharga.
Alan Storm

1
@AntonKril. Saya tidak berbicara tentang alasannya. Saya berharap untuk jawaban mewah seperti "Karena kita melakukannya dengan cara ini, bir Anda tidak akan pernah menjadi hangat" atau sesuatu seperti itu. Tapi saya kira "kinerja" akan melakukannya untuk saat ini. Mohon tetap dekat. pertanyaan filosofis lainnya akan menyusul di hari-hari berikutnya. :)
Marius

6

Keuntungan kinerja hampir tidak terlihat. Ketika saya mencoba untuk instantiate 1000000 objek dengan 2 metode, berikut adalah hasilnya:

masukkan deskripsi gambar di sini

Saya menggunakan versi Magento 2 Beta dan PHP (lihat di bawah)

PHP 5.6.12-1 + deb.sury.org ~ trusty + 1 (cli) Hak Cipta (c) 1997-2015 PHP Group Zend Engine v2.6.0, Hak Cipta (c) 1998-2015 Zend Technologies dengan Zend OPcache v7.0.6 -dev, Hak Cipta (c) 1999-2015, oleh Zend Technologies dengan Xdebug v2.3.2, Hak Cipta (c) 2002-2015, oleh Derick Rethans

Untuk melakukan tes ini, saya menggunakan skrip ini


Yah ... anton berkata "sedikit lebih cepat". Yang ini :). Tapi bagaimanapun ... +1 untuk profil.
Marius

Kode ini ditambahkan sejak lama. Itu diuji di PHP 5.3 Pada perbedaan versi kemudian menjadi kurang terlihat itu sebabnya saya sebutkan dalam jawaban saya bahwa kode ini mungkin dihapus nanti.
Anton Kril

@AntonKril Sebagai gantinya, Anda memompanya hingga 15 parameter ? ;-)
Fabian Schmengler
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.