Prefira cláusula de proteção a condições aninhadas

Eu enviei meu primeiro PR Rails hoje. Há um exemplo de uso de cláusula de proteção que eu acho que merece uma descrição:

Meu primeiro código parecia com este:

def check_validity!
if through_reflection.nil?
raise HasManyThroughAssociationNotFoundError.new(active_record.name, self)
end

if through_reflection.polymorphic?
raise HasManyThroughAssociationPolymorphicThroughError.new(active_record.name, self)
end

if has_one? && through_reflection.polymorphic?
raise HasOneAssociationPolymorphicThroughError.new(active_record.name, self)
end

...
check_validity_of_inverse
!
end

Isso me deu uma especificação falha. A razão era que, se through_reflection.polymorphic?fosse verdade, meu caso de has_one? && through_reflection.polymorphic?nunca deveria ser motivo de preocupação.

Então mudei para cima:

def check_validity!
if through_reflection.nil?
raise HasManyThroughAssociationNotFoundError.new(active_record.name, self)
end

if has_one? && through_reflection.polymorphic?
raise HasOneAssociationPolymorphicThroughError.new(active_record.name, self)
end

if through_reflection.polymorphic?
raise HasManyThroughAssociationPolymorphicThroughError.new(active_record.name, self)
end

...
check_validity_of_inverse
!
end

Código funcionou. Especificações aprovadas. É hora de refatorar um pouco:

def check_validity!
if through_reflection.nil?
raise HasManyThroughAssociationNotFoundError.new(active_record.name, self)
end

if through_reflection.polymorphic?
raise HasManyThroughAssociationPolymorphicThroughError.new(active_record.name, self) if has_one?
raise HasOneAssociationPolymorphicThroughError.new(active_record.name, self)
end

...
check_validity_of_inverse
!
end

Mucha melhor!