Title | Arquitetura Limpa |
---|---|
Author | Vitor Aderaldo |
Pages | 39 |
File Size | 2.7 MB |
File Type | |
Total Downloads | 610 |
Total Views | 800 |
Arquitetura Limpa O H N U C AS R CG_Clean_Arquitecture.indb 1 15/02/2019 09:08:21 O H N U C AS R CG_Clean_Arquitecture.indb 2 15/02/2019 09:08:21 Arquitetura Limpa O Guia do Artesão para Estrutura e Design de Software O H N Robert C. Martin U C AS R Rio de Janeiro, 2019 CG_Clean_Arquitecture.indb 3 ...
Accelerat ing t he world's research.
Arquitetura Limpa Vitor Aderaldo
Related papers
Download a PDF Pack of t he best relat ed papers
Algaworks livro fullst ack angular e spring v1. Tácio Breno
Experiências com desenvolviment o ágil Vinícius De Oliveira Aguado Engenharia de soft ware conceit os e prát icas Raquel Aguiar
R
AS
C
U
N
H
O
Arquitetura Limpa
O
H
N
U
C
AS
R
Arquitetura Limpa
N
H
O
O Guia do Artesão para Estrutura e Design de Software
R
AS
C
U
Robert C. Martin
Rio de Janeiro, 2019
O
H
N
U
C
AS
R
O H
R
AS
C
U
N
Este livro é dedicado à minha amada esposa, meus quatro filhos espetaculares e suas famílias, incluindo meu kit completo com cinco netos — a grande dádiva da minha vida.
O
H
N
U
C
AS
R
Prefácio Apresentação Agradecimentos Sobre o Autor
U
N
H
O
S umário
Introdução
Capítulo 1:
O que São Design e Arquitetura?
C
Parte I:
1 3
O Objetivo? Estudo de Caso Conclusão
5 5 12
Um Conto de Dois Valores
13
Comportamento Arquitetura O Valor Maior Matriz de Eisenhower Lute pela Arquitetura
14 14 15 16 18
AS
R
Capítulo 2:
xv xix xxiii xxv
vii
Sumário
Começando com os Tijolos: Paradigmas da Programação
19
Capítulo 3:
Panorama do Paradigma
21
Programação Estruturada Programação Orientada a Objetos Programação Funcional Para Refletir Conclusão
22 22 23 23 24
Programação Estruturada
27 28 29 30 30 31 32
Encapsulamento? Herança? Polimorfismo? Conclusão
34 37 40 47
U
33
Programação Funcional
49
Quadrados de Inteiros Imutabilidade e Arquitetura Segregação de Mutabilidade Event Sourcing Conclusão
50 52 52 54 56
Parte III:
Princípios de Design
57
Capítulo 7:
SRP: O Princípio da Responsabilidade Única
61
Sintoma 1: Duplicação Acidental Sintoma 2: Fusões Soluções Conclusão
63 65 66 67
R
AS
Capítulo 6:
25
Programação Orientada a Objetos
C
Capítulo 5:
N
Prova Uma Proclamação Prejudicial Decomposição Funcional Nenhuma Prova Formal A Ciência Chega para o Resgate Testes Conclusão
H
Capítulo 4:
O
Parte II:
viii
Sumário
69
Um Experimento Mental Controle Direcional Ocultando Informações Conclusão
70 74 75 75
LSP: O Princípio de Substituição de Liskov
77
Guiando o Uso da Herança O Problema Quadrado/Retângulo LSP e a Arquitetura Exemplo de Violação do LSP Conclusão
78 79 80 80 82
O
Capítulo 9:
OCP: O Princípio Aberto/Fechado
H
Capítulo 8:
ISP e a Linguagem ISP e a Arquitetura Conclusão
N
Capítulo 10: ISP: O Princípio da Segregação de Interface
U
Capítulo 11: DIP: O Princípio da Inversão de Dependência
C
Abstrações Estáveis Factories Componentes Concretos Conclusão
83 85 86 86
87 88 89 91 91
93
Capítulo 12: Componentes
95
R
AS
Parte IV: Princípios dos Componentes
Uma Breve História dos Componentes Relocalização Ligadores Conclusão
Capítulo 13: Coesão de Componentes O Princípio da Equivalência do Reúso/Release O Princípio do Fechamento Comum O Princípio do Reúso Comum O Diagrama de Tensão para Coesão de Componentes Conclusão
96 99 100 102
103 104 105 107 109 110
ix
Sumário
Capítulo 14: Pareamento de Componentes O Princípio das Dependências Acíclicas Design de Cima para Baixo O Princípio de Dependências Estáveis O Princípio de Abstrações Estáveis Conclusão
112 118 120 126 132
Arquitetura
133
O
Parte V:
111
Capítulo 16: Independência
U
N
Desenvolvimento Implantação (Deployment) Operação Manutenção Mantendo as Opções Abertas Independência de Dispositivo Propaganda por Correspondência Endereçamento Físico Conclusão
H
Capítulo 15: O que É Arquitetura?
R
AS
C
Casos de Uso Operação Desenvolvimento Implantação Deixando as Opções Abertas Desacoplando Camadas Desacoplando os Casos de Uso Modo de Desacoplamento Desenvolvimento Independente Implantação Independente Duplicação Modos de Desacoplamento (Novamente) Conclusão
x
135 137 138 138 139 140 142 144 145 146
147 148 149 149 150 150 151 152 153 154 154 154 155 158
Sumário
Capítulo 17: Fronteiras: Estabelecendo Limites
159
O
Algumas Histórias Tristes FitNesse Quais Limites Você Deve Estabelecer e Quando? Input e Output? Arquitetura Plug-in O Argumento sobre Plug-in Conclusão
C
Nível Conclusão
U
Capítulo 19: Política e Nível
N
Cruzando Limites O Temido Monolito Componentes de Implantação Threads Processos Locais Serviços Conclusão
H
Capítulo 18: Anatomia do Limite
Capítulo 20: Regras de Negócio
AS
Entidades Casos de Uso Modelos de Request e Response Conclusão
R
Capítulo 21: Arquitetura Gritante O Tema de uma Arquitetura O Propósito de uma Arquitetura E a Web? Frameworks São Ferramentas, Não Modos de Vida Arquiteturas Testáveis Conclusão
160 163 165 169 170 172 173
175 176 176 178 179 179 180 181
183 184 187
189 190 191 193 194
195 196 197 197 198 198 199
xi
Sumário
Capítulo 22: Arquitetura Limpa
201 203 207 209
Capítulo 23: Apresentadores e Objetos Humble
211
U
Pule o Último Passo Limites Unidimensionais Fachadas Conclusão
N
Capítulo 24: Limites Parciais
Capítulo 25: Camadas e Limites
AS
C
Hunt the Wumpus Arquitetura Limpa? Cruzando os Fluxos Dividindo os Fluxos Conclusão
Capítulo 26: O Componente Main
R
O Detalhe Final Conclusão
Capítulo 27: Serviços:Grandes e Pequenos
xii
H
O Padrão de Objeto Humble Apresentadores e Visualizações Testes e Arquitetura Gateways de Base de Dados Mapeadores de Dados Service Listeners Conclusão
O
A Regra da Dependência Um Cenário Típico Conclusão
Arquitetura de Serviço? Benefícios dos Serviços? O Problema do Gato Objetos ao Resgate Serviços Baseados em Componentes Preocupações Transversais Conclusão
212 212 213 213 214 215 215
217 218 219 220 220
221 222 223 226 227 228
231 232 237
239 240 240 242 244 245 246 247
Sumário
Capítulo 28: O Limite Teste
249
Testes como Componentes do Sistema Testabilidade no Design API de Teste Conclusão
250 251 252 253
Capítulo 29: Arquitetura Limpa Embarcada
Detalhes
H
Parte VI:
O
Teste de App-tidão O Gargalo de Hardware-alvo Conclusão
255
Capítulo 30: A Base de Dados É um Detalhe
C
U
N
Bases de Dados Relacionais Por que os Sistemas de Base de Dados São Tão Predominantes? E se Não Houvesse um Disco? Detalhes Mas e o Desempenho? Anedota Conclusão
Capítulo 31: A Web É um Detalhe
AS
O Pêndulo Infinito O Desfecho Conclusão
R
Capítulo 32: Frameworks São Detalhes Autores de Framework Casamento Assimétrico Os Riscos A Solução Eu os Declaro… Conclusão
258 261 273
275 277 278 279 280 281 281 281 283
285 286 288 289
291 292 292 293 294 294 295
xiii
Sumário
Capítulo 33: Estudo de Caso: Vendas de Vídeo
297
O Produto Análise do Caso de Uso Arquitetura de Componente Gestão de Dependência Conclusão
298 299 300 302 302
303
Apêndice
U
Parte VII:
N
H
Pacote por Camada Pacote por Recurso Portas e Adaptadores Pacote por Componente O Diabo Está nos Detalhes de Implementação Organização versus Encapsulamento Outros Modos de Desacoplamento Conclusão: A Recomendação Perdida
O
Capítulo 34: O Capítulo Perdido
304 306 307 310 315 316 319 321
323 325
Índice
375
R
AS
C
Apêndice A: Arqueologia da Arquitetura
xiv
N
H
O
Prefácio
Do que estamos falando quando falamos de arquitetura?
C
U
Como qualquer metáfora, descrever software por meio das lentes da arquitetura pode esconder tanto quanto pode revelar. Pode prometer mais do que entregar e entregar mais que o prometido.
R
AS
O apelo óbvio da arquitetura é a estrutura, que domina os paradigmas e discussões sobre o desenvolvimento de software — componentes, classes, funções, módulos, camadas e serviços, micro ou macro. No entanto, muitas vezes, é difícil confirmar ou compreender a estrutura bruta de vários sistemas de software — esquemas corporativos ao estilo soviético em vias de se tornarem legado, improváveis torres de equilíbrio se estendendo em direção à nuvem, camadas arqueológicas enterradas em um slide que parece uma imensa bola de lama. Pelo jeito, a estrutura de um software não parece tão intuitiva quanto a estrutura de um prédio. Prédios têm uma estrutura física óbvia, em pedra ou concreto, com arcos altos ou largos, grande ou pequena, magnífica ou mundana. Essas estruturas têm pouca escolha além de respeitar os limites impostos pela gravidade e pelos seus materiais. Por outro lado — exceto no sentido de seriedade — o software tem pouco tempo para a gravidade. E do que o software é feito? Diferente dos prédios, que podem ser feitos de tijolos, concreto, madeira, aço e vidro, o software é feito de software.
xv
Prefácio
Grandes construções de software são compostas de componentes de software menores, que, por sua vez, são formados por componentes ainda menores de software, e assim por diante. É um código dentro do outro, do início ao fim.
N
H
O
Na arquitetura de software, por natureza, o software é recursivo, fractal e esboçado e desenvolvido em código. Os detalhes são essenciais. Também ocorre o entrelaçamento de níveis de detalhes na arquitetura de prédios, mas não faz sentido falar de escala física em software. O software tem estrutura — muitas estruturas e muitos tipos delas — e essa variedade supera o conjunto de estruturas físicas encontradas nos prédios. Você pode até argumentar de forma muito convincente que, na arquitetura de software, há mais atividade e foco no design do que na construção civil — neste sentido, não é insensato considerar a arquitetura de software mais arquitetural do que a arquitetura de prédios!
AS
C
U
Mas a escala física é algo que os humanos entendem e buscam no mundo. Embora atraentes e visualmente óbvias, caixas em um diagrama de PowerPoint não são arquitetura de sistemas de software. Sem dúvida, elas representam uma visão particular de uma arquitetura, mas confundir essas caixas com a imagem maior — com a arquitetura — é perder a imagem maior e a arquitetura: a arquitetura de software não se parece com nada. Uma visualização específica é uma escolha, não uma determinação. É uma escolha baseada em um conjunto maior de escolhas: o que incluir; o que excluir; o que enfatizar utilizando forma ou cor; o que retirar do destaque por meio da uniformização ou omissão. Não há nada natural ou intrínseco que diferencie uma visão da outra.
R
Talvez não seja muito útil falar sobre física e escala física em arquitetura de software, mas certas restrições físicas merecem a nossa consideração e atenção. A velocidade do processador e a largura de banda da rede podem fornecer um veredito duro sobre a performance de um sistema. A memória e o armazenamento podem limitar as ambições de qualquer base de código. O software pode ser feito do mesmo material que os sonhos, mas funciona no mundo físico. Nisto é que consiste a monstruosidade no amor, senhora, em ser infinita a vontade e restrita a execução; em serem limitados os desejos e o ato escravo do limite. — William Shakespeare
xvi
Prefácio
Nós e nossas empresas e economias vivemos no mundo físico. Isso nos dá uma outra perspectiva pela qual podemos entender a arquitetura do software e falar e raciocinar em termos de forças menos físicas e quantidades diferentes.
O
A arquitetura representa as decisões significativas de design que moldam um sistema, onde a significância é medida pelo custo da mudança. — Grady Booch
N
H
Tempo, dinheiro e esforço nos dão um sentido de escala para classificar o grande e o pequeno e distinguir as coisas arquiteturais do resto. Essa medida também nos diz como podemos determinar se uma arquitetura é boa ou não: uma arquitetura não deve apenas atender às demandas dos usuários, desenvolvedores e proprietários em um determinado momento, mas também corresponder a essas expectativas ao longo do tempo.
U
Se você acha que uma arquitetura boa é cara, experimente uma arquitetura ruim. — Brian Foote e Joseph Yoder
C
Os tipos de mudanças que ocorrem normalmente durante o desenvolvimento de um sistema não precisam ser caros, complexos ou abordados em projetos específicos gerenciados, fora do fluxo de trabalho diário e semanal.
R
AS
Esse ponto está ligado a um problema de importância considerável para a física: a viagem no tempo. Como podemos saber as consequências dessas mudanças típicas para que possamos adaptar as principais decisões que tomamos a respeito delas? Como podemos reduzir o esforço e o custo de desenvolvimento no futuro sem recorrer a bolas de cristal ou máquinas do tempo? A arquitetura é o conjunto de decisões que você queria ter tomado logo no início de um projeto, mas, como todo mundo, não teve a imaginação necessária. — Ralph Johnson
Se entender o passado é muito difícil e nossa compreensão do presente, no máximo, incerta, prever o futuro não é nada trivial. É aqui que a estrada se bifurca em vários caminhos.
xvii
Prefácio
Na estrada mais escura, surge a ideia de que uma arquitetura forte e estável se faz com autoridade e rigidez. Se for cara, a mudança é eliminada e suas causas são ignoradas ou atiradas em um fosso burocrático. A atuação do arquiteto é irrestrita e totalitária, e a arquitetura se transforma em uma distopia para os desenvolvedores e uma fonte de frustração constante para todos.
O
Um cheiro forte de generalidade especulativa vem de outro caminho. Essa é uma rota cheia de adivinhação codificada, incontáveis parâmetros, tumbas de código morto e mais complexidade acidental do que você poderia resolver com um orçamento de manutenção.
C
U
N
H
O caminho que nos interessa mais é o mais limpo. Nele, reconhecemos a suavidade do software e queremos preservá-lo como a principal propriedade do sistema. Admitimos que operamos com conhecimento incompleto, mas também sabemos que, como seres humanos, operar com conhecimento incompleto é o que fazemos de melhor. Nesse caminho, priorizamos os nossos pontos fortes em vez das deficiências. Criamos e descobrimos coisas. Fazemos perguntas e conduzimos experimentos. Uma arquitetura boa vem de compreendê-la mais como uma jornada do que como um destino, mais como um processo contínuo de investigação do que como um artefato congelado.
AS
A arquitetura é uma hipótese que precisa ser comprovada por implementação e medição. — Tom Gilb
R
Andar por este caminho requer cuidado e atenção, consideração e observação, prática e princípio. Em um primeiro momento, isso pode parecer lento, mas tudo depende da forma de andar. A única maneira de ir rápido, é ir bem. — Robert C. Martin
Aproveite a jornada. — Kevlin Henney Maio de 2017
xviii
N
H
O
A presentação
U
O título deste livro é Arquitetura Limpa. Trata-se de um nome audacioso. Alguns até diriam arrogante. Então, por que decidi escrever este livro e escolher esse título?
C
Escrevi minha primeira linha de código em 1964, aos 12 anos. Há mais de meio século mexo com programação. Nesse meio-tempo, aprendi algumas coisas sobre como estruturar sistemas de software — informações que, na minha opinião, outras pessoas acharão valiosas.
R
AS
Aprendi tudo isso construindo muitos sistemas, grandes e pequenos. Construí pequenos sistemas embarcados e grandes sistemas de processamento de lotes. Sistemas em tempo real e sistemas web. Aplicações de console, aplicações GUI, aplicações de controle de processo, jogos, sistemas de contabilidade, de telecomunicação, ferramentas de design, aplicações de desenho e muitos, muitos outros.
Desenvolvi aplicações single-threaded, aplicações multithreaded, aplicações com poucos processos pesados, aplicações com muitos processos leves, aplicações multiprocessadoras, aplicações de base de
xix
Apresentação
dados, aplicações matemáticas, aplicações de geometria computacional e muitos, muitos outros. Criei muitas aplicações. Construí muitos sistemas. E a dedicação com que trabalhei em todos esses projetos me ensinou algo surpreendente. As regras da arquitetura são sempre as mesmas!
H
O
Isso é surpreendente porque os sistemas que criei eram radicalmente diferentes entre si. Então, por que sistemas tão diferentes compartilham regras similares de arquitetura? Cheguei à conclusão de que as regras da arquitetura de software são independentes de todas as outras variáveis.
AS
C
U
N
Isso se torna ainda mais surpreendente quando você considera as mudanças ocorridas no hardware ao longo desse meio século. Comecei a programar em máquinas do tamanho de geladeiras que tinham tempos de ciclo de meio megahertz, 4K de memória c...