Padrão de Projeto: Cláusula de Guarda
(3620) (2)
CategoriasAndroid, Design, Protótipo
AutorVinÃcius Thiengo
VÃdeo aulas186
Tempo15 horas
ExercÃciosSim
CertificadoSim
CategoriaEngenharia de Software
Autor(es)Vaughn Vernon
EditoraAlta Books
Edição1ª
Ano2024
Páginas160
Tudo bem?
Esse artigo é provavelmente o menor artigo sobre engenharia de software aqui no Blog, pois o padrão Cláusula de Guarda é bem simples e com uma explicação ainda mais simples.
Esse padrão é também utilizado no método de refatoração Compor Method.
Além de ser um dos poucos, ou o único, mais tranquilo de entender do que o padrão Singleton.
Antes de prosseguir, não esqueça de se inscrever na 📫 lista de e-mails do Blog para receber em primeira mão todos os conteúdos exclusivos sobre desenvolvimento e codificação limpa.
Abaixo os tópicos presentes neste artigo:
Apresentação
Com o padrão Cláusula de Guarda temos como objetivo criar rotas de saída do algoritmo de forma rápida, diminuindo o número de códigos aninhados e evitando que o código de processamento complexo (ou código principal) seja atingido quando não necessário.
O padrão proposto aqui é comumente utilizado para:
- Checar parâmetros de entrada e retornar erro (ou algum valor padrão) quando eles não têm os valores adequados;
- Checar o estado do objeto atual para saber se o método (ou função, para quem está no modo procedural) poderia ou não ser invocado naquele momento, caso não, retorna um erro ou qualquer outro código padrão nessa situação;
- Checar condições triviais e então retornar rapidamente um valor correspondente.
Código de exemplo
Abaixo um exemplo de um código problemático.
Nesse código a leitura dele não é otimizada devido às aninhações e à mistura de código de retorno trivial junto a código de processamento complexo:
...
public Produto merge( Produto a, Produto b ){
Produto resultado;
if( a != null ){
if( b != null ){
/* O código complicado do merge vem aqui. */
}
else{
resultado = a;
}
}
else{
resultado = b;
}
return resultado;
}
...
Aplicando o padrão Cláusula de Guarda temos:
...
public Produto merge( Produto a, Produto b ){
if( a == null ){
return b;
}
if( b == null ){
return a;
}
/* O código complicado do merge vem aqui. */
}
...
Sério. É simples assim.
Condições triviais devem ser testadas o quanto antes e evitando códigos aninhados.
Curiosidade:
Caso não tenha achado o motivo "perda de leitura de código" forte o suficiente para a utilização desse padrão.
Tenha em mente que 90% do dinheiro e tempo investido na evolução de um projeto de software é somente para leitura e entendimento do código por parte dos programadores.
Por isso há também muitos padrões de projeto com o objetivo principal de remover código duplicado, pois, a princípio, esse é o principal problema no desenvolvimento de software.
Conclusão
Não consigo nem mesmo apresentar os pontos positivos ou negativos desse padrão.
Na verdade somente vejo pontos positivos.
De qualquer forma, se você estudar a fundo engenharia de software, muito provavelmente vai acabar por remover boa parte dos condicionais de seus códigos, utilizando no lugar:
- Polimorfismo;
- e Composição Estratégica.
Então é isso.
Por fim, não deixe de se inscrever na 📩 lista de e-mails do Blog para receber os conteúdos de desenvolvimento e codificação limpa exclusivos... e em primeira mão.
Abraço.
Fontes
Replace Nested Conditional with Guard Clauses
Comentários Facebook