Swift Guard

Vinicius De Moura Albino
3 min readFeb 2, 2016

--

Meu primeiro contato com guard, não foi lá dos mais compreensivos. Entendi o conceito porém não entendi porque utiliza-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 a execução se essa condição não for atendida :

O conceito do guard, segue dois padrões de programação, "Happy Path", que como o próprio nome diz, o caminho feliz, é 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"), onde tudo correu como esperado. O Segundo padrão é o "Bouncer Pattern", vamos exemplificar, imagine que em uma festa fechada, só entra quem tem nome na lista, o "Bouncer Pattern", checa na entrada se seu nome esta 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 que vi de tão valioso 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 deixando seu código confuso :

Com guard, o entendimento do código é mais claro, e evitamos alguns if..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, qualquer variável opcional criada dentro desse escopo pode ser acessada pelo resto da função ou bloco (Eis o primeiro pronto 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, assim 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 um 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 utiliza-los depois do guard.

Caso de um grande Happy Path

No caso de um grande "Happy Path", onde cada condição deve retornar um erro :

Quando não utilizar o guard

If..else simples

Para tais casos simples, é muito mais fácil de 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.

--

--