Her şeyden önce iyi bir soru. "En iyi uygulamaları" körü körüne kabul etmek yerine, yardımcı programa odaklanmanıza hayranım. Bunun için +1.
Bu kılavuzu daha önce okudum. Bununla ilgili bir şeyleri hatırlamanız gerekiyor - bu sadece bir rehberdir, temel olarak programlamayı bilen fakat bir şeyleri yapmanın C # yöntemine aşina olmayan C # yeni başlayanlar için. Kuralların bir sayfası kadar değil, işlerin genellikle nasıl yapıldığını açıklayan bir sayfa olduğu kadar değildir. Zaten her yerde bu şekilde yaptıklarından, tutarlı kalmak iyi bir fikir olabilir.
Meseleye cevap vereceğim, sorularınızı cevaplayarak.
Öncelikle, bir arayüzün ne olduğunu zaten bildiğinizi varsayıyorum. Bir temsilci gelince, bir yönteme yazılan bir işaretçi, this
o yöntem için argümanı temsil eden nesneye isteğe bağlı bir işaretçi ile birlikte içeren bir yapı olduğunu söylemek yeterli . Statik yöntemlerde, son işaretçi boştur.
Aynı zamanda delegelere benzeyen, ancak bu yapıların birçoğuna atanan Çok Noktaya Yayınlı delegeler de vardır (çok noktaya yayın delegesine davet etmek için yapılan tek bir çağrı anlamına gelir, atanan çağrı listesindeki tüm yöntemleri çağırır).
Gelecekteki bir tasarım deseni ile ne demek istiyorlar?
C # 'daki olayların kullanılması anlamına gelir (bu son derece kullanışlı kalıbı karmaşık bir şekilde uygulamak için özel anahtar kelimeler vardır). C # olayları çok noktaya yayın delegeleri tarafından desteklenir.
Bu örnekte olduğu gibi bir etkinlik tanımladığınızda:
class MyClass {
// Note: EventHandler is just a multicast delegate,
// that returns void and accepts (object sender, EventArgs e)!
public event EventHandler MyEvent;
public void DoSomethingThatTriggersMyEvent() {
// ... some code
var handler = MyEvent;
if (handler != null)
handler(this, EventArgs.Empty);
// ... some other code
}
}
Derleyici aslında bunu aşağıdaki koda dönüştürür:
class MyClass {
private EventHandler MyEvent = null;
public void add_MyEvent(EventHandler value) {
MyEvent += value;
}
public void remove_MyEvent(EventHandler value) {
MyEvent -= value;
}
public void DoSomethingThatTriggersMyEvent() {
// ... some code
var handler = MyEvent;
if (handler != null)
handler(this, EventArgs.Empty);
// ... some other code
}
}
Daha sonra yaparak bir etkinliğe abone olursunuz.
MyClass instance = new MyClass();
instance.MyEvent += SomeMethodInMyClass;
Hangi aşağı derler
MyClass instance = new MyClass();
instance.add_MyEvent(new EventHandler(SomeMethodInMyClass));
Yani bu C # (ya da genel olarak .NET) içinde oluyor.
Bir temsilci kullanılırsa kompozisyonun kolay olduğu ortaya çıktı?
Bu kolayca gösterilebilir:
Kendisine iletilecek bir dizi eyleme bağlı bir sınıfınız olduğunu varsayalım. Bu eylemleri bir arayüze yerleştirebilirsiniz:
interface RequiredMethods {
void DoX();
int DoY();
};
Ve sınıfınıza eylemleri geçmek isteyen herkes ilk önce bu arayüzü uygulamak zorunda kalacaktı. Veya aşağıdaki sınıfa bağlı olarak hayatlarını kolaylaştırabilirsiniz :
sealed class RequiredMethods {
public Action DoX;
public Func<int> DoY();
}
Bu şekilde arayanlar sadece bir RequiredMethods örneği oluşturmak ve çalışma zamanında delegelere bağlama yöntemlerini kullanmak zorundadır. Bu ise genellikle daha kolaydır.
Bu tür şeyler yapmanın doğru koşullar altında son derece yararlıdır. Bir düşünün - neden tek umurunda olduğunuz bir uygulamanın size iletilmesiyken bir arayüze bağlısınız?
Bir grup ilgili yöntem olduğunda arayüz kullanmanın faydaları
Arayüzlerin kullanılması faydalıdır çünkü arayüzler normalde açık derleme zamanı uygulamaları gerektirir. Bu, yeni bir sınıf oluşturduğunuz anlamına gelir.
Tek bir pakette bir grup ilgili yönteminiz varsa, bu paketin kodun diğer bölümleri tarafından tekrar kullanılabilir olması yararlı olacaktır. Yani bir grup delegeyi oluşturmak yerine bir sınıfı başlatabilirlerse daha kolay olur.
Bir sınıf sadece bir uygulamaya ihtiyaç duyuyorsa arayüz kullanmanın faydaları
Daha önce belirtildiği gibi, arayüzler derleme zamanında uygulanmaktadır - bu, bir delegenin çağrılmasından daha verimli oldukları anlamına gelir (bu, kendi başına bir indirme seviyesidir).
"Bir uygulama", tek bir iyi tanımlanmış yerin bulunduğu bir uygulama anlamına gelebilir.
Aksi bir uygulama programında herhangi bir yerden gelebilir sadece olur yöntem imzası uygundur. Bu, daha fazla esneklik sağlar, çünkü yöntemlerin açıkça belirli bir arayüzü uygulayan bir sınıfa girmekten ziyade, yalnızca beklenen imzaya uyması gerekir. Ancak bu esnekliğin bir bedeli olabilir ve aslında Liskov Yer Değiştirme ilkesini ihlal eder , çünkü çoğu zaman açıklık istersiniz, çünkü kaza şansını en aza indirir. Tıpkı Statik Yazma gibi.
Bu terim ayrıca buradaki çok noktaya yayın delegelerine de atıfta bulunabilir. Arabirimler tarafından bildirilen yöntemler bir uygulama sınıfında sadece bir kez uygulanabilir. Ancak delegeler sırayla çağrılacak olan birden fazla yöntem biriktirebilirler.
Sonuç olarak, rehber yeterince bilgilendirici değil gibi görünüyor ve sadece olduğu gibi işliyor - bir rehber, bir kural defteri değil. Bazı tavsiyeler aslında biraz çelişkili görünebilir. Neyi uygulamanın doğru olup olmadığına karar vermek size bağlıdır. Kılavuz bize genel bir yol gösteriyor gibi görünüyor.
Umarım sorularınız memnuniyetinize cevaplanmıştır. Ve yine, soru için kudos.