Você está na página 1de 9

Sumário

Capítulo 1: Código limpo 01


O código 02
Código ruim 03
O custo de se ter um código confuso 04
O grande replanejamento 05
Atitude 05
O principal dilema 06
A arte do código limpo? 06
O que é um código limpo? 07
Escolas de pensamento 12
Somos autores 13
A regra de escoteiro 14
Prequela e princípios 14
Conclusão 14
Bibliografia 15

Capítulo 2: Nomes significativos 17


Introdução 17
Use nomes que revelem seu propósito 18
Evite informações erradas 19
Faça distinções significativas 20
Use nomes pronunciáveis 21
Use nomes passíveis de busca 22
Evite codificações 23
A notação húngara 23
Prefixos de variáveis membro 23
Interfaces e implementações 24
Evite o mapeamento mentaL 24
Nomes de classes 25
Nomes de métodos 25
Não dê uma de espertinho 25
Selecione uma palavra por conceito 26
Não faça trocadilhos 26
Use nomes a partir Domínio da Solução 26
Use nomes de Domínios do Problema 27
Adicione um contexto significativo 27
Não adicione contextos desnecessários 29
Conclusão 29

Capítulo 3: Funções 31
Pequenas! 34
Blocos e endentação 35
Faça apenas uma coisa 35
Seções dentro de funções 36
Um nível de abstração por função 36
Ler o código de cima para baixo: Regra Decrescente 37
Estrutura Switch 37
Use nomes descritivos 39
Parâmetros de funções 39
Formas mônades comuns 40
Parâmetros lógicos ; 40
Funções díades : 41
Triades 41
Objetos como parâmetros .42
Listas como parâmetros .42
Verbos e palavras-chave 42
Evite efeitos colaterais .43
Parâmetros de saída .44
Separação comando-consulta .44
Prefira a exceções a retomo de códigos de erro .45
Extraia os blocos try/catch .46
Tratamento de erro é uma coisa só 46
Evite repetição 47
Programação estruturada 47
Como escrever funções como essa? .48
Conclusão 48
SetupTeardownIncluder .49
Bibliografia 51
Capítulo 4: Comentários 53
Comentários compensam um código ruim 54
Explique-se no código 55
Comentários bons 55
Comentários legais 55
Comentários informativos 56
Explicação da intenção 56
Esclarecimento 57
Alerta sobre consequências 58
Comentário TODO 58
Destaque 59
Javadocs em APIs públicas 59
Comentários ruins 59
Murmúrio 59
Comentários redundantes 60
Comentários enganadores 63
Comentários imperativos 63
Comentários longos 63
Comentários ruidosos 64
Ruídos assustadores 66
Evite o comentário se é possível usar uma função ou uma variável 66
Marcadores de posição 67
Comentários ao lado de chaves de fechamento 67
Créditos e autoria 68
Explicação do código em comentários 68
Comentários HTML. 69
Informações não-locais 69
Informações excessivas 70
Conexões nada óbvias 70
Cabeçalhos de funções 70
Javadocs em códigos não-públicos 71
Exemplo 71
Bibliografia 74

Capítulo 5: Formatação 75
O objetivo da formatação 76
Formatação vertical 76
A metáfora do jomal 77
Espaçamento vertical entre conceitos 77
Continuidade vertical 78
Distância vertical 79
Ordenação vertical 83
Formatação horizontal 84
Espaçamento e continuidade horizontal 85
Alinhamento horizontal 86
Endentação 87
Escopos minúsculos 89
Regra de equipes 89
Regras de formatação do Uncle Bob 89

Capítulo 6: Objetos e estruturas de dados 93


Abstração de dados 93
Anti -simetria data/objeto 95
A lei de Demeter 97
Carrinhos de trem 98
Híbridos 99
Estruturas ocultas 99
Objetos de transferência de dados 100
O Active Record 101
Conclusão 1O 1
Bibliografia 101

Capítulo 7: Tratamento de erro 103


