Cadenas de método seguras largas y nulas [cerradas]
Por lo tanto, conozco algunos enfoques diferentes que conozco y quiero explorar las ventajas y desventajas de las diversas formas para varios criterios que son:
legibilidadactuaciónfacilidad de depuraciónPrincipios OO (bajo acoplamiento y alta cohesión)Uso explícito del método try del soporte activo
person.try(:pet).try(:name).try(:upcase)
Usando un rescate nulo
person.pet.name.upcase rescue nil
Usando una cadena de operadores &&
person && person.pet && person.pet.name && person.pet.name.upcase
Mono parcheando la clase Object, verhttps://gist.github.com/thegrubbsian/3499234 para la esencia original
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)
No tenga un código de seguridad nulo, en su lugar valide los datos antes de llamar al código
#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)