clean code em c#

78
Clean Code em C# Gustavo Araujo @ogustavoaraujo

Upload: gustavo-araujo

Post on 09-Apr-2017

228 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Clean code em C#

Clean Code em C#

Gustavo Araujo@ogustavoaraujo

Page 2: Clean code em C#

Sobre o C#

• Microsoft – 2001.

• Criada como parte da plataforma .NET

• Baseada em C, C++, Java

• Indice Tiobe: 4º lugar

Page 3: Clean code em C#

Características do C#

• Interpretada: código é executado por um interpretador, que em seguida é executado pelo sistema operacional ou processador.

• Fortemente tipada: todas as variáveis tem um tipo específico e seus tipos são importantes para a linguagem.

Page 4: Clean code em C#

Características do C#

• Simplicidade: linguagem tão poderosa quanto o C++ e tão simples quanto o Visual Basic.

• Completamente orientada a objetos: em C#, qualquer variável tem de fazer parte de uma classe.

Page 5: Clean code em C#

Características do C#

• Tudo é um objeto: System.Object é a classe base de todo o sistema de tipos de C#.

• Controle de versões: cada assembly gerado, seja como EXE ou DLL, tem informação sobre a versão do código, permitindo a coexistência de dois assemblies homônimos, mas de versões diferentes no mesmo ambiente.

Page 6: Clean code em C#

Sobre o Clean Code• Marco inicial: “Clean Code: A Handbook of

Agile Software Craftmanship”, Robert C. Martin.

Page 7: Clean code em C#
Page 8: Clean code em C#

Sobre o Clean Code

• Eficiente (YAGNI – You ain’t gonna need it)• Simples (KISS – Keep it simple, stupid!)• Direto• Sem redundâncias (DRY – Don’t repeat

yourself)• Fácil de ler, entender e manter• Objetivo: evitar Code Smells (indícios de erros

no Código-Fonte)

Page 9: Clean code em C#

Regra do Escoteiro

• Deixe o lugar mais limpo do que estava quando você chegou.

Page 10: Clean code em C#

Teoria das Janelas Quebradas

• James Wilson e George Kelling, 1982.

• Onde algo está desorganizado, há a tendência de que aquilo se torne cada vez mais desorganizado com o tempo.

Page 11: Clean code em C#

Consequências

• Menor ocorrência de bugs• Mais fácil de editar• Mais rápido de carregar• Economia de tempo/dinheiro

Page 12: Clean code em C#

Princípios

Page 13: Clean code em C#

Nomes significativos

“Td v a p qd a al n é pq”

Page 14: Clean code em C#

Nomes significativos

“Tudo vale a pena quandoa alma não é pequena”

Page 15: Clean code em C#

Nomes significativos

• Funciona? Funciona.• É o melhor? Não necessariamente.

Page 16: Clean code em C#

Nomes significativos

Page 17: Clean code em C#

Nomes significativos

• Fácil entendimento do que é uma variável, um método, uma classe.

• Ajuda na manutenção de sistemas - escala.

• Nomes que revelem a intenção.

Page 18: Clean code em C#

Nomes significativos

• Nomes pronunciáveis.

Page 19: Clean code em C#

Nomes significativos

• Evitar nomes muito parecidos.

Page 20: Clean code em C#

Nomes de classes e métodos

• Classes: substantivos começando com letra maiúscula. Ex.: Aluno, Faculdade.

• Métodos: verbos/frases curtas começando com letra maiúscula. Ex.: EfetuarDivisao, CadastrarAluno, Buscar.

Page 21: Clean code em C#

Nomes de classes e métodos

• Na hora de chamar...

Page 22: Clean code em C#

Nomes de classes e métodos

• Na hora de chamar...

Page 23: Clean code em C#

UM MÉTODO SÓ DEVE CUMPRIR UMA FUNÇÃO.

Juro que não quero ser redundante ao dizer isso, mas...

Page 24: Clean code em C#

Métodos

Page 25: Clean code em C#

Métodos

• Como saber se um método faz somente uma coisa?

– Verifique se é possível extrair outro método que não seja uma reafirmação da implementação inicial.

Page 26: Clean code em C#

Refactoring

• Reorganização do código, de modo que melhore a estrutura interna, sem modificar seu comportamento externo.

Page 27: Clean code em C#

Métodos (refactoring)

Page 28: Clean code em C#

Métodos (refactoring)

Page 29: Clean code em C#

Nomes inconsistentes de métodos

• Relação entre nomes de classes, de modo que haja coesão de idioma e de significado.

Page 30: Clean code em C#

Parâmetros• Evitar parâmetros que possam ser extraídos

dentro do método.• Muitos parâmetros atrapalham na reutilização

do código.

Page 31: Clean code em C#

Parâmetros

Page 32: Clean code em C#

Indentação

Page 33: Clean code em C#

Indentação

Page 34: Clean code em C#

Ordem dos métodos

• Execução: de cima para baixo.

• Método principal primeiro.

• Lembrar disso quando criar métodos privados – refatorações.

Page 35: Clean code em C#

Ordem dos métodos

Page 36: Clean code em C#

Ordem dos métodos

Page 37: Clean code em C#

Condicionais• Evitar condicionais longos.

Page 38: Clean code em C#

Variáveis

• Evitar muitas variáveis.• Variáveis booleanas, no geral, não são boas.

Page 39: Clean code em C#

Variáveis

Page 40: Clean code em C#

Nome do tipo na variável

• Não fazer! Nome do tipo na variável pode ser um problema principalmente se, por uma alteração no sistema, o tipo de resultado esperado muda.

Page 41: Clean code em C#

Comentários

• Comentários não limpam um código sujo.

Page 42: Clean code em C#

