Logo do Venturus
Mobile: Os benefícios do paradigma declarativo
  • 14 de fevereiro de 2023
  • Blog

Mobile: Os benefícios do paradigma declarativo

Nesta série de artigos, vamos apresentar para vocês uma grande mudança que vem sendo observada no ambiente de desenvolvimento Mobile: o uso cada vez maior de Frameworks e bibliotecas que utilizam o paradigma declarativo.

Seja desenvolvimento nativo, híbrido, multiplataforma ou Web Apps, todos eles usam cada vez mais os conceitos desse paradigma e isso não é por acaso.

Vamos apresentar os principais conceitos do paradigma declarativo, entender o que causou essa necessidade entre os desenvolvedores, avaliar diversos Frameworks de desenvolvimento que temos hoje disponíveis e tentar prever mudanças no formato de desenvolvimento Mobile que teremos futuramente.

Começamos definindo o paradigma declarativo e comparando-o ao paradigma imperativo.

 

Paradigma Imperativo vs Declarativo

Primeiramente, é importante entender o paradigma declarativo como um contraponto ao paradigma imperativo:

  • Imperativo: declarações que acessam diretamente estados do sistema e os modificam. Elas são focadas em como fazer as coisas passo-a-passo. Aqui, falamos de assignar diretamente objetos e estruturas de dados. Nós instruímos a máquina a alterar seus estados.
  • Declarativo: foco em definir a lógica de programação e não mais em detalhes do fluxo de controle. Instruímos a máquina sobre “o que fazer” e não mais “como fazer”! Aqui, falamos sobre declarar propriedades do resultado que esperamos obter e não em como computar essa lógica.

Vamos especificar um pouco mais cada paradigma e entender melhor que tipos de programação pertencem a cada paradigma:

 

Estruturas demonstrando o funcionamento dos paradigmas impertativo (estrturada, procedural e orientada a objetos) e declarativo (funcional, reativa e lógica)

 

Vale ressaltar que, com o avanço da computação e o surgimento de linguagens cada vez mais robustas e complexas, é difícil dividirmos as linguagens em apenas um paradigma ou tipo de programação.

Mas, para entendermos melhor cada paradigma, vamos especificar cada um deles em 3 tipos de programação. Quando falamos de paradigma imperativo, estamos falando de uma programação:

  • Estruturada: com estruturas de código, declarações e sub-rotinas. É sobre criar estruturas de código, como blocos com if/else, while, for, etc.
  • Procedural: é a ideia de agrupar tarefas em processos e criar funções para executar pequenas tarefas de código.
  • Orientada a Objetos: o conceito de criar objetos que contenham dados e lógica, representando modelos dos nossos dados ou do mundo real.

Fica até um pouco complexo falar desse jeito formal, mas isso é o que já fazemos no nosso dia-a-dia usando Java, Swift, Python, C++, Ruby, , entre muitas outras linguagens orientadas a objeto.

Quando falamos do paradigma declarativo, por outro lado, estamos falando de uma programação:

  • Funcional: conceito muito parecido com a programação procedural, mas a ideia declarativa é evitar acesso direto a essas funções. Aqui, funções são primeiramente classes, funções de alta ordem, lambdas etc.
  • Reativa: ideia de reagir a eventos e criar streams de dados que propagam as mudanças pelas camadas do nosso código. Podemos citar o ReactiveX, famosa biblioteca que implementa o paradigma sobre outras linguagens.
  • Lógica: ideia de declarar resultados como sendo a resposta de uma pergunta feita ao sistema por meio de regras. Como exemplo: Queries, DSLs, entre outros.

 

Dessa forma, a programação declarativa está muito ligada a conceitos mais atuais das linguagens de programação que já conhecemos, que vem sendo trazidas cada vez mais para o cotidiano dos desenvolvedores.

Agora, propomos que você tire um minuto para pensar: quais tecnologias com paradigma declarativo você utiliza que já revolucionou nossa vida como desenvolvedores?

 

Banco de dados relacional

Para entendermos como o paradigma declarativo já revolucionou o desenvolvimento, precisamos falar sobre bancos de dados relacionais. Podemos considerá-los a primeira ferramenta declarativa que veio para facilitar a vida dos desenvolvedores.

Antigamente, antes de surgirem os bancos relacionais, a maioria dos sistemas de database eram acessados por meio de código imperativo, que era altamente dependente de detalhes de baixo nível, como ordem dos registros, indexes, o caminho físico do dado na memória, entre outras coisas.

