SORU
17 Mayıs 2011, Salı


Eğer Tekiz sonra Servis Kabı iyidir?neden kötü

Hepimiz nasıl olduğunu biliyoruzkötü Tekizonların bağımlılığı gizlemek için ve ürün other reasons için.

Ama bir çerçeve içinde, yalnızca bir kez oluşturulmuş ve denmesi gereken birçok nesne olabilirher yerden(logger, db vs).

Bir kullanmak için söylendi bu sorunu çözmek için yani "Nesne" (veya symfony gibi Service Container) Bu içten Hizmet için her başvuru (logger, vb.) depolar. Müdürü aradı

Ama neden bir Servis Sağlayıcı saf bir Singleton kadar kötü değil mi?

Servis sağlayıcı gizler de bağımlılıkları ve onlar sadece ilk istance oluşturulması sarın. Gerçekten tekiz yerine bir servis sağlayıcı kullanmak lazım anlamak için mücadele ediyorum.

PS. Bağımlılıklar değil gizlemek için Dİ Misko tarafından belirtildiği gibi) kullanmam gerektiğini biliyorum

Ekleyin

Eklemek istiyorum: Bu gün tekiz kötü değil, PHPUnit yaratıcısı burada açıkladı:

Dİ Tek sorunu çözdü:

<?php
class Client {

    public function doSomething(Singleton $singleton = NULL){

        if ($singleton === NULL) {
            $singleton = Singleton::getInstance();
        }

        // ...
    }
}
?>

eğer bu tüm sorunları çözmek değilse bile çok zekice.

Dİ ve Servis Kabı dışındaiyi kabul edilebilirbu yardımcı nesneleri erişmek için çözüm?

CEVAP
17 Mayıs 2011, Salı


Servis Bulucu sadece az söylemek çok kötü olanını. ""Aşağı bu dört farklar ( . kaynama daha az ^em>en azından Diğerleri şu an aklıma gelmiyor):

Tek Sorumluluk Prensibi

Servis Kabı Singleton yaptığı gibi Tek Sorumluluk Prensibi ihlal etmez. Tekiz karışımı Servis Kap uygulamasının nesne ömürleri yönetmek için kesinlikle sorumlu ise yaratma ve iş mantığı nesne. Bu konuda Servis Kabı daha iyi olur.

Kaplin

Tekiz genellikle, uygulama kodu tight coupled and hard to mock dependencies yol açan statik yöntem çağrıları nedeniyle içine kodlanmış. Diğer taraftan SL sadece bir sınıf ve enjekte edilebilir. Tüm sınıflandırılır buna bağlı olsa da, en azından gevşek bir bağımlılık. Yani bir Tek kendisi gibi ServiceLocator uygulanan sürece, o biraz daha iyi ve test etmek daha kolay ayrıca.

Ancak, tüm sınıflar ServiceLocator kullanarak şimdi kaplin form da olan ServiceLocator bağlı olacak. Bunu hafifletilmiş kullanarak bir arayüz için ServiceLocator yani size bagli bir beton ServiceLocator uygulama ama derslerin olacak bağlıdır varlığının bir tür Belirleyicisi ise kullanmayan bir ServiceLocator hiç yeniden önemli ölçüde artar.

Gizli Bağımlılıklar

Gizleme bağımlılığı sorunu çok ileri olsa da var. Sadece tüketen sınıflar için konumlandırıcı enjekte zaman, sen alışkanlık herhangi bir bağımlılık. Ama Singleton aksine, SL genellikle tüm bağımlılıkları perde arkasında gerekli başlatılamadı. Bir Hizmet almaya geldiğinde, Misko Hevery in the CreditCard example, örneğin istiyorum oyüzden dont elle bağımlılıkları tüm depedencies başlatılamadı.

Örnek içeriden bağımlılıklar getirilirken de çoktu kazmak gerektiğini bildiren Law of Demeter, ihlal ediyor. Bir örnek sadece acil işbirlikçileri için konuşmak gerekir. Bu hem Singleton ve ServiceLocator bir sorundur.

Genel Durum

Sorunun Genel Durumu da biraz hafifletilmiş çünkü ne zaman örneğini bir yeni Hizmeti veren firma arasında testlerini önceden oluşturulmuş örnekleri silinmiş de (sürece yaptığınız hata ve kurtardı onları statik bir niteliği SL). O bakmıyor elbette sınıflar SL tarafından yönetilen herhangi bir küresel devlet için doğru tutun.

Ayrıca Service Locator vs Dependency Injection Fowler çok daha derinlemesine bir tartışma.


Senin güncelleme ve Sebastian Bergmann on testing code that uses Singletons ile bağlantılı madde üzerinde bir not : Sebastian, hiçbir şekilde, önerilen çözüm Singleons bir sorun daha az kullanarak yapar öneririz. Aksi takdirde daha fazla test edilebilir test etmek için imkansız olurdu bu kodu yapmak için sadece bir yoludur. Ama hala sorunlu kod. Aslında, o açıkça belirtiyor: "Sen Sırf, Sen Gerektiği Anlamına Gelmez".

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • HuskyStarcraft

    HuskyStarcra

    4 HAZİRAN 2009