2010-03-05 24 views
5

GetComplexResult kullanmak için aşağıdaki sınıfShould sınıf yöntemleri

public class Class1 
{ 
    public int A { get; set; } 
    public int B { get; set; } 

    public int GetComplexResult() 
    { 
     return A + B; 
    } 
} 

düşünün parametreleri veya kullanım sınıfı özelliklerini kabul bu sınıfın bir tüketici yöntemini çağırmadan önce A ve B ayarlamak bilmek gerekir. GetComplexResult, sonucunu hesaplamak için birçok özelliğe erişirse, bu, tüketicinin önce tüm uygun özellikleri ayarlamaması durumunda yanlış dönüş değerlerine yol açabilir. Yani bunun yerine

public class Class2 
{ 
    public int A { get; set; } 
    public int B { get; set; } 

    public int GetComplexResult(int a, int b) 
    { 
     return a + b; 
    } 
} 

Bu yol gibi bu sınıfı yazabiliriz, GetComplexResult için bir arayan beklenen dönüş değeri doğru hesaplanır sağlanması gerekli tüm değerlere geçmek zorunda kalır. Ancak, gerekli birçok değer varsa, parametre listesi de büyür ve bu da iyi bir tasarım gibi görünmez. Aynı zamanda, A, B ve GetComplexResult kapsülleme noktalarını tek bir sınıfta kırmak gibi görünüyor. İşini yapmak için sınıfın bir örneğine ihtiyaç duymadığından, GetComplexResult statik yapmak için bile cazip gelebilirim. Bir sürü statik yöntem yapmak için etrafta dolaşmak istemiyorum.

Bu 2 farklı sınıf oluşturma yolunu açıklayan terimler var mı? Her ikisinin de artıları ve eksileri var gibi görünüyor - anlamadığım bir şey var mı, bana bir yolun diğerinden daha iyi olduğunu söylemeli mi? Birim testi bu seçimi nasıl etkiler?

cevap

5

Gerçek dünyadaki bir örnek kullanırsanız, yanıt daha da belirginleşir.

public class person 
{ 
    public string firstName { get; set; } 
    public string lastName { get; set; } 

    public string getFullName() 
    { 
     return firstName + " " + lastName; 
    } 
} 

bir varlık nesnesinin nokta bir tarafa hakkında bilgi içerir ve varlık (içerdiği bilgilere dayanarak) yapmak için ihtiyaç duyduğu işlemleri yapabilmesidir. Evet, varlığın tam olarak başlatılmamış olması nedeniyle belirli işlemlerin düzgün çalışmadığı durumlar vardır, ancak bu tasarımın başarısızlığı değildir. Eğer gerçek dünyada, henüz adlandırılmayan yeni doğmuş bir bebeğin tam adını soruyorum, bu da başarısız olur.

İşi yapan bir varlık için belirli özellikler gerekliyse, bir kurucuda başlatılabilirler.

while (person.hasAnotherQuestion()) { 
    person.answerNextQuestion(); 
} 
+0

Her zaman üyelere doğrudan erişmek yerine alıcıları aramayı denerim ve alıcıda boş bir değer döndürürsem, bir ileti kaydederim. Eskiden iddiaları kullandım, ancak daha sonra müşterilerimizin bazılarının üretimde (!) Etkinleştirilmiş iddialarla çalıştığını öğrendik. – TMN

1

İyi tasarım kural tüm kurucular geçerli devletler ve hepsi nesneleri başlatır emin olmak için ise: Diğer bir yaklaşım varlık verilen bir yöntem çağrılabilir bir durumda olup olmadığını denetler bir boolean sahip olmaktır özellik kümeleri ve yöntemleri geçerli durumu zorlar. Bu şekilde, geçersiz hallerde hiçbir zaman hiçbir nesne olmayacaktır.

0'dır A ve B için varsayılan değerler, GetComplexResult arasında geçerli bir sonuç verir geçerli bir durum değilse, yapmanız gerekir geçerli bir duruma A ve B başlatılmış bir yapıcı.

0

Bazı alanların hiçbir zaman boş bırakılmasına izin verilmezse, genellikle sınıf kurucusuna parametreler atabilirsiniz. Her zaman gerekli değerlerin tümünü bir kerede mevcut değilse, bir oluşturucu sınıfı kullanarak yardımcı olabilir. Örneğin

aşağıdaki gibidir:

public Builder { 
    private int a; 
    private int b; 

    public Class1 create() { 
     // some validation logic goes here 
     // to make sure we have everything and 
     // either fill in defaults or throw an error 
     // if needed 
     return new Class1(a, b) 
    } 

    public Builder a(int val) { a = val; } 
    public Builder b(int val) { b = val; } 
} 

Bu Oluşturucu daha sonra kullanılabilir.

Class1 obj1 = new Builder().a(5).b(6).create(); 

Builder builder = new Builder(); 
// do stuff to find value of a 
builder.a(valueOfA); 
// do stuff to find value of b 
builder.b(valueOfB); 
// do more stuff 
Class1 obj2 = builder.create(); 
Class2 obj3 = builder.create(); 

Bu tasarım hala esnek yapı süreci için izin verirken derecesi uygun ne olursa olsun hiç Varlık sınıfları kilitlemek için izin verir. Ayrıca, varlık sınıf sözleşmesini değiştirmeden inşaat sürecini diğer uygulamalarla özelleştirmek için kapıyı açar.

İlgili konular