Nesne yöneticisi fabrikası aracılığıyla Magento 2 örnekleme sınıfları


9

Magento 2'de sınıfları, bir Nesne Yöneticisi fabrika kullanarak örneklenen: \Magento\Framework\ObjectManager\Factory\Factory::create().
Şimdiye kadar goo. Ama burada anlamadığım bir şey var.
DI için yapıcıya geçirilmesi gereken bağımsız değişkenlerde dairesel referans olup olmadığını kontrol ettikten sonra ve bağımsız değişkenler belirlendikten sonra bu ( $argsyapıcıya geçirilmesi gereken bağımsız değişkenlerdir):

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

Neden bu uzun switchaçıklama? Neden doğrudan defaultşubedeki kodu kullanmıyorsunuz ?
Veya neden case8'de dursun ? Neden 5 veya 10 veya 127 olmasın?


çok yatak kodlama
Keyul Shah

1
@KeyulShah. Olabilir, ama bunun arkasında bir neden olduğundan neredeyse eminim.
Marius

Yanıtlar:


11

Nedeni performans. Yeni yoluyla örnekleme, yansımadan biraz daha hızlıdır. Sınıfların çoğunda 8'den az bağımsız değişken bulunur, bu nedenle bu anahtar çoğu durumu kapsar.

Belki kaldırılır.


1
Cevap için teşekkürler. Biraz hayal kırıklığına uğradığımı söylemeliyim. Süslü bir şey bekliyordum. :)
Marius

1
Performans yeterince iyi bir neden değil mi? :)
Anton Kril

3
Ayrıca, cevaptan net olmadığı takdirde, çok fazla olan bir şeyde (yani bir nesneyi örneklemek) biraz daha hızlı bir uygulama buna değer.
Alan Storm

1
@AntonKril. Sebepleri hakkında konuşmuyordum. "Bu şekilde yaptığımız için biranız asla ısınmayacak" ya da bunun gibi süslü bir cevap bekliyordum. Ama sanırım "performans" şimdilik bunu yapacak. Yakýn durun lütfen. diğer felsefi sorular önümüzdeki günlerde gelecek. :)
Marius

6

Performans kazancı neredeyse görünmezdir. 2 yöntemle 1000000 nesneleri başlatmaya çalıştığımda, işte sonuç:

resim açıklamasını buraya girin

Magento 2 Beta ve PHP sürümünü kullanıyorum (aşağıya bakın)

PHP 5.6.12-1 + deb.sury.org ~ güvenilir + 1 (cli) Telif Hakkı (c) 1997-2015 PHP Grubu Zend Motoru v2.6.0, Telif Hakkı (c) 1998-2015 Zend OPcache v7.0.6 ile Zend Technologies -dev, Telif Hakkı (c) 1999-2015, Zend Technologies tarafından Xdebug v2.3.2, Telif Hakkı (c) 2002-2015, Derick Rethans

Bu testi yapmak için bu senaryoyu kullandım


...Ey ... Anton dedi ki "biraz daha hýzlý". Hangisi :). Ama yine de ... profilleme için + 1.
Marius

Bu kod uzun zaman önce eklendi. PHP 5.3 üzerinde test edildi. Sonraki sürümlerde fark daha az görünür hale geldi bu yüzden cevabımda bu kodun daha sonra kaldırılabileceğinden bahsettim.
Anton Kril

@AntonKril Bunun yerine, 15 parametreye kadar pompaladınız mı? ;-)
Fabian Schmengler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.