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)

Respuestas a la pregunta(3)

Su respuesta a la pregunta