SORU
18 Ocak 2010, PAZARTESİ


Marker Arayüzleri Kullanmak Yerine Öznitelikleri zorlayıcı Sebep

marker interfaces (herhangi bir Üye Olmadan arayüzleri) öznitelikleri tercih etmeliyiz discussed before on Stack Overflow oldu. Interface Design article on MSDN de bu öneri ileri sürmektedir:

Marker arayüzleri kullanarak (herhangi bir üyesi ile arayüzleri) kaçının.

Özel öznitelikleri bir tür işaretlemek için bir yol sağlar. Özel öznitelikleri hakkında daha fazla bilgi için, Özel Öznitelikleri Yazma konusuna bakın. Özel öznitelikler kod yürütme kadar özniteliği için kontrol erteleme zaman tercih edilir. Eğer senaryo bir derleme ise kontrol gerektirir, bu kılavuz uyumlu olamaz.

Hatta FxCop rule bu öneri uygulamak için var:

Boş arabirimleri kaçının

Arayüzleri davranış veya Kullanım Sözleşmesi sağlayan üyeleri tanımlamak. İşlevsellik arayüzü tarafından açıklanan devralma hiyerarşisinde, türü göründüğü ne olursa olsun herhangi bir tür tarafından kabul edilebilir. Bir tür arabirim üyeleri için uygulamaları sağlayan bir arabirimi uygular. Boş bir arayüz, herhangi bir üye tanımlamak değil, ve gibi, uygulanabilir bir sözleşme tanımlamıyor.

Eğer tasarım türleri uygulamak için beklenen boş arayüzleri varsa, muhtemelen bir işaret, ya da farklı türde bir grup tanımlamanın bir yolu olarak bir arayüz kullanıyorsunuz. Eğer bu kimlik, çalışma zamanında gerçekleşir ise, bunu yapmak için doğru yolu özel bir öznitelik kullanmaktır. Öznitelik ya da öznitelik özelliklerini, varlığı ya da yokluğu hedef türlerini tanımlamak için kullanın. Eğer bu tanımlama derleme zamanında gerçekleşmesi gerekir, o zaman boş bir arabirim kullanarak kabul edilebilir.

Türleri için zaman kimlik derlemek istediğinizde. madde Birleşik Devletleri uyarıyı gözardı edebilirsiniz bunun tek nedeni var: (Bu Arayüz Tasarımı makale ile tutarlıdır).

Güvenli eğer arayüzü derleme zamanında tür bir dizi tanımlamak için kullanılır, bu kuraldan bir uyarı hariç.

İşte asıl soru: Microsoft Çerçeve Sınıf Kütüphanesi tasarımında kendi önerisi (en azından bir kaç durumda) uygun değildi: IRequiresSessionState interface IReadOnlySessionState interface. Bu arabirimler ASP.NET çerçevesi tarafından özel bir işleyici için oturum durumunu etkinleştir gerekir olup olmadığını kontrol etmek için kullanılır. Belli ki, bir tür derleme zamanı tanımlama için kullanılan bir şey değil. Yapmadılar neden? İki olası nedeni olabilir:

  1. Mikro-optimizasyon: bir öznitelik (type.IsDefined(typeof(SessionStateAttribute), true)) kontrol etmek için bir nesneye bir arabirim (obj is IReadOnlySessionState) yansıma kullanarak daha hızlı uygular olup olmadığını Kontrol ediyorum. Fark önemsiz çoğu zaman ama aslında ASP.NET çalışma zamanı performansı-kritik kodu yol için önemli olabilir. Ancak, her işleyici türü için sonuç önbellekleme gibi kullanmış olabilirler geçici çözümler vardır. İlginç olan şey ASMX Web Hizmetleri benzer performans özellikleri tabi ki) aslında bu amaç için WebMethod attribute EnableSession property kullanın.

  2. Uygulama arayüzleri üçüncü taraf tarafından nitelikleriyle dekorasyon türleri daha potansiyel olarak daha fazla desteklenen olması muhtemeldir .NET dilleri. Beri ASP.NET üzere dizayn edilmiş olması dil agnostik, ve ASP.NET kodu oluşturur türleri (muhtemelen bir üçüncü taraf dil yardımıyla CodeDom) uygulayan dedi arayüzleri dayanarak EnableSessionState öznitelik <%@ Page %> directive, belki daha mantıklı kullanın arayüzleri yerine bağlıyor.

Öznitelikler yerine marker arayüzleri kullanmak için ikna edici nedenler nedir?

Bu sadece bir (erken?) optimizasyon veya çerçeve tasarımında ufak bir hata mı? reflection is a "big monster with red eyes"? sence onlar () Düşünceler?

CEVAP
7 AĞUSTOS 2010, CUMARTESİ


Genel bir tür işaretleyici için bir arayüz olarak aynı genel parametre kullanmak isteyebilirsiniz. Bu özniteliği tarafından ulaşılabilir değildir

interface MyInterface<T> {}

class MyClass<T, U> : MyInterface<U> {}

class OtherClass<T, U> : MyInterface<IDictionary<U, T>> {}

Bu tür bir arabirim başka bir ile ilişkilendirmek bir türü için yararlı olabilir.

Marker bir arabirim için başka bir iyi kullanın kind of mixin oluşturmak istediğiniz zaman

interface MyMixin {}

static class MyMixinMethods {
  public static void Method(this MyMixin self) {}
}

class MyClass : MyMixin {
}

acyclic visitor pattern da onları kullanır. Terim "arayüz" bazen de kullanılır. dejenere

GÜNCELLEME:

Eğer bu sayılır mı bilmiyorum, ama onları post-compiler bir ders üzerinde çalışmak için işaretlemek için kullandım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006
  • Toddler Fun Learning

    Toddler Fun

    8 ŞUBAT 2013
  • FF Radioo

    FF Radioo

    14 ŞUBAT 2007