Son zamanlarda singletonlara karşı bir tür devrim oldu, ancak vatansızlarsa onlarla ilgili bir sorun mu var?
Aşırı konuşmayı biliyorum ve hepsi ... bu sadece singletonlar için değil her şey için geçerlidir.
Son zamanlarda singletonlara karşı bir tür devrim oldu, ancak vatansızlarsa onlarla ilgili bir sorun mu var?
Aşırı konuşmayı biliyorum ve hepsi ... bu sadece singletonlar için değil her şey için geçerlidir.
Yanıtlar:
> Are immutable/stateless singletons bad?
Daha fazla ayrıntı için soğan mimarisine bakın
Singletons kullanmamanın başka nedenlerini görmüyorum.
Her zaman kullanıma bağlıdır. Ben devrim her programcı olarak bu kalıbı öğrenir ki aslında geldiğini düşünüyorlar nesne yönelimli desen. Çoğu, nerede mantıklı ve nerede olmadığı hakkında düşünmeyi unutur.
Bu, elbette, her model için geçerlidir. Sadece kalıpları kullanarak iyi kod veya iyi yazılım oluşturmazsınız.
Durum bilgisi olmayan bir singletonunuz varsa, neden yalnızca statik yöntemler sunan bir sınıf kullanmıyorsunuz (veya statik bir sınıf kullanmıyorsunuz)?
Burada genel olarak küresel değişkenler ve singletonlarla ilgili bazı yayınlar.
Yazar kadar katı olmazdım ama o da bir singletona ihtiyacınız olduğunu düşündüğünüz çoğu durumda, buna gerçekten ihtiyacınız olmadığını gösteriyor.
Değişmez bir vatansız singleton'un statik bir sınıfın yapamayacağı hiçbir şey yoktur.
-> Instance () öğesinin oluşturduğu ekstra karmaşıklık düzeyini eklemek için hiçbir neden yoktur, oysa statik bir yönteme yapılan düz çağrı daha net, kaynaklar açısından daha muhafazakar ve muhtemelen daha hızlı olacaktır.
Yanlış oldukları değil. Bunu yapmanın daha iyi bir yolu var. Normal ("durum bilgisi olan") tektonların gitmek için doğru yol olduğu senaryolar vardır. Singleton ile kötülük, genellikle küresel değişkenlerle aynı kötü sonuçlarla istismar edilmeleri, ancak singleton kullanmanın basitçe doğru olduğu belirli durumlar vardır. Vatansızlar için böyle bir durum yok.
Singleton ile ilgili temel sorun, kesişen endişeler senaryosunda kullanıldığında özellikle bağımlılıkları ve kuplajları gizlemesidir. Bkz Singletons Patolojik Yalancılar veya Neden Singletons Evil olan ileri okuma için.
Diğer taraftan, kötüye kullanılmazsa, daha az tekil bir durum yardımcı olabilir ve performansı artırabilir. Bir örnek düşünün:
interface Interface
{
void Method();
}
class StatelessSingleton : Interface
{
public static readonly StatelessSingleton Instance = new StatelessSingleton();
private StatelessSingleton() { }
public void Method() { }
}
class User
{
public User(Interface i) { /* ... */ }
}
Burada, StatelessSingleton, Arayüzün varsayılan uygulaması olarak işlev görür ve Kullanıcı yapıcısına yerleştirilir. Sabit kodlu bağlantı ve gizleme bağımlılıkları yoktur. Temel arabirim nedeniyle statik bir sınıf kullanamıyoruz ancak varsayılanın birden fazla örneğini oluşturmak için hiçbir neden yok. Bu yüzden vatansız bir singleton uygun bir seçim gibi görünüyor.
Ancak, varsayılan bir uygulama için başka bir model kullanmalıyız:
class Implementation : Interface
{
private readonly Action _method;
public Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
StatelessSingleton ile ilgili performansı vurur ancak Arayüzün genel bir uygulamasını oluşturur. Benzer çözüm IProgress arayüzü tarafından da kullanılır .
Yine de, neden varsayılan davranışın birden fazla uygulanmasına izin verilsin? Ancak ikisini birleştirebiliriz:
class Implementation : Interface
{
public readonly Implementation Default = new Implementation();
private readonly Action _method;
private Implementation()
{
_method = new Action(() => { /* default */ });
}
public Implementation(Action custom)
{
_method = custom;
}
public void Method()
{
_method();
}
}
Sonuç olarak, Singletonların yararlı olduğu yerler (varsayılan olarak tasvir edildiği gibi) olduğuna inanıyorum. Singleton'un ana tanımı , bir sınıfın birden fazla örneğini oluşturmaya izin vermediğini belirtir . Nükleer güç gibi. Enerji veya bomba üretebilir. Bu insana bağlıdır.