A “Arquitetura Limpa” de Bob Martin é uma regra de ouro para todas as arquiteturas ou é apenas uma das opções?

22

Gostei muito dos conceitos do vídeo Os Princípios da Arquitetura Limpa, do tio Bob Martin . Mas sinto que esse padrão é como uma combinação dos padrões Abstract Factory e Builder em sua essência.

Essa é uma maneira de escrever bons programas, mas não a única.

Rails e reactjs são duas estruturas que vêm à mente que não promovem esse tipo de arquitetura limpa. O Rails espera que sua lógica de negócios esteja nos modelos ( FatModels e SkinnyControllers ) e reaja dentro de seus componentes. Ambas as abordagens combinam firmemente a lógica comercial e o código da estrutura .

Não encontro nada de errado em nenhuma das três maneiras. É um julgamento para escolher qualquer um.

Mas, no vídeo, sinto que ele sugere que a arquitetura limpa deve ter uma fronteira clara entre a lógica de negócios e as estruturas. Estruturas (web, android, etc.) devem ser plugins que se conectam à lógica de negócios. Ele até zomba sutilmente dos trilhos no vídeo.

Então, "Arquitetura Limpa", de Bob Martin, é uma regra de ouro para todas as arquiteturas ou é apenas uma das opções?

vedante
fonte
16
"Arquitetura Limpa" é algo que Bob Martin inventou. É isso aí.
Robert Harvey
2
Talvez uma pergunta melhor seja esta: Rails e React são muito bem sucedidos. O que Bob Martin escreveu, usando sua arquitetura limpa, para comparar? Eu mesmo gostaria de saber a resposta.
user949300
4
Leia a publicação no blog de Joel sobre cinco mundos e você sabe por que não existe uma "regra de ouro para todas as arquiteturas".
Doc Brown
1
Os trilhos podem ser muito bem-sucedidos para startups e protótipos. Quando chega a hora de manter e desenvolver mais com outros 50 desenvolvedores - a "liberdade" do Rails se torna um problema que os desenvolvedores experientes enfrentam.
Fabio
Submetidos a sua consideração: Baruco 2012: Desconstruindo o quadro, por Gary Bernhardt
Theraot

Respostas:

34

Embora a “Arquitetura Limpa” seja boa e tenha muitas vantagens, é importante lembrar que:

  • A arquitetura limpa é amplamente a re-branding de Robert C. Martin e a evolução de abordagens relacionadas, como a Onion Architecture de Jeffrey Palermo (2008) e a Hexagonal Architecture ("Ports and Adapters") de Alistair Cockburn e outros (<2008).

  • Problemas diferentes têm requisitos diferentes. A Arquitetura Limpa e as abordagens relacionadas aumentam o onze, a flexibilidade e a inversão de dependência, mas sacrificam a simplicidade. Isso nem sempre é um bom negócio.

O precursor dessas arquiteturas é o padrão MVC clássico do Smalltalk. Isso separa o modelo da interface do usuário (controlador e visualização), para que o modelo não dependa da interface do usuário. Existem muitas variações do MVC como MVP, MVVM,….

Sistemas mais complexos não possuem apenas uma interface de usuário, mas possivelmente várias interfaces de usuário. Muitos aplicativos optam por oferecer uma API REST que pode ser consumida por qualquer interface do usuário, como um aplicativo Web ou móvel. Isso isola a lógica de negócios no servidor dessas UIs, para que o servidor não se importe com o tipo de aplicativo que o acessa.

Normalmente, o servidor ainda depende de serviços de back-end, como bancos de dados ou fornecedores de terceiros. Isso é perfeitamente correto e leva a uma arquitetura em camadas simples.

A arquitetura hexagonal vai além e deixa de fazer uma distinção entre front-end e back-end. Qualquer sistema externo pode ser uma entrada (fonte de dados) ou uma saída. Nosso sistema principal define as interfaces necessárias (portas) e criamos adaptadores para qualquer sistema externo.

Uma abordagem clássica para dissociação forte é uma arquitetura orientada a serviços (SOA), na qual todos os serviços publicam eventos e consomem eventos de um barramento de mensagens compartilhadas. Uma abordagem semelhante foi posteriormente popularizada pelos microsserviços.

Todas essas abordagens têm vantagens , como facilitar o teste do sistema isoladamente (substituindo todos os sistemas externos com os quais ele faz interface por implementações simuladas). Eles facilitam o fornecimento de várias implementações para um tipo de serviço (por exemplo, a adição de um segundo processador de pagamento) ou a troca de uma implementação (por exemplo, a mudança de um banco de dados Oracle para o PostgreSQL ou a reescrita de um serviço Python no Go) .

