Paradigmas de Programação e Arquitetura
Tags: architecture, softwaredeveloper, developer, cleanarchitecture
Published: 2020-06-01 16:45:28

####Continuando as percepções do que estou lendo no livro Clean Architecture, vamos falar dos paradigmas de programação.

##Mas o que são paradigmas? Quem são eles?

Quando falamos de paradigmas de programação estamos nos referindo a maneiras de programar diferentes, não necessariamente as linguagens de programação. Cada paradigma tem sua forma de apresentar quais estruturas usar e quando usar, imagine que para cada  tipo de receita que vamos fazer temos uma abordagem diferente e por isso precisamos de ingredientes e utensílios diferentes...

Atualmente temos três paradigmas, o estrutural, o orientado a objetos e o funcional, sendo que a ordem de criação foi:

**1 - Funcional**
**2 - Orientado a Objetos**
**3 - Estruturado**

No livro deixa claro que cada paradigma remove capacidades do programador e cada um impõe disciplinas negativas, ou seja, eles nos dizem o que não fazer. O que eles removem:

**Estruturado : declaração goto**
**Orientado a Objetos : ponteiros de função**
**Funcional : atribuições**

E ele explica como entender estes paradigmas está diretamente ligado a arquitetura. Arquitetura se preocupa com 3 principais pontos:

**Função**
**Separação de Componentes**
**Gerenciamento de Dados**

##Paradigma de programação : Estruturado.

Este paradigma foi criado em **1968, por Edsger Wybe Dijkstra**. Apesar de ser o  primeiro paradigma a ser adotado, não foi o primeiro a ser  inventado.
Dijikistra descobriu que o uso de saltos (GOTO) era prejudicial para execução do programa e que possuíam mais complexidade que o cérebro humano poderia processar sem ajuda.
Por isso ele acreditava que construir o software com blocos de código seria de fácil  entendimento.
O uso do GOTO dificultava a quebra destes blocos do código. 
Desconhece a palavra GOTO?
Ela representa saltos dentro do seu código, imagine que você tem uma sequência de 6 linhas de código e na sétima linha ele tem uma chamada para o que está na segunda linha.
Parece confuso? Vou dar um exemplo que vi e que me ajudou a entender:
```c
  int main(){
	int i = 0;
	inicio:
	if(i < 5){
	   printf("Numero: %d\n",i);
	   i++;
	   goto inicio;
	}
	system("pause");
	return 0;
   }
```


Quando o comando goto inicio é executado ele retorna para a linha que está o comando início.
A programação estruturada considera que comandos com esta característica podem ser substituídos por estruturas de repetição.
A partir disso foi considerado que todo programa pode ser construído com apenas três estruturas: sequência, seleção e iteração.
A Decomposição funcional derivada desse paradigma permite ser um ótimo guia de alto nível para construção de arquiteturas de componentes e módulos.


##Paradigma de programação : Orientado a Objetos

Paradigma criado em **1966, por Ole Johan e Krinten Nygaard**, possui infinitas descrições, 
e no geral sempre tem uma descrição que associa ao suporte que linguagens OO devem ter 
em encapsulamento, herança e polimorfismo.
Porém durante a leitura fica claro que mesmo antes do paradigma era possível utilizar estes conceitos.
O que pode-se perceber é que a OO aperfeiçoou a forma do polimorfismo, permitindo inversão de dependência através do uso de interfaces, que é algo que diretamente relacionado com a importância deste paradigma.
Como os ponteiros trabalham em tempo de execução para funções que estão usando polimorfismo qualquer dependência que esteja sendo acionada através do polimorfismo pode ser facilmente invertida, o que permite maior controle das dependências no sistema e para arquitetura dá mais poder para que sejam realizadas arquiteturas plug-in, através de módulos que possuem políticas de alto nível.


##Paradigma de programação : Funcional

Este paradigma foi criado em **1958, por John McCarthy**, possui como principal base cálculos matemáticos que tinha princípio de imutabilidade, que significa não ter nenhuma forma de atribuição de valores.
Muitos dos problemas estruturais dentro de uma arquitetura decorre de utilização simultânea de variáveis. 
Concorrência em aplicações exige que haja um grande número de threads e um custo em infra para dar conta do processamento e evitar locks em tempo de processamento.
O uso do paradigma funcional ou de seu conceito permite uma operação dos dados de maneira totalmente diferente.


####Encerrando estes assuntos que permeiam quatro capítulos do livro posso dizer que de fato cada paradigma vai controlar de maneira diferente aspectos da sua arquitetura.
####Entender eles nos fará pensar quais pontos são importantes e quais estamos dispostos a abrir mão, e é muito comum o uso de mais  um paradigma em sua arquitetura ou projeto.