Use exceções em vez de retomar códigos 104
Crie primeiro sua estrutura try ..catch ..finally 105
Use exceções não verificadas 106
Fomeça exceções com contexto 107
Defina as classes de exceções segundo as necessidades do chamador 107
Defina o fluxo normal 109
Não retome null 110
Não passe null 111
Conclusão 112
Bibliografia 112

Capítulo 8: Limites 113


O uso de códigos de terceiros 114
Explorando e aprendendo sobre limites 115
Aprendendo sobre log4j 116
Os testes de aprendizagem são melhores que de graça 117
O uso de código que não existe ainda 118
Limites limpos 119
Bibliografia 119

Capítulo 9: Testes de unidade 121


As três leis do TDD 122
Como manter os testes limpos 123
Os testes habilitam as "-idades" 124
Testes limpos 124
Linguagem de testes específica ao domínio 127
Um padrão duplo 127
Uma confirmação por teste 129
Um único conceito por teste 130
FI.R.S. T 131
Conclusão 132
Bibliografia 132

Capítulo 10: Classes 133


Organização das classes 134
Encapsulamento 134
As classes devem ser pequenas! 134
O Principio da Responsabilidade Única 136
Coesão 138
Manutenção de resultados coesos em muitas classes pequenas 139
Como organizar para alterar 145
Como isolar das alterações 147
Bibliografia 148

Capítulo 11: Sistemas 149


Como você construiria uma cidade? 150
Separe a construção e o uso de um sistema 150
Separação do main 151
Factories 151
Injeção de dependência 152
Desenvolvimento gradual 153
Preocupações transversais 156
Proxies para Java 156
Frameworks de POA puramente Java 158
Aspectos do AspectJ 161
Testes na arquitetura do sistema 161
Otimize a tomada de decisões 162
Use padrões sabiamente quando eles adicionarem um valor demonstrativo 163
Sistemas precisam de linguagens específicas a um domínio 163
Conclusão 163
Bibliografia 164

Capítulo 12: Emergência 165


Obtendo clareza através de um processo de emergência 165
Regra 1 de Projeto Simples: Efetue todos os testes 166
Regras de 2 a 4 de Projeto Simples: Refatoração 166
Sem repetição de código 167
Expressividade 169
Poucas classes e métodos 170
Conclusão 170
Bibliografia 170

Capítulo 13: Concorrência 171


Por que concorrência? 172
Mitos e conceitos equivocados 173
Desafios 173
Princípios para proteção da concorrência 174
Principio da Responsabilidade Única 174
Solução: limite o escopo dos dados 175
Solução: Use cópias dos dados 175
Solução: as threads devem ser o mais independentes possíveis 175
Conheça sua biblioteca 176
Coleções seguras para threads 176
Conheça seus métodos de execução 177
Producer-Consumer 177
Leitores e escritores 178
Dining Philosophers (Problema dos Filósofos) 178
Cuidado com dependências entre métodos sincronizados 178
Mantenha pequenas as seções sincronizadas 179
É difícil criar códigos de desligamento corretos 179
Teste de código com threads 180
Trate falhas falsas como questões relacionadas às threads 180
Primeiro, faça com que seu código sem thread funcione 180
Tome seu código com threads portátil... 181
Tome seu código com threads ajustável 181
Rode com mais threads do que processadores 181
Rode em diferentes plataformas 181
Altere seu código para testar e forçar falhas 182
Manualmente 182
Automatizada 183
Conclusão 184
Bibliografia 185

Capítulo 14: Refinamento com êxito 187


Implementação de Args 188
Como fiz isso? 194
Args: o rascunho 195
Portanto, eu parei 206
Incrementalismo 206
Parâmetros do tipo string 208
Conclusão 246
Capítulo 15: Características internas do JUnit 247
O framework JUnit 248
Conclusão 261

Capítulo 16: Refatorando o SerialDate 263


Primeiro, faça-a funcionar 264
Então, torne-a certa 266
Conclusão 279
Bibliografia 279

Capítulo 17: Odores e heurísticas 281


