SORU
8 ŞUBAT 2013, Cuma


İyi ya da kötü bir uygulama mı? Alıcı olarak başlatılıyor nesneleri

Öyle görünüyor ki garip bir alışkanlık... benim göre meslektaş en azından bende var. Küçük bir proje üzerinde birlikte çalışıyoruz. Sınıfları yazdı (basitleştirilmiş örnek):

[Serializable()]
public class Foo
{
    public Foo()
    { }

    private Bar _bar;

    public Bar Bar
    {
        get
        {
            if (_bar == null)
                _bar = new Bar();

            return _bar;
        }
        set { _bar = value; }
    }
}

Yani, temelde, ben sadece bir alıcı çağrıldığında herhangi bir alanda başlatmak ve bu alan hala boş. Bu hiçbir yerde kullanılmayan başlatma özellikleri değil, iş yükünü azaltmak düşündüm.

Bunu yapmamın nedeni benim sınıf da henüz daha sınıflarıyla özelliklere sahip başka bir sınıf örneğini döndüren birçok özellikleri vardır. ETA: Üst sınıf kurucusunu çağıran daha sonra onlar olmadığı zaman tüm bu sınıflar için tüm kurucular diyebilirher zamantüm gerekli.

Bu uygulamaya karşı herhangi bir itiraz, kişisel tercihi dışında var mı?

Bu soru ile ilgili olarak çok farklı görüşleri kabul ettim ve kabul cevabımı yanında olacağım. GÜNCELLEME: Ancak, şimdi bu kavramı daha iyi anlamak için geldim ve ne zaman kullanılacağı ve ne zaman karar vermek mümkün değilim.

Eksileri:

  • İş parçacığı güvenlik sorunları
  • Bir "istek değerini geçti" null . ayarlayıcı itaat
  • Mikro-optimizasyon
  • Özel durum işleme bir kurucu olarak yer almalıdır
  • Sınıfta boş' kodu . kontrol etmek lazım

Artıları:

  • Mikro-optimizasyon
  • Özellikleri hiç boş döner
  • Gecikme veya yükleme "ağır" nesneleri kaçının

Mahkumlar en çok "mikro-optimizasyon" aslında hiç bir şey optimize. test etmek isterdim ancak benim şu anki kütüphane, olmadığını görmek için geçerli değildir

SON GÜNCELLEME:

Tamam, cevabımı değiştirdim. Benim asıl sorum bu iyi bir alışkanlık olup olmadığını. Ve şimdi değil inanıyorum. Belki hala ama kayıtsız şartsız ve kesinlikle her zaman değil, benim şu anki kod bazı bölgelerinde, onu kullanmak. Benim huyundan vazgeç ve düşünün kullanmadan önce ben de öyle yapacağım. Herkese teşekkürler!

CEVAP
8 ŞUBAT 2013, Cuma


Burada bir - saf - uygulama ne "tembel başlatma".

Kısa cevap:

Geç başlatma kullanarakkayıtsız şartsıziyi bir fikir değil. Yerleri var ama kimse bunu dikkate çözümü vardır etkileri vardır.

Arka plan ve açıklama:

Somut uygulama:
Hadi ilk uygulaması naif düşünün neden somut örnek ve bak:

  1. Principle of Least Surprise (POLS) ihlal ediyor. Bir değer bir özellik atandığında, bu değer döndürülür bekleniyor. Uygulamanızda bu null için geçerli değildir

    foo.Bar = null;
    Assert.Null(foo.Bar); // This will fail
    
  2. Tanıttı oldukça bazı sorunları iş parçacığı: İki arayanların foo.Bar farklı bir iş parçacığı olabilir potansiyel olarak iki farklı örneği Bar ve onlardan biri olacak olmadan bir bağlantı Foo örneği. Herhangi bir değişiklik Bar Bu örnek için yapılır sessizce kaybetti.
    Bu POLİTİKACILARIN bir ihlali başka bir durumdur. Bir özelliği sadece saklı değer erişildiğinde güvenli iş parçacığı için bekleniyor. Bu sınıf sadece güvenli iş parçacığı olmadığını iddia edebilirsin süre - özellik alıcısı da dahil olmak üzere - bu normal bir durum değil bu düzgün belge gerekir. Ayrıca bu konunun giriş kısa bir süre sonra göreceğimiz gibi gereksizdir.

