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)

Antworten auf die Frage(3)

Ihre Antwort auf die Frage