Como esses elementos mudam com o tempo, o código rotineiramente parava de funcionar após uma mudança na estrutura do dado. O resultado era um código difícil de ler, escrever, debugar e manter.

Com os bancos de dados relacionais, todo esse código imperativo foi substituído por um esquema bem definido de acesso e um mecanismo simples, porém poderoso, de busca, por meio de uma linguagem de consulta — nosso famoso Structured Query Language, o SQL!

O SQL nada mais é que uma DSL (vamos explicar mais a frente esse conceito), ou seja, uma interface universal de acesso ao banco de dados. Ela esconde as camadas mais baixas do fluxo necessário para buscar informações, ordenar, adicionar e excluir registros.

Então, quando queremos nos comunicar com um DB relacional, não precisamos saber a ordem das tabelas, como elas foram salvas em memória ou o formato de leitura e escrita. Nós apenas descrevemos nossas queries ou o formato que queremos que o banco retorne e pronto!

 

Uma flecha orientada à direita é seguida de um retângulo amarelo com as letras DAO. Do retângulo sai uma flecha pontilhada também orientada à direita. Ela atravessa uma linha vertical pontilhada (SQL) e chega a um cilindro azul

 

Na figura acima, descrevemos um processo padrão de comunicação com um DB relacional. Quando queremos nos comunicar com ele, criamos nossos Data Access Object (as DAOs). Essas DAOs, como o nome já diz, fazem o acesso à nossa base de dados usando a linguagem de busca SQL, que abstrai toda a lógica de acesso.

O que fazemos nesses arquivos é descrever o que esperamos de retorno da consulta de uma forma muito próxima da linguagem natural (SELECT ALL FROM TABLE WHERE …). Não estamos nem um pouco preocupados em como essa busca funciona por baixo dos panos.

Vamos agora definir um pouco melhor o conceito de DSL.

 

Domain-Specific Language (DSL)

DSL é a sigla para Domain-Specific Language, ou Linguagem de Domínio Específico em uma tradução literal. Essas linguagens são o contraponto às linguagens de propósito geral, como o Java, por exemplo.

Basicamente, uma DSL é uma abstração de alto nível desenvolvida para solucionar um problema específico. É uma linguagem de computador altamente especializada, desenvolvida com coordenadas claras para atender aos requisitos da solução.

Outro grande ponto das DSLs é que elas possuem alta expressividade em seu domínio.

Vamos tomar o SQL como exemplo mais uma vez. Ele é uma DSL, pois é uma linguagem focada em um domínio específico, acesso ao banco de dados relacional. Nesse domínio, a linguagem possui alta expressividade, de forma que os desenvolvedores são capazes de manipular o banco de dados sem se preocupar com as camadas mais baixas do fluxo.

Outros exemplos de DSLs famosas são HTML, XML, CSS, LaTeX, entre muitas outras.

Agora que entendemos um pouco melhor o paradigma declarativo e o conceito de DSL, vamos ver alguns benefícios da abordagem declarativa.

 

Benefícios do paradigma declarativo

Benefícios usando um paradigma declarativo:

  • Legibilidade: linguagens declarativas são normalmente mais próximas à linguagem natural e mais fáceis de ler e entender.
  • Coesão/Sucintez: a programação declarativa muitas vezes abstrai as camadas mais baixas do fluxo e códigos de boilerplate, fazendo o mesmo trabalho com menos linhas de código.

 

Representação dos cinco benefícios do paradigma declarativo: legibilidade, coesão, reuso, transparência de referências e comutatividade

 

  • Reuso: normalmente é mais fácil criar códigos que podem ser usados para diferentes propósitos com código declarativo.
  • Transparência de referências: como já foi dito, o paradigma declarativo não faz acesso direto a referências e memória, apenas declaramos como queremos que a interação aconteça.
  • Comutatividade: possibilidade de expressar um estado final sem ter que determinar a ordem em que isso será implementado.

Portanto, o bom uso de paradigmas declarativos pode trazer benefícios claros aos desenvolvedores, acelerando o desenvolvimento de projetos, reduzindo erros e trazendo maior facilidade para futuras modificações.

Mas ainda temos uma pergunta no ar: por que eles estão dominando o Mobile? O que tornou o paradigma declarativo cada vez mais necessário nesse ambiente de desenvolvimento?

A resposta você encontra no próximo artigo da nossa série!