Guard clause é o termo usado em Ruby para uma estrutura de código em programação, também conhecida como early return em outras linguagens. Esse padrão é bastante utilizado para reduzir a quantidade de blocos if
e else
no código que estamos desenvolvendo. Vamos ver um exemplo simples:
def full_name(name, last_name, title)
if title.nil?
print "#{name} #{last_name}"
else
print "#{title} #{name} #{last_name}"
end
end
No exemplo de código Ruby acima temos um método full_name
que recebe name
(nome), last_name
(sobrenome) e title
(forma de tratamento utilizada como sinal de respeito). Se title
é fornecido, queremos que o método retorne o nome completo com tratamento, caso contrário, retorne apenas o nome completo. Agora vamos ver como esse código poderia ser escrito usando guard clause.
def full_name(name, last_name, title)
return print "#{name} #{last_name}" if title.nil?
print "#{title} #{name} #{last_name}"
end
No exemplo acima você deve ter notado que usamos a guard clause para retornar o resultado do método print
. Elas também podem ser utilizadas para simplesmente evitar a execução de um trecho do código ou para antecipar o retorno do valor final de um método:
def send_welcome_email(user)
return if user.nil?
# evitamos a chamada para enviar o email caso a variável esteja vazia
user.send_email('Bem-vindo às guard clauses')
logger.info("Email enviado com sucesso para #{user.email}")
end
def admin?
return true if user.role == 'admin'
# antecipando o retorno do método
print 'Usuário não autorizado'
false
end
Para finalizar, você pode ter várias guard clauses dentro do mesmo bloco de código. No exemplo abaixo, o método event_fee
deve retornar a taxa cobrada do usuário para comprar ingressos de um evento de acordo com algumas regras:
def calculate_fee(event, user)
return 0 if event.free?
return 5 if user.vip?
10
end
É isso, espero que com essa dica seu código fique cada vez mais enxuto!