60
Princípios Básicos para Desenvolvedores while(!(succeed=try())) Guilherme Reis

Princípios Básicos para Desenvolvedores

Embed Size (px)

DESCRIPTION

Introdução aos temas "Clean Code" e "Princípios de Design S.O.L.I.D"

Citation preview

Page 1: Princípios Básicos para Desenvolvedores

Princípios Básicos para

Desenvolvedores while(!(succeed=try()))

Guilherme Reis

Page 2: Princípios Básicos para Desenvolvedores

Agenda

• Dicas para iniciantes;

• Mau cheiro;

• Porque se importar com o código;

• Código limpo;

• Princípios básicos de design;

Page 3: Princípios Básicos para Desenvolvedores

Programação...

Page 4: Princípios Básicos para Desenvolvedores

Programação é lógica,

não magia negra

• “Eu gosto de programar, só não gosto de lógica” (Ex-

aluno de Computação)

Page 5: Princípios Básicos para Desenvolvedores

Antes de codificar, pense

no que quer/precisa fazer

Page 6: Princípios Básicos para Desenvolvedores

Não funcionará na primeira vez! Provavelmente nem na segunda ou terceira;

Page 7: Princípios Básicos para Desenvolvedores

Mas quando funciona...

Page 8: Princípios Básicos para Desenvolvedores

Trabalho em equipe

Page 9: Princípios Básicos para Desenvolvedores

Maus cheiros

• Primeiramente usado por Kent Beck e citado por Martin

Fowler;

• Indicação superficial de alerta à problemas mais

profundos no sistema;

• Não são bugs, mas falhas no design:

• Atraso no desenvolvimento

• Risco de bugs e falhas no futuro

• “Qualquer nariz” consegue identificar;

Page 10: Princípios Básicos para Desenvolvedores

Exemplos

• Classes e métodos/funções enormes;

• Código ilegível;

• Códigos repetidos;

• Códigos redundantes;

• Métodos/Funções com vários parâmetros;

• Baixa coesão*;

• Alto acoplamento*;

Page 11: Princípios Básicos para Desenvolvedores

Baixa Coesão

Page 12: Princípios Básicos para Desenvolvedores

Alto Acoplamento

• Forte dependência entre componentes;

• Dificulta mudanças;

• Dificulta reaproveitamento de código;

Page 13: Princípios Básicos para Desenvolvedores

Alto Acoplamento

Page 14: Princípios Básicos para Desenvolvedores

Fases de um projeto

Page 15: Princípios Básicos para Desenvolvedores

• Tudo é muito bonito, limpo, elegante e convincente;

• Tudo funciona e as atividades são cumpridas como se

esperava;

• Tudo flui conforme o cronograma...

No começo...

Page 16: Princípios Básicos para Desenvolvedores

O importante é

funcionar...

• O código começa a “ter um cheiro desagradável”

• No começo nem parece tão ruim;

• Uma verruga aqui, uma gambiarra ali, mais tudo ainda

parece bonito e funcional;

• Não há tempo para organização e melhorias;

• “Em time que está ganhando não se meche”;

Page 17: Princípios Básicos para Desenvolvedores

A culpa não é minha...

Page 18: Princípios Básicos para Desenvolvedores

“Tudo muda, tudo

sempre mudará...”

• Bugs começam a aparecer;

• Mudanças nos requisitos começam a surgir;

• Puxadinhos (Extensões) se tornam necessários;

• Novos campos e botões são adicionados;

• Então o código começa a apodrecer

e consequentemente, o “cheiro” fica insuportável;

Page 19: Princípios Básicos para Desenvolvedores

Como prevenir?

• Mínimo:

• Se importe com o código gerado;

• Escrevendo um “código limpo”;

• Preocupando-se com o design do software;

• Melhor ainda:

• Fazer revisões de códigos com a equipe;

• Escrevendo testes automatizados;

• Realizando refactors ao identificar

maus cheiros no software;

Page 20: Princípios Básicos para Desenvolvedores

Por que devo me

importar?

Page 21: Princípios Básicos para Desenvolvedores

Por que devo me

importar?

Page 22: Princípios Básicos para Desenvolvedores

Ciclo de um projeto

Page 23: Princípios Básicos para Desenvolvedores

Prevenção

Page 24: Princípios Básicos para Desenvolvedores

Por que devo me

importar?

• Não é só pelaos 20 centavos estética:

• É pelo TEMPO gasto!

Page 25: Princípios Básicos para Desenvolvedores

Como assim tempo?

• O que fazemos em nosso tempo? Sim, os 20% que sobram após o

coffe break, pipi break, tea break, brief break, etc.

• Planejamos mudanças;

• Lemos (e muito) código;

• Atuamos nos planos;

