Concrete Logo
Hamburger button

Swift Guard

  • Blog
  • 11 de Fevereiro de 2016
Share

Esse post foi originalmente publicado no Medium pessoal do autor. Confira aqui.

Meu primeiro contato com guard não foi lá dos mais compreensivos. Entendi o conceito mas não entendi por que utilizá-lo ao invés de um simples if..let, que me parecia muito mais simples e objetivo. Porém, depois de alguns exemplos e alguns casos mais complexos, vi o potencial de tal condicional.

A finalidade do guard é validar alguma condição e forçar uma parada à execução se essa condição não for atendida :

O conceito do guard segue dois padrões de programação. O primeiro é o Happy Path que, como o próprio nome (caminho feliz) diz, é um cenário padrão que não é caracterizado por condições excepcionais ou erros, ou seja, o “Happy Path” da nossa função é o print(“mais que 18 anos”), no qual tudo correu como esperado. O segundo padrão é o Bouncer Pattern“: imagine que só entra quem tem nome na lista em uma festa fechada. O “Bouncer Pattern” checa na entrada se seu nome está na lista, obviamente te colocando no olho da rua caso contrário. Utilizando ambos os padrões, o código fica mais limpo e lida com as verificações de condicional em apenas um lugar em vez de vários if..else espalhados pelo código.

Evitando a tão temida Pyramid of Doom

O primeiro uso valioso que vi com guard foi evitar a temida “Pyramid of Doom”. Não que eu já tenha feito isso, mas algumas vezes precisamos criar alguns if..else para verificar se uma ou mais condições são atendidas, o que deixa o seu código confuso:

Com guard, o entendimento do código é mais claro e evitamos algunsif..else :

Acesso a valores fora das chaves

Guard é uma instrução condicional que exige uma execução para sair do bloco atual. Se uma condição não for atendida, o bloco de retorno é executado e qualquer variável opcional criada dentro desse escopo pode ser acessada pelo resto da função ou bloco (eis o primeiro ponto tão gracioso do guard):

Vantagens no exemplo acima :

  • Colocando o guard no topo da função em vez de colocar todo o escopo dentro de um grande if estamos garantindo que a condição não é parte do trabalho fundamental da função;
  • Utilizando o guard, fica claro a qualquer outra pessoa que ler o código que essa se essa condição for falsa, o retorno deverá ser imediato. E se por acaso a condicional for retirada, o código não irá compilar pela permanência apenas do else;
  • Unwrapping optionals: diferente do if let, que faz o unwrapping do valor apenas dentro das chaves, o guard adiciona valores unwrapped fora do escopo, assim você pode utilizá-los depois do guard.

Caso de um grande Happy Path

No caso de um grande “Happy Path”, no qual cada condição deve retornar um erro:

Quando não utilizar o guard

If..else simples

Para tais casos simples, é muito mais fácil entender e conceituar um ou dois if..else.

Não colocar o código complexo dentro do else

Guard não deve ser mais do que uma saída precoce simples. Ok se for necessário fazer registros de diagnóstico para debug, mas raramente outra coisa, por isso a utilização apenas do throw nos exemplos anteriores.

Regra de ouro: um guard não deve nunca ter mais do que duas ou três linhas de código.

Entendido? Se ficou alguma dúvida ou tem alguma outra dica sobre o Guard, deixe nos comentários! Até a próxima!