2008-09-04 22 views
3

Kendim için bir alıştırma olarak, bir örnek programı çeşitli dillere çeviriyordum. C# başlayarak, ben bir ziyaretçinin desenli arayüzü şöyle oldu:Dinamik dilde ziyaretçi kalıbını uygulamak için tercih edilen yol?

interface Visitor 
    { 
     void Accept(Bedroom x); 
     void Accept(Bathroom x); 
     void Accept(Kitchen x); 
     void Accept(LivingRoom x); 
    } 
yakut taşıma

(veya piton, ya da her neyse), artık türüne göre derleyici sevkini olsun. Ziyaretçiyi ziyaretçinin kendisinde yapmalı mıyım?

class Cleaner 

    def accept(x) 
    acceptBedroom(x) if Bedroom === x 
    acceptBathroom(x) if Bathroom === x 
    acceptKitchen(x) if Kitchen===x 
    acceptLivingRoom(x) if LivingRoom===x 
    end 

    ... 

Ya odanın farklı specializaions içinde sevk yapmalıdır:

class Bathroom<Room 
    def initialize(name) 
    super(name) 
    end 
    def accept(visitor) 
    visitor.acceptBathroom(self) 
    end 
end 

Ya dinamik dilde kullanılan başka tercih deyim vardır?

cevap

3

Benim önerim eski yaklaşımı kullanmaktır. Her yaklaşım için artılar ve eksiler vardır. Oda tiplerinin sayısı arttıkça eskiyi korumak daha zordur; Temizleyici tiplerinin sayısı arttıkça ikincisi daha zordur.

Ruby, sen

def accept(x) 
    send "accept#{x.class}".to_sym, x 
end 

PS deneyebilirsiniz: tüm dinamik olarak yazılan diller türüne göre sevk yapamıyoruz değil; Bazıları, türetilmiş olabilir veya aşırı yüklenen seçenekler arasında uygun yöntemi seçmek için zorla döküm kullanılabilir.

3

İkinci versiyon ile giderdim. İlki, Ziyaretçinin çözmesi gereken kod kokusunun türüne benziyor: uzun if-else-if veya switch-case ifadeleri.

İlgili konular