2016-03-23 3 views
0

Ich möchte ein Objekt erstellen, das auf zwei verschiedene Arten initialisiert werden kann. Ich habe 3 verschiedene Wege gefunden, dasselbe zu erreichen, ich möchte wissen, welche meiner Methoden die beste ist, und ob es eine andere, bessere Methode gibt.Ruby-Klasse Initialisierung

Methode

attr_accessor :id, :status, :dateTime 
    def initialize *args 
    if args.length == 1 
     puts args[0] 
    @id = args[0]['id'] 
    @status = args[0]['status'] 
    @dateTime = args[0]['dateTime'] 
    else 
     @id = args[0] 
     @status = args[1] 
     @dateTime = args[2] 
    end 
    end 

Methode 2: (beachten Sie, dass ich die Parameter von Hand auf diesen einen als zweiten Weg festlegen müssen)

attr_accessor :id, :status, :dateTime 
    def initialize hash = nil 
    if hash != nil 
    @id = hash['id'] 
     @status = hash['status'] 
     @dateTime = hash['dateTime'] 
    end 
    end 

Methode 3: (beachten Sie, dass I gesetzt müssen die Parameter von Hand auf diesem ein als zweite Art und Weise, und dass es fast die gleiche wie meine zweite Art und Weise, nur nicht im Konstruktor)

attr_accessor :id, :status, :dateTime 
    def initialize 
    end 

    def self.create hash 
    if hash != nil 
     obj = Obj3.new 
     obj.id = hash['id'] 
     obj.status = hash['status'] 
     obj.dateTime = hash['dateTime'] 
     return obj 
    end 
    end 

Vielen Dank im Voraus!

+0

Welche Argumente nehmen sie? – sawa

+0

'Methode 2: (Bitte beachten Sie, dass ich die Parameter manuell als zweite Methode einstellen muss)' Ist es nicht offensichtlich, dass die zweite Methode/Weise der zweiten folgt? – sawa

+0

@sawa Vielleicht musste ich klarer sein. Es dauert ein Hash mit ID, Status und dateTime ODER ich könnte ein Objekt ohne Parameter initialisieren und sagen object.id = "eine ID" usw. –

Antwort

3

Ich würde versuchen, einen Hash für Ihren Konstruktor wie der Code angepasst unterhalb von DRY Ruby Initialization with Hash Argument

class Example 
    attr_accessor :id, :status, :dateTime 

    def initialize args 
    args.each do |k,v| 
     instance_variable_set("@#{k}", v) unless v.nil? 
    end 
    end 
end 

Auf diese Weise jede Ihrer Eigenschaften Einstellung in dem Konstruktor optional wird. Wie die instance_variable_set Methode wird jede Eigenschaft festlegen, wenn die hat einen Wert dafür enthält.

Dies bedeutet, dass Sie eine beliebige Anzahl von Möglichkeiten unterstützen können, Ihr Objekt zu konstruieren. Der einzige Nachteil ist, dass Sie mehr tun müssen, um Ihren Code zu überprüfen, aber ohne weitere Informationen ist es schwer zu wissen.

ein neues Objekt anlegen - Anwendungsbeispiele

Um ein neues Objekt mit dieser Technik zu erstellen alles, was Sie tun müssen, ist in einem Hash zu Ihrem initialiser passiert:

my_new_example = Example.new :id => 1, :status => 'live' 
#=> #<Example: @id=1, @status='live'> 

Und seine flexibel genug zu schaffen mehrere Objekte ohne bestimmte Eigenschaften mit einem Konstruktor:

my_second_new_example = Example.new :id => 1 
#=> #<Example: @id=1> 

my_third_new_example = Example.new :status => 'nonlive', :dateTime => DateTime.new(2001,2,3) 
#=> #<Example: @id=1, @dateTime=2001-02-03T00:00:00+00:00> 

Sie können noch Ihre Eigenschaften aktualisieren, sobald die Objekte erstellt wurden:

my_new_example.id = 24 
+0

Jetzt muss ich aber in der Lage sein, die Werte über Hash oder über die Interaktion mit dem Objekt zu setzen, etwa ein Objekt als obj = Example.new zu initialisieren; obj.id = "eine ID" –

+1

Nicht ganz - ich werde die Antwort mit einigen Anwendungsbeispielen aktualisieren. – Tom

+0

Also, wenn ich richtig verstehe, kann ich das Objekt mit einer beliebigen Anzahl von Parametern initialisieren, die, die nicht gegeben sind, werden Null, und ich kann sie zu einem späteren Zeitpunkt setzen? Auch wenn ich es richtig verstehe, kann ich sagen my_new_example = Beispiel.new my_new_example.id = 23 –