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?
fonte
Respostas:
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.
fonte
Nem mesmo perto.
Quando você olha para isso:
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:
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 .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.
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.
fonte
Para citar o vídeo:
Seguido por:
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.
fonte
"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
fonte
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.
fonte