cleaner-code-centralit-2015
TRANSCRIPT
1 de 80www.centralit.com.br | [email protected]
Cleaner CodePor um mundo com menos xingamentos
2 de 80www.centralit.com.br | [email protected]
O LIVRO
Robert C. Martin (Uncle Bob)
Programador desde 1970;
Fundador e Presidente Object
Mentor Inc.
lDesigning Object-Oriented C++
Applications using the Booch
Method. 1995.
lAgile Software Development:
Principles, Patterns and Practices.
2002.
3 de 80www.centralit.com.br | [email protected]
4 de 80www.centralit.com.br | [email protected]
5 de 80www.centralit.com.br | [email protected]
6 de 80www.centralit.com.br | [email protected]
SonarQube
“É uma ferramenta opensource para análise egerenciamento de qualidade de código queoferece um relatório visual e a evoluçãohistórica do código.”
www.sonarqube.org
7 de 80www.centralit.com.br | [email protected]
8 de 80www.centralit.com.br | [email protected]
9 de 80www.centralit.com.br | [email protected]
Situação
Quem nunca pegou um código que deverialevar horas e levou semanas para ser corrigido?
Manter o código mais limpo possível.
10de 80www.centralit.com.br | [email protected]
Isso é preocupante pra nós?
Toda vez que você escreve um Bad Code, vocêestá fazendo parte do problema.
11de 80www.centralit.com.br | [email protected]
Médico e Paciente
12de 80www.centralit.com.br | [email protected]
Evolução contínua
13de 80www.centralit.com.br | [email protected]
Clean Code
”Qualquer um consegue escrever código queum computador entende. Bons programadoresescrevem código que humanos entendem.”
Martin Fowler
14de 80www.centralit.com.br | [email protected]
15de 80www.centralit.com.br | [email protected]
Como conquistar isso?
16de 80www.centralit.com.br | [email protected]
Single Responsibility Principle(SRP)
”Uma classe deve ter um, e apenas um, motivopara ser modificada. Esse princípio também échamado de coesão e implica em dizer que umaclasse deve fazer uma única coisa e fazê-labem.”
17de 80www.centralit.com.br | [email protected]
Princípio Don't Repeat Yourself (DRY)
”A duplicação (seja ela acidental ou proposital)pode levar a pesadelos de manutenção, alémde atrapalhar a refatoração e gerarcontradições lógicas.”
18de 80www.centralit.com.br | [email protected]
Nomes Significantes
•Leva tempo, mas ajuda muito mais.•Teremos programadores mais felizes.•Deve-se dizer o que faz, por que existe e comousá-la.•Se precisar de comentários, não é um nomesignificante.
19de 80www.centralit.com.br | [email protected]
Nomes Significantes
20de 80www.centralit.com.br | [email protected]
Utilize nomes buscáveis para números e StringsEx.: X = 20para X = VALOR_HORA;
21de 80www.centralit.com.br | [email protected]
22de 80www.centralit.com.br | [email protected]
23de 80www.centralit.com.br | [email protected]
Encapsule condições
Lógica booleana já é difícil o bastante entender.Se não vier dentro de um contexto de um if ouwhile.
24de 80www.centralit.com.br | [email protected]
Encapsule condições
25de 80www.centralit.com.br | [email protected]
Encapsule condições
26de 80www.centralit.com.br | [email protected]
Encapsule condições
Evite condições negativas. Elas são um poucomais difíceis de entender. Quando possível,deveria ser expressado como positiva.
27de 80www.centralit.com.br | [email protected]
Utilize Enums ao invés de Constantes
28de 80www.centralit.com.br | [email protected]
Nome de Classes e Métodos
Classes Pronomes. Ex.: Paciente, WikiPage, Conta.
•Métodos Verbos: deletar, postar, curtir, desenhar.
29de 80www.centralit.com.br | [email protected]
Sobrecarga de Construtores
Utilize métodos estáticos que descrevam os argumentos.
30de 80www.centralit.com.br | [email protected]
Escolha uma palavra por Conceito
Ex.: Buscar..., recuperar..., get..., pegar...
Não use mesmo termo para coisas distintas.
31de 80www.centralit.com.br | [email protected]
Métodos
•Regra 1: Deveriam ser pequenas.•Regra 2: Deveriam ser menores do que isso.
•O quanto pequeno deveria ser? (linhas)
De duas a cinco linhas.
32de 80www.centralit.com.br | [email protected]
Blocos e Identação
If, else e while deveriam ter apenas uma linha de código, provavelmente uma função.
33de 80www.centralit.com.br | [email protected]
Blocos e Identação
Mantém pequeno e adiciona valor de documentação, por que a função pode ter um bom e descritivo nome.
34de 80www.centralit.com.br | [email protected]
Blocos e Identação
Métodos curtos tendem a fazer uma coisa por vez, adicionando coesão.
35de 80www.centralit.com.br | [email protected]
Switches
Grandes, quebram o SRP e se um novo tipo for adicionado irá crescer mais.
36de 80www.centralit.com.br | [email protected]
Switches
Solução: Definir o switch em uma classe abstrata e “não deixar ninguém ver”. Utilizar polimorfismo.
37de 80www.centralit.com.br | [email protected]
Princípio de Ward
“Você sabe quando está trabalhando em um clean code quando cada rotina/método/classe faz o que realmente você espera.”
38de 80www.centralit.com.br | [email protected]
Argumentos de métodos
Ideal: ZERO.Quantidade de parâmetros superior a 3 devem ser evitados e quando utilizados devem ser justificados.
39de 80www.centralit.com.br | [email protected]
Argumentos de métodos
São difíceis de entender e de testar.
40de 80www.centralit.com.br | [email protected]
Métodos com UM argumento
Você faz uma pergunta sobre o argumento.
41de 80www.centralit.com.br | [email protected]
Métodos com UM argumento
42de 80www.centralit.com.br | [email protected]
Métodos com UM argumento
Opera em cima desse argumento, transformando-o em outra coisa.
InputStream fileOpen(“nome_arquivo”);
43de 80www.centralit.com.br | [email protected]
Métodos com UM argumento
44de 80www.centralit.com.br | [email protected]
Argumentos FLAG
São feios. Não é uma boa prática, além de declarar que o método tem mais de uma responsabilidade.
45de 80www.centralit.com.br | [email protected]
Argumentos FLAG
46de 80www.centralit.com.br | [email protected]
Métodos com DOIS argumentos
Mais difícil de entender, mas as vezes é OK.
Ex.: new Point(0,0);
47de 80www.centralit.com.br | [email protected]
Métodos com DOIS argumentos
As vezes pode levar ao erro.
Ex.: assertEquals(expected, actual);
48de 80www.centralit.com.br | [email protected]
Métodos com TRÊS argumentos
Utilizar objetos/classes como argumento.
49de 80www.centralit.com.br | [email protected]
Métodos com TRÊS argumentos
50de 80www.centralit.com.br | [email protected]
Métodos com TRÊS argumentos
Utilizar objetos/classes como argumento.
Ex.: Pega exemplo do nome social
51de 80www.centralit.com.br | [email protected]
Métodos
Qualquer método que faça você verificar a declaração ou sua implementação, seria um tempo desperdiçado.
52de 80www.centralit.com.br | [email protected]
Métodos
Funções deveriam fazer ou perguntaralgo. Mudar o estado do objeto ou retornar alguma informação sobre ele e não os dois.
54de 80www.centralit.com.br | [email protected]
Exceptions – Códigos de erro
São feios, confundem a estrutura de código com o processo/tratamento de erro.
55de 80www.centralit.com.br | [email protected]
Exceptions – Exceções
Fornece uma ótima separação do que o código faz, deixando fácil de entender e de modificar.
56de 80www.centralit.com.br | [email protected]
Exceptions – Boas práticas
Utilize try-catch primeiro.Catch tem que deixar o sistema consistente.
57de 80www.centralit.com.br | [email protected]
Exceptions – Boas práticas
58de 80www.centralit.com.br | [email protected]
Exceptions – Não retorne NULL
lPrefira lançar uma Exception ou retornar um objeto especial ao invés de NULL.
59de 80www.centralit.com.br | [email protected]
Exceptions – Não retorne NULL
lNão tem boas práticas para tratar NULL. A forma racional de tratar isso é não passar/retornar null.
61de 80www.centralit.com.br | [email protected]
Comentários
Não comente código ruim, reescrevá-os.
Comentários não ajudam um código sujo! Emgeral, servem para explicar um código ruim.
62de 80www.centralit.com.br | [email protected]
Comentários
Comentários são compensações para nossas falhas em nos expressar no código.
63de 80www.centralit.com.br | [email protected]
Comentários
Se você acha que precisa escrever um comentário, tente pensar novamente e expresse o que você quer no código.
64de 80www.centralit.com.br | [email protected]
Por que comentários são ruins?
Por que eles mentem. Não sempre e não intencionalmente, mas com muita frequência.
65de 80www.centralit.com.br | [email protected]
Noise Comments
Get's / Set'sConstrutores padrãoGerados pela IDE
66de 80www.centralit.com.br | [email protected]
Comentário Informativo
Retorno de métodos abstratos.TODO's.Ampliar a importância em algo, API
Públicas.
67de 80www.centralit.com.br | [email protected]
Positions Markers
lEx.: // Actions //////////////////
68de 80www.centralit.com.br | [email protected]
Positions Markers
69de 80www.centralit.com.br | [email protected]
Comentários
Pessoas não deletam isso. Eles pensam que existe uma razão que é muito importante para não deletá-los
70de 80www.centralit.com.br | [email protected]
Comentários
71de 80www.centralit.com.br | [email protected]
Comentários
72de 80www.centralit.com.br | [email protected]
Classes
lDeveriam ser pequenas. O quanto pequenas? Não pequenas em quantidade de linhas, mas em responsabilidades.
73de 80www.centralit.com.br | [email protected]
Classes
lO nome da classe deve descrever quais responsabilidades está preenchida. Nós deveríamos descrever uma classe com +-25 palavras, sem usar Se, e, ou, mas...
74de 80www.centralit.com.br | [email protected]
Classes
lUma classe deve ser aberta para extensão e fechado para modificação.
75de 80www.centralit.com.br | [email protected]
Design Simples
lExecute todos os testes.lRemova duplicações.lExpresse a intenção do programador.lMinimize o número de classes e métodos.
76de 80www.centralit.com.br | [email protected]
REGRA DOS ESCOTEIROS
Deixe a área do acampamentomais limpa do que como vocêa encontrou.
77de 80www.centralit.com.br | [email protected]
Finalmentes
•Os nomes devem ser pronunciáveis.•Evite encodings.
78de 80www.centralit.com.br | [email protected]
Finalmentes
Não tenha medo de mudar código. Seremos gratos quando você mudar (para melhor!). Seguir essas regras e melhorar a leitura do seu código é um valor que será pago a curto e a longo prazo.
79de 80www.centralit.com.br | [email protected]
Mensagem
Redefina o código, divida funções, mude nomes, elimine duplicações, deixe os métodos curtos e reordene-os.