Mas essas arquiteturas são a Ferrari das arquiteturas: caras, e a maioria das pessoas não precisa delas. A flexibilidade adicional da Arquitetura Limpa, etc., custa mais complexidade. Muitos aplicativos e, especialmente, os aplicativos web CRUD não se beneficiam disso. Faz sentido isolar coisas que podem mudar, por exemplo, usando modelos para gerar HTML. Faz menos sentido isolar coisas que provavelmente não serão alteradas, por exemplo, o banco de dados de backup. O que provavelmente mudará depende do contexto e das necessidades dos negócios.

Estruturas fazem suposições sobre o que vai mudar. Por exemplo, o React tende a assumir que o design e o comportamento de um componente mudam juntos, por isso não faz sentido separá-los. Poucas estruturas supõem que você queira alterar a estrutura. Como tal, as estruturas apresentam uma quantidade de bloqueio. Por exemplo, a confiança de Rail no padrão Active Record (muito opinativo!) Dificulta a impossibilidade de alterar sua estratégia de acesso a dados para o padrão (geralmente superior) do Repositório. Se suas expectativas de mudança não corresponderem à estrutura, usar uma estrutura diferente pode ser melhor. Muitas outras estruturas da web não fazem suposições sobre o acesso a dados.

amon
fonte
20
Nota lateral: Robert C Martin tem essa tendência infeliz de apresentar algo como a melhor coisa do mundo e sugerir que essa é a única abordagem sensata. Ele geralmente não está completamente errado. Mas ele muitas vezes omite a discussão de possíveis desvantagens e é propenso a hipérbole. Como resultado, seus conselhos tendem a ser enganosos. Portanto, é melhor ignorar completamente tudo o que ele diz.
amon
2
Adoro ouvir uma declaração como essa, porque muitas vezes encontro pessoas que tentam cegamente seguir tudo que ele diz. Pelo menos, se você seguir a abordagem "esta é uma maneira, que geralmente funciona, mas sempre mantenha um olhar atento", posso me sentir melhor com ele, mas não posso realmente dizer que sou fã de Robert Martin
jleach
6
Isso é engraçado, porque eu me lembro dele enfatizando que sua solução não foi a única no livro. Então, ele falou sobre sua solução em maior profundidade. Pessoalmente, eu não ligo para algumas de suas postagens, mas a Arquitetura Limpa foi uma ótima leitura.
bitsoflogic
2
@bitsoflogic Isso é bom saber! TBH Eu não li seus livros e minha opinião é baseada em suas palestras, artigos e perguntas de pessoas que leem suas coisas. Até agora, já vi mais exemplos em que ele não possui nenhuma nuance perceptível. Esse é um problema real, considerando que o Clean Code é muito comercializado para desenvolvedores juniores que ainda não conseguem colocar suas opiniões em contexto. Sua palestra sobre a Arquitetura Limpa (essa pergunta é baseada em uma gravação) não parece discutir limitações. Para o público pretendido, tudo bem, para quem o considera uma "autoridade", isso apresenta um ponto de vista enganoso.
amon
1
@ amon Eu realmente adoraria ver alguém falar com mais profundidade sobre tempo e local para muitos dos padrões e arquiteturas. Eles costumam lidar com um determinado problema, seja devido à linguagem de codificação ou à necessidade do negócio, mas as discussões sempre se concentram no "como implementar". Quanto ao livro, seu conhecimento da história da codificação (vivida) foi capaz de colocar uma perspectiva única sobre as coisas. Dito isto, acho que você encontrará principalmente o mesmo problema no livro que viu nas negociações.
bitsoflogic
24

Gostei muito dos conceitos do vídeo Os Princípios da Arquitetura Limpa, do tio Bob Martin. Mas sinto que esse padrão é como uma combinação dos padrões Abstract Factory e Builder em sua essência.

Nem mesmo perto.

Quando você olha para isso:

insira a descrição da imagem aqui

Você está olhando para o design de um gráfico de objetos. Isso determina o que sabe sobre o quê. O que falta nessa história é como esse gráfico de objetos foi construído. Desculpe, mas você não encontrará isso aqui. Não há nenhuma menção à construção.

Você pode construir tudo isso sem fábricas e construtores abstratos. Eu sei porque eu fiz isso . Eu nem pretendi evitá-los. Adoro eles. Eu simplesmente não precisava deles. Eu apenas usei passagem de referência. Injeção de Dependência é o termo chique para isso.

Na verdade, eu poderia construir tudo o que você vê nesse diagrama em geral. Em seguida, basta chamar um método em um objeto para iniciar o processo.

Agora as coisas precisam existir antes que você possa colocá-las em outras coisas. Eu explorei isso aqui e dei a esse pequeno diagrama bonitinho:

insira a descrição da imagem aqui

E você pode construir tudo isso sem precisar sair main().

Eu recomendaria o uso de construtores e fábricas quando você quiser dividir uma pilha de código de construção processual em pedaços conceituais de bom tamanho. Mas não há nada na arquitetura limpa ou em qualquer outra arquitetura de palavra-chave que exija que você faça isso. Então, se você quiser continuar main(), tudo bem. Apenas por favor, tenha piedade .

