Lang keine sicheren Methodenketten [geschlossen]
So kenne ich ein paar verschiedene Ansätze, die mir bekannt sind, und ich möchte die Vor- und Nachteile der verschiedenen Möglichkeiten für verschiedene Kriterien untersuchen, die sind:
LesbarkeitPerformancease des DebuggensOO Prinzipien (niedrige Kopplung und hohe Kohäsion)Ausdrücklich mit der try-Methode von active support
person.try(:pet).try(:name).try(:upcase)
Mit einer Rettung nil
person.pet.name.upcase rescue nil
Mit einer && Operatorkette
person && person.pet && person.pet.name && person.pet.name.upcase
Monkey Patchen der Object-Klasse, siehehttps: //gist.github.com/thegrubbsian/349923 für den ursprünglichen Inhalt
class Object
def try_all(*methods)
values = [self]
methods.each do |method|
value = values.last.try(method)
return nil if value.nil?
values << value
end
values.last
end
end
person.try_all(:pet, :name, :upcase)
Sie haben keinen sicheren Code, sondern validieren die Daten, bevor Sie den Code aufrufen.
#not a good implementation by any means
def person_has_pet_with_name? person
begin
return true if !person.pet.name.nil?
rescue
return false
end
end
person.pet.name.upcase if person_has_pet_with_name?(person)