Comentários

• Uso de summary

Page 43: Clean code em C#

Comentários

• Uso de summary

Page 44: Clean code em C#

Comentários

• São recomendados:– Sobre licença de uma lib.– Informativos.– Explicação – regras de negócio.

• Devem ser evitados:– Redundantes.– Dizem o que o código deveria dizer.

Page 45: Clean code em C#

Exceções

• Usar mensagens de erro.

Page 46: Clean code em C#

Exceções

Page 47: Clean code em C#

Regiões

• Recomendadas para guardar métodos.

Page 48: Clean code em C#

Regiões

• Não-recomendadas para esconder comandos dentro dos métodos.

Page 49: Clean code em C#

Código morto

• Código que não está sendo utilizado pelo programa. Deve ser eliminado.

Page 50: Clean code em C#

God object (classe extensa)• Quando uma classe contém muitos métodos,

ela pode ser refatorada em outras classes.

Page 51: Clean code em C#

Métodos e classes preguiçosos

• Métodos e classes que fazem pouca coisa.

Page 52: Clean code em C#

Exposição Indecente• Acontece quando usa-se o nível de permissão

indevido para um método.

Page 53: Clean code em C#

Exposição Indecente

Page 54: Clean code em C#

Oddball Solution (solução excêntrica)

• Quando um mesmo problema é resolvido de duas maneiras diferentes no mesmo código, sendo uma mais excêntrica que outra.

• Uma só passa a ser usada, podendo se tornar um método a ser usado em ambas as situações.

Page 55: Clean code em C#

Oddball Solution

Page 56: Clean code em C#

Refused Bequest (Legado Recusado)

• Acontece quando uma classe recebe métodos da outra, mas não os implementa.

Page 57: Clean code em C#

Lei de Demeter

• Karl Lieberherr e Ian Holland, 1987, Boston University.

• Diminui o acoplamento de classes

• Melhora a manutenibilidade do código

Page 58: Clean code em C#

Princípios da Lei de Demeter

• Um método A de um objeto O somente poderia acessar métodos de outros objetos segundo as seguintes regras:– Seja um parâmetro de A;– Seja um objeto que A criou;– Seja um método do próprio objeto O;– Seja um objeto diretamente relacionado com o

objeto O;– Seja uma variável global acessível ao objeto O;

Page 59: Clean code em C#

Lei de Demeter – exemplo do cachorro

• Quando você precisa que um cachorro ande, você dá a ordem para as pernas diretamente, ou para o cachorro? Obviamente que para o cachorro e este sabe o que precisa ser acionado para andar.

Page 60: Clean code em C#

Exemplo da Lei de Demeter

Page 61: Clean code em C#

Exemplo da Lei de Demeter

Essa não é a maneira apropriada, de acordo com a Lei de Demeter, por buscaro valor de um objeto dentro de outro.

Page 62: Clean code em C#

Exemplo da Lei de Demeter

Page 63: Clean code em C#

DRY (Don’t Repeat Yourself)

Page 64: Clean code em C#

DRY (Don’t Repeat Yourself)

Page 65: Clean code em C#

Clean Code para Testers

• Três coisas são importantes para manter um teste limpo:– Legibilidade– Legibilidade– Legibilidade

Page 66: Clean code em C#

Clean Code para Testers

• Variáveis hard-coded: cujo valor está fixo dentro do código.

Page 67: Clean code em C#

Clean Code para Testers

Page 68: Clean code em C#

O que faz um código ser limpo?

• Lógica direta (evita encobrimento de bugs)• Dependências mínimas• Tratamentos de erro• Métodos celulares• Nomes significativos• Sem duplicações

Page 69: Clean code em C#

CALMA, O VISUAL STUDIO TE AJUDA.

Como saber por meio de métricas se eu preciso refatorar meu código?

Page 70: Clean code em C#

Visual Studio – Code Metrics• Ferramenta nativa de diagnóstico, define

métricas para análise de código.• Analyze > Calculate Code Metrics.• Pode analisar solução ou projeto.

Page 71: Clean code em C#

Maintainability Index

• Índice de 0 a 100.• Determina o grau de facilidade de

manutenção do código.

Page 72: Clean code em C#

Cyclomatic Complexity

• Vai de 1 a >51.• Se a complexidade ciclomática é baixa, logo

existem menos caminhos para testar (menos if's desviando o caminho, por exemplo) e, por isso, um número baixo para a complexidade ciclomática NÃO faz os testes serem mais complexos. Complexidade ciclomática baixa leva a uma maior facilidade para testar. Se muito alta a cobertura do teste será insuficiente.

Page 73: Clean code em C#

Depth of Inheritance

• Nível de herança – árvore.

• Toda classe começa do 1 – herda do System.

• Quanto mais próximo do 1, melhor. Quanto mais próximo do System, mais fácil prever comportamentos.

Page 74: Clean code em C#

Depth of Inheritance

• Porém, isso é relativo. Um baixo número de heranças pode significar pouco reaproveitamento de código.

Page 75: Clean code em C#

Class Coupling

• Acoplamento entre classes. Quanto menor, melhor.

• Dependência de funcionamento.

Page 76: Clean code em C#

Lines of Code

• Quantidade de linhas de código por classe/solução. Quanto menor a quantidade, mais fácil de testar e menos complexo é um código.

Page 77: Clean code em C#

Plugins – Visual Studio

• StyleCop - https://stylecop.codeplex.com/

• Resharper - https://www.jetbrains.com/resharper/

• CodeMaid - http://www.codemaid.net/

Page 78: Clean code em C#

Obrigado!

- E-mail: [email protected]

- GitHub: @gustavoaraujo

- Linkedin e Facebook: @ogustavoaraujo