2011-02-09 15 views
7

İki yapım yönteminden birine dayalı olarak yeni bir örnek oluşturmak için fabrika yöntemlerini kullanmak istediğim bir sınıfa sahibim: ya bellekte verilerden oluşturulabilir, veya bir dosyada saklanan veriler. Ben yapmak istiyorum neRuby'de sınıf statik örnek başlatıcıları (yani fabrika yöntemleri)

inşaat sınıfı içinde yapılır nasıl mantığını saklanması, bu yüzden bu kadarını statik sınıf yöntemleri var istiyorum:

class MyAppModel 
    def initialize 
     #Absolutely nothing here - instances are not constructed externally with MyAppModel.new 
    end 

    def self.construct_from_some_other_object otherObject 
     inst = MyAppModel.new 
     inst.instance_variable_set("@some_non_published_var", otherObject.foo) 
     return inst 
    end 

    def self.construct_from_file file 
     inst = MyAppModel.new 
     inst.instance_variable_set("@some_non_published_var", get_it_from_file(file)) 
     return inst 
    end 
end 

var mı some_private_var'ı sınıfın kendisinden metaprogramlamaya (instance_variable_set) başvurmadan bir sınıfın örneğinde ayarlamanın yolu yok mu? Görünüşe göre, bu model örneklere meta-poking değişkenlerini gerektirecek kadar ezoterik değildir. MyAppModel'in dışındaki herhangi bir sınıfın bazı_published_var'a erişmesine izin vermeyi gerçekten istemiyorum, bu yüzden e.g. attr_accessor - sadece bir şeyleri kaçırdığım gibi hissettiriyor ...

cevap

9

Belki de bir kurucu kullanmak istediğinizi elde etmenin daha iyi bir yoludur, sadece "dış" dan örnek oluşturmak istemiyorsanız korumalı hale getirin

class MyAppModel 
    class << self 
    # ensure that your constructor can't be called from the outside 
    protected :new 

    def construct_from_some_other_object(other_object) 
     new(other_object.foo) 
    end 

    def construct_from_file(file) 
     new(get_it_from_file(file)) 
    end 
    end 

    def initialize(my_var) 
    @my_var = my_var 
    end 
end 
+1

Bu çok güzel ve deyimseldir. – Chuck

+0

Teşekkürler, bu benim yaptığımdan çok daha temiz olduğunu düşünüyorum - yine de bir sürü şeyi yapıcıya aktarmayı içeriyor, ama yine de korunduğundan beri, bu büyük bir anlaşma değil - ve örnek_variable_set'den çok daha iyi. – Matt

İlgili konular