Composição
Tags: programming, software
Published: 2022-06-27 15:04:39


Durante a implementação do software nos deparamos com várias abstrações do domímio do problema, que dificultam a codificação. A representação adequada destas abstrações podem ser influenciadas pela composição.
A composição está presente nos principais paradigmas de programação, tais como: Paradigma Funcional, Declarativo e Orientado a Objectos.

## Composição de Classes
A composição possibilita reutilização de objetos, sem a necessidade de duplicar as classes instanciadas (objectos)  na estrutura do sistema. Uma classe pode ter membros de outra classe ou pode ser composta por outras.
permite aproximar o projeto do software da vida real e viabiliza um projeto bem organizado.
A composição é reprentada por um losango, partindo da classe Composta para as suas partes (Classe A <>------- classe B).
Na orientação a objectos, a composição é muito usada para construir objectos complexos, repartindo em objectos simples.

## Composição de Funções
Composição: é a criação de uma nova função por meio de uma junção de outras, realizando mais de uma atribuição em uma única chamada.
Uma função recebe como parámetro a outra e a saída é uma função.
No paradigma funcional, a composição pode ser feita usando:
- Operador _ponto_(.): Usando funções de ordem superior(map, filter, reduce) e outras para a tranformação de valores;
- Operador _pipe_ (|>):  Em linguagens como F# e Elixir, indicando que uma função recebe como parámetro a função anterior.


## Composição de Consultas
A composição de consultas ajuda a tornar o código mais declarativo, legível e menos verboso. Usando outras abordagens, teríamos um código revestido de iterações e comparações e difícil de ler.

A composição de consultas pode ser feita usando:
- _Linguagem_ dos Sistemas Gerenciadores de Bases Dados (SQL e NoSQL). Em SQL é usado para construir consultas das mais simples as mais complexas.
- Expressões _LINQ_ e _Streams_ nas linguagens: C#, F#, Java, Scala, Elixir e Haskell;
- _ORMs_ e _Micro ORM_s: através de Query Builders, escrevendo a consulta de forma encadeada, semelhante a da base de dados.

**Observação:**  A composição pode ser utilizada como alternativa a Herança de classes, visto que a herança cria um forte acoplamento entre as classes.

## Exemplos 
- Dados de um cidadão. Um cidadão possui dados pessoais, dados de saúde e endereço.
- Obter dados de de um candidato numa base de dados de recrutamento.
- Função para transformar um texto.
- Função para transformar uma lista. A função deve obter o dobro da lista, filtrar os números menores que 30, ordenar  e inverter a lista.
- Função para transformar um texto. A função deve remover os espaços laterais, substituir as vírgulas por ponto e mostrar em letras maiúsculas.
Linguagens: PHP, SQL e Elixir.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nw01ptk36d6tple0rmzk.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fo4cq58yx8w1ohrjm28l.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nz5flrsnd9aol0uiq8b3.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aiy1njhu0ztg6t9sfm4m.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h679rprnu6n4w4pal8b9.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n44uomfmi72hl0gvlfel.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/awowaz7f51bs471dzwqh.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mpekak2gak4z9twro5ag.jpg)


**Código fonte:** https://www.github.com/ortizdavid/exemplo-composicao
**Para mais artigos:** 
https://www.dev.to/ortizdavid
https://www.medium.com/@ortizaad1994