Comentários 282
C1: Informações inapropriadas 282
C2: Comentário obsoleto 282
C3: Comentários redundantes 282
C4: Comentário mal escrito 283
C5: Código como comentário 283
Ambiente 283
E1: Construir requer mais de uma etapa 283
E2: Testes requerem mais de uma etapa 283
Funções 284
FI: Parâmetros em excesso 284
F2: Parâmetros de saída 284
F3: Parâmetros lógicos 284
F4: Função morta 284
Geral 284
Gl: Múltiplas linguagens em um arquivo fonte 284
G2: Comportamento óbvio não é implementado 284
G3: Comportamento incorreto nos limites 285
G4: Seguranças anuladas 285
G5: Duplicação 285
G6: Códigos no nível errado de abstração 286
G7: As classes base dependem de suas derivadas 287
G8: Informações excessivas 287
G9: Código morto 287
G 1O: Separação vertical 288
GIl: Inconsistência 288
G 12: Entulho 288
G 13: Acoplamento artificiaL 288
G 14: Feature Envy 289
G 15: Parâmetros seletores 290
G 16: Propósito obscuro 291
G 17: Responsabilidade mal posicionada 291
G18: Modo estático inadequado 291
G 19: Use variáveis descritivas 292
G20: Nomes de funções devem dizer o que elas fazem 292
G21: Entenda o a1goritmo 293
G22: Tome dependências lógicas em físicas 293
G23: Prefira polimorfismo a if.. .else ou switch case 295
G24: Siga as convenções padrões 295
G25: Substitua os números mágicos por constantes com nomes 295
G26: Seja preciso 296
G27: Estrutura acima de convenção 297
G2S: Encapsule as condicionais 297
G29: Evite condicionais negativas 297
G30: As funções devem fazer uma coisa só 297
G31: Acoplamentos temporários ocultos 29S
G32: Não seja arbitrário 299
G33: Encapsule as condições de limites 299
G34: Funções devem descer apenas um nível de abstração 300
G35: Mantenha os dados configuráveis em níveis altos 301
G36: Evite a navegação transitiva 302
Java 302
Jl: Evite longas listas de importação usando wi1dcards (caracteres curinga) 302
12: Não herde as constantes 303
13: Constantes versus enums 304
Nomes 305
N1: Escolha nomes descritivos ; 305
N2: Escolha nomes no nível apropriado de abstração 307
N3: Use uma nomenclatura padrão onde for possível.. 307
N4: Nomes não ambíguos : 30S
N5: Use nomes longos para escopos grandes 30S
N 6: Evite codificações 30S
N7: Nomes devem descrever os efeitos colaterais 309
Testes 309
TI: Testes insuficientes 309
T2: Use uma ferramenta de cobertura! 309
T3: Não pule testes triviais 309
T4: Um teste ignorado é uma questão sobre uma ambiguidade 309
T5: Teste as condições de limites 310
T6: Teste abundantemente bugs próximos 310
T7: Padrões de falhas são reveladores 310
TS: Padrões de cobertura de testes podem ser reveladores 31O
T9: Testes devem ser rápidos 31 O
Conclusão 31O
Bibliografia 311
Exemplo. de cliente/servidor 313
O servidor 313
Adição de threads 315
Observações do servidor 315
Conclusão 317
Caminhos possíveis de execução 317
Quantidade de caminhos 318
Indo mais a fundo 319
Conclusão 322
Conheça sua biblioteca 322
Framework Executor 322
Soluções sem bloqueio 323
Classes não seguras para threads 324
Dependências entre métodos 325
Aceite a falha 327
Bloqueio baseando-se no cliente 327
Bloqueio baseando-se no servidor 328
Como aumentar a taxa de transferência de dados 329
Cálculo da taxa de transferência de dados com uma única thread 330
Cálculo da taxa de transferência de dados com múltiplas threads 331
Deadlock 331
Exclusão mútua 33 2
Bloqueio e espera 333
Sem preempção 333
Espera circular 333
Como evitar a exclusão mútua 333
Como evitar o bloqueio e espera 334
Como evitar a preempção 334
Como evitar a espera circular 334
Teste de código multithread 335
Ferramentas de suporte para testa códigos com threads 338
Conclusão 33 8
Tutorial: Exemplos com códigos completos 339
Cliente/servidor usando threads 343