2010-08-30 9 views
5

Ben gerçekçi istemci kodu diğer kamu erişimci özelliklerini/yöntemlerle kendini yapabileceğini sadece 'yardımcı' yöntemlerdir bazı fonksiyonları ile bir sınıf var ve bir gaz giderici özellikleri olarak bu tanımlamalıdır olmadığı konusunda ben kararsız değilim örneği örnek olarak alan örnek yöntemleri veya statik yöntemler. Ayrıca, kodumun arabirime karşı uygulanan herhangi bir sınıfı kullanmasına izin vermek için, inşaat dışında hemen hemen her yerde kullanılan sınıftan çıkarılmış bir arabirim de var.C# de yardımcı yöntemler: Statik mi yoksa statik olmayan mı?

soru görünümünde bir tasarım açısından iyi olan nedir? Örneğin, bu sınıftan baş harfini almanın bir aracı olarak: örnek olduğu gibi, mülkiyet kısa, daha okunabilir müşteri koduna kendisi verir, ama kendi uygulama yazmak IPerson karşı uygulanması kimse gerektirecektir

class Person : IPerson { 
    private string name; 

    public string Name { get { return this.name; } } 

    // Property with getter 
    public string Initial { get { return this.name.Substring(0,1); } } 

    // Instance method 
    public string GetInitial { return this.name.Substring(0,1); } 

    // Static method 
    public static string GetInitial(IPerson person) { 
    return person.Name.Substring(0,1); 
    } 
} 

yöntem.

Statik yöntem, uygulama sınıflarının kendi yazmaları gerekmeyeceği anlamına gelir ve kodum, adın ilk başta isme bağlı olarak nasıl belirlendiğini garanti edebilir, ancak bu, arabirimde ve istemci kodunda bulunamayacağı anlamına gelir. biraz daha ayrıntılı.

sadece o yardımcı yöntemler nasıl hesaplandığını belirtmek için sınıfları uygulama izin vermek iyi bir fikirdir olup olmadığını aşağı geliyor?

DÜZENLEME: Minör bir yana, neden SO bana en iyi uygulamaları etiketi eklemek izin vermiyor?

+0

Henüz en iyi uygulama etiketi yok gibi görünüyor. Yeni etiketler oluşturmak için en az 1500 itibara ihtiyacınız var. – M4N

+0

Bu garip .. kesinlikle vardı, geçmişte kullandım. – Flynn1179

+2

meta etiketleri ölümü (örn en iyi uygulamalar): http://blog.stackoverflow.com/2010/08/the-death-of-meta-tags/ – M4N

cevap

10

Nasıl bir uzantısı yöntemi hakkında?

namespace IPersonExtensions 
{ 
    public static class IPersonExtensionClass 
    { 
     public static string Initial(this IPerson @this) 
     { 
      return @this.name.Substring(0, 1); 
     } 
    } 
} 

böyle kullanın:

string initial = person.Initial(); 

Bu şekilde, uygulanmasını paylaşabilir miras veya kod yeniden yazmak zorunda kalmadan. Ayrı ad alanını kullanmak, kullanıcıların bu kodu kullanmak isteyip istemediklerini seçmelerini sağlar.

+0

Bunu düşünmüyordum ... ama bu yöntemin muhtemelen bir dizge döndürmesi gerektiğini tahmin ediyorum :) – Flynn1179

+3

Görünüşe göre Flynn bu sınıfı sıfırdan yaratıyor. Bu durumda, kaynak koduna erişiminiz olduğu için bir uzantı yöntemi kullanılmamalıdır. Temel sınıfı değiştiremez veya genişletemezseniz uzatma yöntemleri kullanılmalıdır. MSDN Genel Kılavuz Hatları http://msdn.microsoft.com/en-us/library/bb383977.aspx "Genel olarak, uzantı yöntemlerini idareli ve yalnızca gerektiğinde gerçekleştirmenizi öneririz. Mümkün olduğunda, istemci kodu Mevcut tür, mevcut türden türetilmiş yeni bir tür oluşturarak bunu yapmalıdır. " – sgriffinusa

+0

@Flynn: Yorumunuzu yazarken bunu düzeltmiş olmalıyım. :) –

1

İleri geri giderim, ancak statik olmayan yapma eğiliminde değilim.

Durum:: 0: İşlev, üye değişkenlerini kullanmadığını ve durumunu vatansız bıraktığını bildirmenizi zorlar. Yanlışlıkla üye değişkenlere ihtiyaç duyarak durumun içine girmesine izin verirseniz, derleyici sizi uyarır ve somut bir karar vermeniz gerekir.

Bir üye işlevi için durum: Statik işlevlerin devralması zordur, bu nedenle davranışı değiştirmek zordur. Başka bir şeyi test etmek için bu işlevi yerine koymak daha zor olduğu için testi daha da zorlaştırır. Başlangıçta kullandığınız bir şey olduğunu ve test için özel bir şey döndürmek istediğinizi varsayalım ...

Bir uzantı olarak (ve aşırı bir örnek), bazı uzantılarım bir beton sınıfını bulmak için bir IOC kabı kullanıyor ve Bunun üzerine üye.