<style>
.reveal {
font-size: 30px;
}
</style>
# Princípios de Software Design
### Princípios e código
***
## Daniela Akagui
---
## Características de um design simples
- O que é um design simples?
---
## Características de um design simples
- Soluciona o problema
- Fácil de manter
- Fácil de adicionar novas funcionalidades
- Simples de entender
- Testável
- ...
---
## Características de um bom design
- Simples
- Relevante
- Alta coesão e baixo acoplamento
---
## Coesão
- Código que faz uma única coisa e faz bem
- Tem foco e é estrito
- Não sofre tantas mudanças
---
## Acoplamento
- Número de dependências externas
- Interfaces vs implementações concretas
---
## SRP - Single Responsability
- Single Responsability
- O que significa responsabilidade?
---
## SRP - Single Responsability
- O método não pode receber muitos parâmetros
- O método não deve conter ifs
- O método não deve ser longo
---
## SRP - Single Responsability
- O que é um método longo? 10000, 1000, 100 linhas?
---
## SRP - Single Responsability
- Por que métodos longos são ruins?
---
## SRP - Single Responsability
- Difícil de manter
- Faz muitas coisas
- Difícil de testar
- Difífil de fazer debug
- Difícil de reutilizar
- Leva a duplicação
- Baixa coesão e alto acoplamento
---
## SRP vs SLA
- Single Level of Abstraction Principle (SLAP)
- O problema não é o tamanho
- O problema é o número de detalhes e abstrações que o método contêm
---
## SLA
```javascript=
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0;
for(let i = 0; i < numbers.length; i++) {
if(numbers[i] % 2 === 0) {
result += numbers[i] * 2;
}
}
```
---
## SLA
```javascript=
const isEven = number => number % 2 === 0;
const double = number => number * 2;
const sum = (a, b) => a + b;
const result =
numbers.filter(isEven)
.map(double)
.reduce(sum);
```
---
## Extensibilidade
- O código pode ser alterado para ter novas funcionalidades com mínimo esforço
- Como antecipar mudanças?
- Baixo acoplamento
- Quanto mais abstrato, mais fácil de adicionar novas funcionalidades
- Mas...
---
## DIP - Princípio de Inversão de Dependência
- Uma classe concreta não deveria depender de outra classe concreta
---
## DIP - Princípio de Inversão de Dependência
- Exemplo do iterator
```java=
List<Integer> number1 = Arrays.asList(1, 2, 3);
Set<Integer> number2 = new HashSet(Arrays.asList(1, 2, 3));
process(number1.iterator()); //oh my, iterator() is like getRemote()
System.out.println("-----");
process(number2.iterator());
```
---
## DRY - Don't Repeat Yourself
- Código duplicado
- Teste Manual
- Deploy Manual
---
## YAGNI - You Aren't Gonna Need It
- Design Minimalista
- Fazer o mínimo possível do essencial e adiar o que ainda não está claro
---
## Open Closed Principle (OCP)
- Possibilitar extensão e restringir alteração
---
## Barbara Liskov's Substitution Principle (LSP)
- Use delegate para reutilizar código
- Use herança quando a intenção é substituis uma instancia por outra, da mesmo tipo
---
## Referência
**Hands-on Software Design by Venkat Subramaniam**
{"metaMigratedAt":"2023-06-16T10:08:03.891Z","metaMigratedFrom":"YAML","title":"Princípios de Software Design","breaks":false,"slideOptions":"{\"allottedMinutes\":5}","contributors":"[{\"id\":\"7c56ba17-5ea0-471b-b709-d1f854c43730\",\"add\":3600,\"del\":380}]"}