Genel:
Şimdi zaman genel olarak tembel başlatma bakmak için:
Geç başlatma genellikle nesnelerin inşaat geciktirmek için kullanılırbu inşa edilecek ya da bellek bir sürü almak uzun zaman alıyortam olarak inşa edilmiş bir kez.
Bu tembel başlatma kullanmak için çok geçerli bir neden.

Ancak bu özellikler normalde ilk sorun yukarıda işaret temizlenmiş oluyor belirleyiciler, yok.
Ayrıca, iş parçacığı için güvenli bir uygulama Lazy<T> - ikinci sorunu önlemek için kullanılamaz.

Tembel bir özellik uygulanmasında bu iki nokta dikkate alındığında bile, aşağıdaki hususları bu model genel sorunlar şunlardır:

  1. Nesnenin inşaat başarısız, özelliğini alıcı bir durum sonucu olabilir. Bu POLİTİKACILARIN başka bir ihlali olduğunu ve bu nedenle kaçınılmalıdır. section on properties bile "Gelişmekte olan Sınıf Kütüphaneleri için Tasarım Kuralları" özellik alıcılar istisnalar atmak gerektiğini açıkça ifade eder:

    Özellik alıcılar istisnalar atma kaçının.

    Özellik alıcılar herhangi bir önkoşul olmadan basit bir işlem olmalıdır. Eğer bir alıcı, bir özel durum olabilir, bu özelliği bir yöntem olduğu yaratmayı göz önünde bulundurun.

  2. Derleyici tarafından otomatik optimizasyon, yani satır içi uygulaması ve şube tahmin yaralandı. Ayrıntılı bir açıklama için Bill K's answer bakın lütfen.

Bu puan sonuç şudur:
Tembel uygulanan her bir özellik için, bu noktaları kabul etmeliydin.
Başına dava kararı ve genel en iyi yöntem olarak ele alınamaz.

Bu desen yeri var, ama sınıfları uygularken genel en iyi yöntem değildir. Koşulsuz olarak kullanılmamalıdırbu nedenlerle yukarıda belirtilen çünkü.


Bazı noktaları tartışmak istiyorum bu bölümde Diğerleri tembel başlatma kullanarak koşulsuz: bağımsız değişkenler olarak ön plana çıkmıştır

  1. Serileştirme:
    Bir yorum EricJ Birleşik Devletleri:

    Sıralanmış bir nesnenin müteahhit serisi olduğunu anlamışlardı (seri hale getirici bağlıdır, ancak birçok ortak olanlar böyle davranır). Oluşturucu başlatma kodu koyarak kaldırması için ek destek sağlamak anlamına gelir. Bu model özel bir kodlama önler.

    Bu argüman bazı sorunlar şunlardır:

    1. Çoğu nesneler asla seri olacak. Destek çeşit eklemek gerek yokken bunu ihlal ediyor YAGNI.
    2. Bir sınıf seri hale getirme desteği gerekiyor, ama ilk bakışta seri ile alakası olmayan bir çözüm olmadan bunu sağlamak için yollar vardır.
  2. Mikro-optimizasyon: Ana argüman kimse aslında onlara erişir sadece nesneleri oluşturmak istediğiniz. Aslında bellek kullanımını en iyi duruma getirme hakkında konuşuyorsun.
    Aşağıdaki nedenlerle: bu argüman ile aynı fikirde değilim

    1. Çoğu durumda, bellekte birkaç nesneleri herhangi bir şey üzerinde etkisi var. Modern bilgisayarların şekilde yeterli bellek yok. Gerçek sorunları bir profiler tarafından onaylanan bir durum olmadan, bu pre-mature optimization ve ona karşı iyi bir nedeni vardır.
    2. Bazen optimizasyon bu tür haklı olduğu gerçeğini kabul ediyorum. Ama bu durumlarda bile geç başlatma doğru çözüm gibi görünmüyor. İki nedenden dolayı buna karşı konuşma vardır:

      1. Geç başlatma potansiyel performansa zarar verir. Bill'in cevabı gösterdiği gibi belki de sadece çok az, ama etkisi ilk bakışta düşündüğünüzden daha büyüktür. Bu yaklaşım temelde karşı bellek performansı esnaf.
      2. Eğer bir tasarım nerede yaygın bir kullanım şekli için kullanın sadece parçaları sınıfı, bu ipuçları bir sorun ile tasarım kendisi: sınıfta soru büyük olasılıkla, birden fazla sorumluluk. Çözüm daha odaklanmış, çeşitli sınıflara sınıf bölme olurdu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • Peyton

    Peyton

    28 Aralık 2008
  • pleated-jeans

    pleated-jean

    6 HAZİRAN 2013