2010-03-25 16 views
8

Ben yeni Dinamik anahtar kelime gibi ve bir yedek ziyaretçi deseni olarak kullanılabileceğini okuyun.bir yedek anahtar ifadesi olarak yeni Dinamik Kelime kullanmak kötü bir fikir mi?

Kodu tercih ettiğim daha fazla bildirimde buluyor.

'Tip' anahtarındaki tüm örnekleri, dinamik dağıtımı uygulayan bir sınıfla değiştirmek iyi bir fikirdir.

+1

Ew. Daha fazla söze ihtiyacım var. – Dykam

+0

Bunun, kafa karıştırıcı olmanın dışında, aşırı yüklenmeden nasıl farklı olduğunu göremiyorum. –

+0

@Dykam, daha ne bilmek istersiniz? – WeNeedAnswers

cevap

8

Gerçekten "iyi bir fikir" olarak düşündüğünüze göre değişir.

Bu çalışıyor ve oldukça zarif bir şekilde çalışır. Diğer yaklaşımlara göre bazı avantajları ve dezavantajları vardır.

  1. Hata denetimi potansiyel olarak:

    1. O
    2. kod uzatmak için özlü ve kolay dezavantajları için

    oldukça basittir: avantajı tarafında

    Klasik bir ziyaretçi uygulamasından daha zor, çünkü tüm hata kontrolleri çalışma zamanında yapılmalıdır. Örneğin, visitorTest.DynamicVisit(4.2); geçirirseniz, çalışma zamanında bir istisna, ancak hiçbir derleme zamanı şikayetleri alırsınız.
  2. kod az belirgin olması ve daha yüksek bakım maliyeti olabilir.

Şahsen, bu makul bir yaklaşım. Klasik bir uygulamada ziyaretçi modeli oldukça yüksek bir bakım maliyetine sahiptir ve genellikle temiz bir şekilde test edilmesi zordur. Bu potansiyel olarak maliyeti biraz daha fazla artırır, ancak uygulamayı çok daha basit hale getirir.

iyi hata kontrolü sayesinde

, burada bir yaklaşım olarak dinamik kullanarak bir sorunu yok. Şahsen, muhtemelen böyle bir yaklaşım kullanırdım, çünkü makul bir şekilde gerçekleştiren alternatifler, aksi halde oldukça kötü olur. Bununla birlikte, burada yapacağım birkaç değişiklik var. İlk olarak, bahsettiğim gibi, gerçekten hata kontrolünü dahil etmeniz gerekiyor.

class VistorTest 
{ 
    public string DynamicVisit(dynamic obj) 
    { 
     try 
     { 
      return Visit(obj); 
     } 
     catch (RuntimeBinderException e) 
     { 
      // Handle the exception here! 
      Console.WriteLine("Invalid type specified"); 
     } 
     return string.Empty; 
    } 

    // ...Rest of code 
+0

Bunu kullanarak herhangi bir ek yükü biliyor musunuz, bazı dillerde dinamik dağıtım yapmanın daha pahalı olduğunu okudum, buradaki durum bu mu? Onu seviyorum ve liberalce herşeyi benim şekerin üzerine şeker gibi serpmek istiyorum ama sadece doğru olanı okuduğumdan emin olmalıyım :) – WeNeedAnswers

+0

@WeNeedAnswers: Dinamik kullanan dinamik dağıtım aslında oldukça iyi bir şekilde optimize edilmiştir. . Bu, C# 'da esnek kalabilmeniz için bir yaklaşım kadar iyi bir ihtimaldir. Aksi halde, biliyorum en iyi (esnek) seçeneği Judith Bishop ile delege yaklaşımı ... –

+0

@WeNeedAnswers: Ben aslında bir noktada kod üretimi dayalı bir çift gönderme seçeneği uyguladı - ama Dinamik bu aynı şeyi yapar, ve daha kolay. Ben profil alırdım ama sanırım bu şekilde yapıyormuşçasına çok mutlu olacaksın. –

2

ziyaretçi deseni bazı diller yok aslında geçici bir çözüm için öncelikle mevcut:

İkincisi, ben gerçekte neler daha belirgin DynamicVisit hangi (biraz) o hale getirebileceğini, doğrudan dynamic almak yapacak double dispatch ve multiple dispatch izin verin.

çoklu gönderim veya multimethods bir işlev veya yöntem dinamik olarak bağımsız değişkenler birden fazla çalıştırma süresi (dinamik) türüne göre sevk edilebilir olan bir nesne-yönelimli dil özelliğidir. Bu, bir yöntem çağrısının, nesnenin gerçek türetilmiş türüne göre dinamik olarak gönderildiği tek bir gönderme polimorfizminin bir uzantısıdır. Çoklu dağıtım, iki veya daha fazla nesnenin bir kombinasyonu ile çalışmak için dinamik dağıtımı genelleştirir.

Sürüm 4'e kadar, C# bu dillerden biriydi. Bununla birlikte, dynamic anahtar kelimesinin tanıtımıyla, C#, geliştiricilerin, bu dağıtım mekanizmasına gösterdiğiniz gibi girmelerini sağlar. Bu şekilde kullanmakta yanlış bir şey göremiyorum.

Güvenlik türünü hiç değiştirmediniz, çünkü switch (veya C# türünde geçiş yapmasına izin vermediği sürece büyük olasılıkla sözlük gönderip vermese bile), bulamadığında atılan default kasanın olması gerekir Aramak için bir işlevi eşleştirin ve bu, bağlanacak uygun bir işlev bulamazsa tam olarak aynı şeyi yapar.

İlgili konular