• Codificação de verdade? Não muito...

Page 26: Princípios Básicos para Desenvolvedores

Mais e o código?

• Similar aos bancos de dados:

• Taxa de leitura:escrita de 10:1;

• Não fazemos UPDATE e sim várias sequências de

GET e PUT;

• Nosso cérebro não é um bom cache;

Page 27: Princípios Básicos para Desenvolvedores

Tempo é dinheiro!

• Como reduzir custos através do código? Enchendo o projeto de

estagiários?

• Tempo de leitura/entendimento;

• Seus colegas lerão seus códigos inúmeras vezes

• Entender um módulo leva 2 horas ou 5 minutos?

• Tempo de escrita/adaptação/manutenção;

• O software irá mudar: fato;

• Quão fácil será esta mudança?

• Quanto do código será reaproveitado em outro projeto?

Page 28: Princípios Básicos para Desenvolvedores

Pensando bem...

Page 29: Princípios Básicos para Desenvolvedores

Código limpo

Page 30: Princípios Básicos para Desenvolvedores

Humanos <- Código

Máquinas <- 01101001010

Page 31: Princípios Básicos para Desenvolvedores

Por falar em nome...

Page 32: Princípios Básicos para Desenvolvedores

Nomenclatura

• Sim, o nome importa!

• O propósito de um nome é revelar intenção/objetivo;

• Depois do ctrl+c e ctrl+v, o que mais utilizamos em IDEs

é o ctrl+SPACE

Page 33: Princípios Básicos para Desenvolvedores

Nomenclatura

• Qual componente do formulário será mostrado ou

escondido?

Page 34: Princípios Básicos para Desenvolvedores

Nomenclatura

• Qual componente do formulário será mostrado ou

escondido?

Page 35: Princípios Básicos para Desenvolvedores

O que este código faz?

Page 36: Princípios Básicos para Desenvolvedores

Melhor?

Page 37: Princípios Básicos para Desenvolvedores

E assim?

Page 38: Princípios Básicos para Desenvolvedores

O que mudou?

• Nomes que revelam intenção:

• flaggedCells no lugar de list

• cell no lugar de x

• Remoção de números mágicos:

• cell[STATUS_VALUE] no lugar de x[0]

• Abstração de tipo de dados:

• Cell cell no lugar de int[] cell

Page 39: Princípios Básicos para Desenvolvedores

Princípios básicos

design

• 5 princípios de boas práticas vindas de décadas de experiência

em engenharia de software;

• [S]ingle Responsibility Principle

[O]pen/Closed Principle

[L]iskov Substitution Principle

[I]nterface Segregation Principle

[D]ependency Inversion Principle

Page 40: Princípios Básicos para Desenvolvedores

S – Single Responsibility

Page 41: Princípios Básicos para Desenvolvedores

S – Single Responsibility

• Uma classe/método deve ter apenas uma razão para ser

modificado(a);

• Menor impacto em mudanças;

• Reaproveitamento de código;

• Alta coesão;

Page 42: Princípios Básicos para Desenvolvedores

S – Single Responsibility

Page 43: Princípios Básicos para Desenvolvedores

S – Single Responsibility

Page 44: Princípios Básicos para Desenvolvedores

O - Open Closed

• Fechado para edições;

• Aberto para extensões;

Page 45: Princípios Básicos para Desenvolvedores

O - Open Closed

Page 46: Princípios Básicos para Desenvolvedores

O - Open Closed

Page 47: Princípios Básicos para Desenvolvedores

L - Liskov substitution

• As classes derivadas não devem ser mais fracas e nem

mais fortes que sua base

Page 48: Princípios Básicos para Desenvolvedores

L - Liskov substitution

Customer

Gold Silver Guest

Page 49: Princípios Básicos para Desenvolvedores

L - Liskov substitution

Page 50: Princípios Básicos para Desenvolvedores

L - Liskov substitution

Page 51: Princípios Básicos para Desenvolvedores

I - Interface Segregation

• Melhor ter várias interfaces pequenas para propósitos

específicos

• Do que interfaces genéricas enormes

Page 52: Princípios Básicos para Desenvolvedores

I - Interface Segregation

Page 53: Princípios Básicos para Desenvolvedores

I - Interface Segregation

Page 54: Princípios Básicos para Desenvolvedores

D - Dependency inversion

• Dependa de abstrações, não de detalhes concretos

Page 55: Princípios Básicos para Desenvolvedores

D - Dependency inversion

Page 56: Princípios Básicos para Desenvolvedores

D - Dependency inversion

Page 57: Princípios Básicos para Desenvolvedores

Resultado

Page 58: Princípios Básicos para Desenvolvedores

Perguntas

Page 59: Princípios Básicos para Desenvolvedores

Interessado?