OAP — Programação Orientada a Aspecto com Spring — Parte 1.

Mantenha as funcionalidades dos seus softwares coesas e desacopladas utilizando Programação Orientada a Aspectos.

Manter a alta coesão e o baixo acoplamento é o que sempre queremos nos nossos projetos de software. Esses são uns dos princípios chaves da Programação Orientada a Objetos(OO).

Sabemos que para manter esses princípios ativos existem padrões e definições bastante conhecidas no mundo OO como: Inversão de Controle, Injeção de Dependências, Design Patterns, princípios S.O.L.I.D, etc. Resumo todos esses padrões ao quanto você consegue abstrair o conceito de negócio da implementação e também de requisitos não-funcionais.

É provável que em muitos casos alguma solução utilizando apenas OO atenda o que precisamos fazer. Mas, existem muitos casos onde deparamos com a necessidade de implementação de certas funcionalidades que simplesmente a OO não atende muito bem. Vejamos o exemplo a seguir:

No código anterior, estamos tentando saber quanto tempo esse método levou para ser executado e mandar essa informação para um log. Parece ser algo muito simples, mas veja que estamos ferindo um princípio citada no começo desse artigo. Isso mesmo, coesão! Esse método tem duas responsabilidades, salvar o cliente e verificar o tempo de execução para essa tarefa. Imagine que isso estaria espalhado em todos os métodos do seu software, isso é muito ruim, não é mesmo? Qualquer mudança nessa regra levaríamos muito tempo para mudar em todos os lugares. Poderíamos utilizar a OO, refatorar o código e encapsular essas regras em uma classe que seja responsável só por isso. Veja o próximo exemplo:

Parece uma ótima solução, mas na verdade não é. O que fizemos foi apenas colocar o código em outra classe, isso não é programação orientada a objetos, é procedural, porém em um arquivo separado. Esse código já tinha o problema da falta de coesão e agora ele ganhou outro, isso mesmo acoplamento! Não resolvemos a coesão pois o método salvar ainda continuou com as duas responsabilidades e agora conhece muito a classe MetricaExcucao. Algumas pessoas podem estar sugerindo ao invés de instanciar essa classe dentro do método recebe-la no construtor e utilizar Inversão de Controle e Injeção de Dependência para tentar resolver o acoplamento. Mesmo assim não resolveria o problema, as classes continuariam acopladas. Imagine que algum dia ao chamar o método para guardar no log tivéssemos que passar algum parâmetro com informações extras, como o nome da classe e nome do método, precisaríamos ainda modificar todas as partes do sistema pois essa classe conhece muito a classe de métrica. Na próxima parte do artigo irei mostrar como podemos resolver esse problema utilizando Programação Orientada a Aspecto utilizando Spring Boot e veremos ainda alguns conceitos importantes sobre OAP.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.