Protegendo a regra de negócio através de interface

Esse artigo descreve o processo de encapsulamento da regra de negócio garantindo que a mesma sempre funcione independentemente da plataforma empregada.
interface

Introdução

Todo o projeto possui sua regra de negócio, e essa regra de negócio deve ser independente da plataforma utilizada, o que normalmente não acontece durante o ciclo de vida de um produto, sendo, reduzindo os custos utilizando plataformas de baixo custo, ou até mesmo escolhendo uma plataforma que possua mais recursos para que o produto se torne diferenciado frente a concorrência. Mas para blindar o projeto de possíveis dependências geradas pela utilização de uma plataforma específica, sempre devemos pensar nessas plataformas em um meio de viabilizar o projeto e não deixar que o projeto dependa da plataforma. Uma frase bastante conhecida é Programe para uma interface e não para uma implementação.

Definindo a interface

Para exemplificar de forma prática vamos criar uma regra de negócio bem simples como piscar um LED dentro de um certo intervalo de tempo.

Para que essa regra de negócio funcione em qualquer tipo de plataforma devemos identificar as características que variam entre as plataformas para que possamos criar uma interface encapsulando essas variações, nesse exemplo precisamos de um mecanismo que espere por em determinado período de tempo, uma inicialização para que possa ser configurado as dependências da plataforma, e por fim um mecanismo que nos permita mudar o estado lógico do LED. Com essas características podemos definir como vai ser a interface.

As assinaturas da interface não são regidas no primeiro momento, mas deve ter em mente que uma vez que ganhar maturidade, é estritamente importante evitar mudá-las, para que no futuro não comprometa implementações legadas.

Implementando a regra de negócio

Com a interface definida podemos implementar a regra de negócio, dessa forma blindando contra as nuances de uma determinada plataforma.

Essa função é responsável por processar a alternância do LED baseada no atraso fornecido pelo parâmetro _delay, dito isso podemos ver como fica a implementação dessa função:

Aqui temos uma função privada que verifica se todos os ponteiros de função foram inicializados, caso estejam todos devidamente configurados retorna um true indicando que tudo ocorreu bem, no if verificamos o retorno e caso verdadeiro chama o init que é responsável pelas configurações iniciais da plataforma, e em seguida temos o while que é coração da regra de negócio onde se aguarda um tempo e aplica o estado do LED, em seguida complementa o valor e segue assim até a eternidade finita. Dessa forma garantimos que a regra de negócio irá funcionar independente da plataforma, ficando a cargo da plataforma a implementação das funções do contrato fornecida pela interface para garantir o funcionamento, e isolando as especifidades da plataforma no próprio main

Para simular esse exemplo iremos usar a plataforma PC (Personal Computer) rodando um Linux como sistema operacional, e o módulo Arduino.

Portando para o PC

No primeiro caso (PC) para preencher a interface analisamos quais funções podem atender os requisitos do contrato para o caso do atraso temos o sleep, para o init temos o printf, e finalmente para o set temos um printf imprimindo o valor do estado recebido, ficando o resultado da implementação:

Com isso podemos assinar o contrato pois as funções respeitam as assinaturas fornecidas pela interface ficando dessa forma

Uma vez a interface preechida podemos executar a função que possui a regra de negócio propriamente dita

Essa função não deve retornar em caso de sucesso, assim podemos ver o output alterando o estado do LED atráves do printf.

Portando para o Arduino

O exemplo do Arduino foi desenvolvido usando o eclipse.

Agora o mesmo exemplo portado e preenchido com as funções do Arduino, para atender os requisitos do contrato para o caso do atraso temos o delay ( essa função está milissegundos é necessário multiplicar por 1000 para ter a base em segundos ), para o init temos o pinMode, e finalmente para o set temos um digitalWrite que altera o LED com valor recebido, ficando o resultado da implementação

Declaramos a interface e preenchemos com as funções do Arduino

no setup não precisamos preencher nada, ai realizamos a chamada da função run_toogle_led na função loop

Como resultado o LED presente na placa irá ficar piscando.

Listagem Completa

hw_interface.h

hw_interface.c

main.cpp (Arduino)

main.c (PC)

Conclusão

O uso da interface garante que a regra de negócio não sofrerá alterações por características externas, como hardware, estrutura de dados e API’s, sendo necessário que esses componentes externos a regra de negócio respeitem a interface, assim resolvendo essas variações através de funções padronizadas, facilitando o intercambiamento de recursos usados no projeto.

Veja + conteúdo

Engenheiro Elétrico de Formação mas é Engenheiro de Software de profissão, Pós Graduado em Sistemas Embarcados. Apaixonado por Idiomas, mas o idioma que mais lhe fascina é a Linguagem C.
Jogador de CTF, mas prefire Battlefield 1, exige menos da capacidade cognitiva :P. Atualmente atua como desenvolvedor de sistemas distribuídos no ramo aeronáutico. Quando está de bobeira fica desenhando personagens de Anime ou pedalando pela cidade de São Paulo.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
3 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Leandro Poloni Dantas
Leandro Poloni Dantas
29/03/2021 11:26

Parabéns Adriano!

Caio Pereira
Caio Pereira
22/03/2021 12:21

Muito legal Cristiano, também pode ser adicionado que isso facilita o desenvolvimento de testes unitários, já que temos o isolamento e abstração de hw os jnjttestes podem ser executados sem nenhum problema no ambiente de desenvolvimento.

Talvez você goste:

Nenhum resultado encontrado.

Séries

Menu

WEBINAR

Inteligência Artificial na Borda

DATA: 29/06 às 15:00h