OOP'ta küresellerin kötü olmasının birçok nedeni var .
Paylaşılması gereken nesnelerin sayısı veya boyutu işlev parametrelerinde verimli bir şekilde iletilemeyecek kadar büyükse, genellikle herkes global bir nesne yerine Bağımlılık Enjeksiyonu önerir .
Ancak, neredeyse herkesin belirli bir veri yapısı hakkında bilgi sahibi olması durumunda, Bağımlılık Enjeksiyonu neden küresel bir nesneden daha iyi?
Örnek (basit bir uygulama, belirli bir uygulamada çok fazla derinlemesine inceleme yapmadan genel olarak noktayı göstermek için)
Tür, isim, renk, hız, konum vb. Gibi çok sayıda özelliğe ve duruma sahip bir dizi sanal araç vardır. Bir dizi kullanıcı bunları uzaktan kontrol edebilir ve çok sayıda olay (hem kullanıcı- başlatılmış ve otomatik) durumlarının veya özelliklerinin çoğunu değiştirebilir.
Saf çözüm, sadece küresel bir kap yapmak,
vector<Vehicle> vehicles;
her yerden erişilebilir.
Daha fazla OOP dostu çözüm, konteynerin ana olay döngüsünü işleyen sınıfın üyesi olması ve yapıcısında somutlaştırılması olacaktır. İhtiyacı olan ve ana iş parçacığının üyesi olan her sınıfa, yapıcılarındaki bir işaretçi aracılığıyla kaba erişim verilecektir. Örneğin, bir ağ bağlantısı üzerinden harici bir mesaj gelirse, ayrıştırmayı işleyen bir sınıf (her bağlantı için bir tane) devralınır ve ayrıştırıcı kapsayıcıya bir işaretçi veya başvuru yoluyla erişebilir. Şimdi, ayrıştırılan mesaj kabın bir öğesinde bir değişiklikle sonuçlanırsa veya bir eylemi gerçekleştirmek için dışarıda bazı veriler gerektirirse, sinyaller ve yuvalar (veya daha kötüsü, daha sonra ayrıştırıcıyı çağıran tarafından alınması için bunları ayrıştırıcıda saklamak). Tabii ki, bağımlılık enjeksiyonu yoluyla kaba erişim alan tüm sınıflar aynı iş parçacığının bir parçasıdır. Farklı iş parçacıkları doğrudan erişemez, ancak işlerini yapar ve daha sonra ana iş parçacığına sinyal gönderir ve ana iş parçasındaki yuvalar kapsayıcıyı güncelleştirir.
Bununla birlikte, eğer sınıfların çoğunluğu konteynere erişecekse, onu küreselden gerçekten farklı kılan nedir? Eğer çok fazla sınıfın kapsayıcıdaki verilere ihtiyacı varsa, "bağımlılık enjeksiyon yolu" sadece gizlenmiş bir küresel değil mi?
Bir cevap iş parçacığı güvenliği olacaktır: Küresel kapsayıcıyı kötüye kullanmamaya dikkat etsem de, belki de yakın bir son tarih baskısı altında gelecekte başka bir geliştirici, küresel kapsayıcıyı, hepsine bakmadan farklı bir iş parçacığında kullanacaktır. çarpışma olayları. Bununla birlikte, bağımlılık enjeksiyonu durumunda bile, başka bir iş parçacığında çalışan birine bir işaretçi verebilir ve aynı sorunlara yol açabilir.