C#

2011-10-14 14 views
5

'da bir kurucudan çağrıcı örneği yöntemi Çeşitli başlatma işlemlerini gerçekleştiren oldukça uzun bir yapıcım var ve bu çalışmanın bazılarını bazı işlevlere dahil etmek istedim. Bu, söz konusu işlevler örneğini veya statik yöntemleri yapmam gerekip gerekmediğini merak etti. Bir yapıcıdan sanal bir işlev çağırma riskini anlıyorum ama aynı zamanda% 100 örneklenmemiş bir nesne üzerinde bir örnek yöntemini çağırmak konusunda doğru olmayan bir şey olduğunu düşünüyorum. Elbette bu bir çelişkidir.C#

Bu konudaki halkların görüşleriyle ilgilenirim. Ayrıca, başlangıçtaki bir değişkeni döndürmek için statik bir yöntem kullanarak, üyeyi salt okunur hale getirebileceğimi de buldum. İşte senaryonun basitleştirilmiş bir örneğidir.

public class A 
{ 
    private readonly string _foo; 

    public A() 
    { 
     _foo = InitialiseFoo(); 
    } 

    private static InitialiseFoo() 
    { 
     // Do stuff 
     return new string ("foo"); 
    } 
} 
+1

Neden uzun bir kurucunuz var? Kurucular böyle olmamalı. Uzun işlemleri gerçekleştirmek için yöntemler kullanmalısınız. Bazı API'leri kullanmaya çalıştığınızda bu API her zaman çok sinir bozucudur ve bu API, kurucusunda veritabanı erişimi ve içeriği gerçekleştirir ve özel olarak istisnalar ve şeyler atar. Yap onu. Gerçekten sinir bozucu. Yapıcılar basit olmalı. –

+0

Bu konuda size tamamen katılıyorum, ancak ilk önce bir yapılandırma dosyasından hizmet adını alması gereken bir windows hizmeti kodluyorum. Bir servisin ismini sadece kurucunun içinde ayarlayabilirsin, ben de buna bağlı kaldım. – user738134

cevap

4

Bu, bir yapıcıda örnek yöntemini çağırmak için oldukça normaldir; üstelik, Başlangıç ​​işlemini yapan yöntem. Yani temelde static değiştirici ile ilgili olarak bu bir yapıcı yöntem gövdesine azaltmak için Extract Method refactorig bir tür, yani ayrı bir yöntem haline başlatma parçasını çıkarmak ve yapıcı vb giriş argümanların tasarrufu, üzerinde farkındadır ...

.. Bazen (inanıyorum çünkü bu iyi değil çünkü refactor için başka bir yol olduğuna inanıyorum - benim bakış açısından) bir temel kurucu sonuçları geçmek için bir yöntem çağırmak gerekir bu yüzden bu durumda aramak için statik olarak işaretlemek zorunda diğer durumlarda statik bağlamda sadece yapıcı, beca statik üyeleri kullanmayı ben arzu anlayabiliyorum

public A() 
: base(GetLogger()) 
{ 
} 

private static ILog GetLogger() ... 
+0

+1, ekstraksiyon yönteminden bahsetmek için, tüm bu, –

1

statik değiştirici olmadan bırakın Bunu kullan, kodu neyin başlatıldığını ve nelerin yapılmadığını takip etmek zorunda kalmadan kullanmak için daha kolay hale getirir, ancak muhtemelen kendiniz için işleri gereksiz yere karmaşıklaştırırsınız. C# 'da bir örnek yöntemini çağırmak, yapmak için iyi bir nedeniniz olduğu sürece iyi. Örneğin, bazı ortak görevleri yerine getiren çok sayıda kurucunuz varsa, işi yapmak için tek bir üye işlevi oluşturmak, her kurucu için kodu kopyalayıp yapıştırmaktan daha kolaydır. Yöntemin, başlangıç ​​durumuna döndürülen durumu yeniden sınıflandırma gibi bir şey için kurucunun dışında yeniden kullanılabileceği bir durumu da hayal edebilirsiniz.

Statik yöntem iyi, ancak yalnızca yalıtılmış işler yaptığınızda ve sonucu üye değişkenine koyduğunuzda çalışacaktır. Çok temiz, fonksiyonel programlama benzeri bir his sağlar. Eğer çalışmalardan herhangi biri sınıf durumunu içeriyorsa, çirkinleşecek.

+0

'dır, hepsi de bazı ortak görevleri yerine getiren bir dizi kurucuya sahipse, bunları genellikle 'MyCTor: this (arg1, arg2)' ye çağırarak yapıcı. – nicodemus13