A “Arquitetura Limpa” de Bob Martin é uma regra de ouro para todas as arquiteturas ou é apenas uma das opções?

Considero Arquitetura Limpa como um chavão usado para levar as pessoas a um blog e um livro. Esse blog e livro têm explicações muito boas de arquiteturas antigas muito semelhantes, com nomes mais antigos usados ​​para levar as pessoas a blogs e livros mais antigos. Especificamente cebola, bem como portas e adaptadores. Nenhuma das quais são as únicas opções de arquitetura que você possui.

Eu gosto do tio Bob porque ele é um incrível palestrante e autor público. Ele me faz pensar em coisas que eu não teria de outra maneira. Mas se você deixar isso transformá-lo em um fanático religioso que insiste que tudo deve ser feito da maneira dele, você descobrirá rapidamente que a atualização da documentação é a mais próxima que eu deixarei que você chegue ao meu código.

As arquiteturas de chavão são úteis quando você tem um código de longa duração que precisa persistir enquanto o mundo muda em torno dele. É quando brilha. Se o mundo estiver estável em comparação com o código, você estará fazendo coisas sofisticadas sem uma boa razão.

Não importa o quão impressionante algo pareça, existe um contexto em que você pode colocá-lo, que o tornará absurdo. Desculpe, isso também não é uma bala de prata.

Mas, no vídeo, sinto que ele sugere que a arquitetura limpa deve ter uma fronteira clara entre a lógica de negócios e as estruturas. Estruturas (web, android, etc.) devem ser plugins que se conectam à lógica de negócios. Ele até zomba sutilmente dos trilhos no vídeo.

Você está certo. Ele faz. Tio Bob acha que os frameworks podem ser tratados como bibliotecas. E eles podem. Mas mesmo essa decisão lhe custa algo.

O que o Sr. Martin está tentando preservar é um espaço em que sua linguagem de propósito geral ainda é geral. Você desiste disso quando espalha uma estrutura por toda parte. Quando você faz isso, está seguindo o caminho de transformar seu idioma em algo chamado idioma específico do domínio. HTML é uma linguagem específica do domínio. Faz seu trabalho muito bem, mas há outros trabalhos que ele não pode fazer.

Desde que suas necessidades sejam antecipadas pela estrutura, as coisas correrão muito bem. É bom ter suas necessidades antecipadas. Coloca você em uma caixa que mantém as coisas simples. Basta entender o que você está desistindo para conseguir isso. Se você espalhar o Spring em todos os lugares, não poderá mais publicá-lo como um trabalho em Java. É um trabalho Java / Spring. Eu poderia dizer o mesmo sobre Ruby e Rails, mas Rails almoçou com Ruby há muito tempo.

candied_orange
fonte
4

Para citar o vídeo:

"Você não deseja fazer mala direta no SQL."

Seguido por:

"Na verdade, vi um procedimento armazenado SQL que era uma mala direta inteira"

A arquitetura, como mala direta, é apenas uma opção entre muitas.

O que não é opcional são os problemas que a arquitetura está tentando resolver.

Se você entender quais problemas a mala direta do SQL causa em relação a outras soluções, sua escolha de arquitetura será informada e, mesmo se você for forçado a escolher soluções 'ruins', estará ciente e atenuará seus déficits.

Se você seguir um estilo de arquitetura apenas porque é bem pensado, é provável que cometa erros e encontre os mesmos problemas.

Ewan
fonte
2

"Arquitetura limpa" é definitivamente "apenas" uma das opções. Eu diria que é uma das más opções para a maioria dos projetos, especialmente para projetos orientados a objetos.

Aqui está uma análise sentença por sentença do artigo do tio Bob sobre arquitetura limpa, com os motivos da declaração acima:

A arquitetura limpa de uma perspectiva orientada a objetos

Robert Bräutigam
fonte
1

Arquitetura Limpa é um conjunto de princípios e padrões para abordar uma série de sintomas comuns que as organizações de desenvolvimento de software geralmente enfrentam durante a vida útil da criação de aplicativos complexos. Martin se esforça ao máximo para identificar os sintomas e as causas-raiz com base em sua vasta experiência no campo e esclarecer o papel da arquitetura na mitigação dessas preocupações.

No entanto, não é uma regra de ouro, nem uma panacéia para todos os males. Se você ler o livro, entenderá melhor se / quando / como aplicar os princípios e padrões que ele defende (e as compensações envolvidas). Se você não leu o livro, é provável que faça suposições, solicitações, julgamentos e declarações incorretas com base em informações incompletas.

Cory Serratore
fonte
isso não parece oferecer nada substancial sobre os pontos apresentados e explicados em 4 respostas anteriores
gnat 3/12