<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}]"}
    106 views