{"id":357,"date":"2025-06-14T16:14:52","date_gmt":"2025-06-14T19:14:52","guid":{"rendered":"https:\/\/cahfelix.tech\/blog\/?p=357"},"modified":"2025-10-30T14:08:23","modified_gmt":"2025-10-30T17:08:23","slug":"livro-patterns-of-enterprise-application-architecture-layering","status":"publish","type":"post","link":"https:\/\/cahfelix.tech\/blog\/livro-patterns-of-enterprise-application-architecture-layering\/","title":{"rendered":"Livro Patterns of Enterprise Application Architecture &#8211; Layering"},"content":{"rendered":"\n<p>Um dos livros que mais marcaram o mundo da arquitetura de software \u00e9 <strong>Patterns of Enterprise Application Architecture<\/strong>, do Martin Fowler.<\/p>\n\n\n\n<p>\u00c9 um cl\u00e1ssico, denso, cheio de conceitos e discuss\u00f5es sobre como construir sistemas corporativos robustos e de longo prazo.<\/p>\n\n\n\n<p>Mas hoje quero conversar sobre ele de forma leve, como um papo de corredor entre quem gosta de engenharia e boas pr\u00e1ticas.<\/p>\n\n\n\n<p>Meu objetivo \u00e9 traduzir o conceito de <strong>Layering (Camadas)<\/strong> de um jeito acess\u00edvel e aplic\u00e1vel no dia a dia.<br>Afinal, entender o <em>por que<\/em> \u00e9 t\u00e3o importante quanto entender o <em>como<\/em>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"103f\">Layering (Camadas) na Arquitetura de Software<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"6b7f\"><strong>Por que falar de camadas?<\/strong><\/h3>\n\n\n\n<p>Sempre que algu\u00e9m diz \u201cminha camada de neg\u00f3cio\u201d ou \u201ca camada de dados\u201d, est\u00e1 aplicando um dos princ\u00edpios mais antigos da arquitetura de software: <strong>a separa\u00e7\u00e3o de responsabilidades<\/strong>.<\/p>\n\n\n\n<p>Dividir o sistema em partes bem definidas faz com que ele fique:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>mais f\u00e1cil de entender,<\/li>\n\n\n\n<li>mais simples de dar manuten\u00e7\u00e3o,<\/li>\n\n\n\n<li>e menos propenso a virar aquele famoso <em>macarr\u00e3oz\u00e3o de c\u00f3digo<\/em>.<\/li>\n<\/ul>\n\n\n\n<p><strong>Exemplo pr\u00e1tico, <\/strong>Pense num e-commerce. Voc\u00ea pode ter:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Camada de apresenta\u00e7\u00e3o (UI)<\/strong>: mostra os produtos e recebe os cliques do usu\u00e1rio.<\/li>\n\n\n\n<li><strong>Camada de neg\u00f3cio (domain\/service)<\/strong>: valida regras, como estoque dispon\u00edvel e c\u00e1lculo de frete.<\/li>\n\n\n\n<li><strong>Camada de dados (repository)<\/strong>: fala com o banco, buscando e salvando informa\u00e7\u00f5es.<\/li>\n<\/ul>\n\n\n\n<p>Separar isso faz toda diferen\u00e7a. Se amanh\u00e3 voc\u00ea quiser mudar o banco de dados de MySQL para MongoDB, n\u00e3o precisa mexer nas regras de neg\u00f3cio. Cada parte cuida do seu papel.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Abstra\u00e7\u00e3o: a chave de uma boa arquitetura<\/strong><\/h3>\n\n\n\n<p>Camadas funcionam porque existe <strong>abstra\u00e7\u00e3o<\/strong> entre elas. Uma camada n\u00e3o precisa saber <em>como<\/em> a outra funciona, s\u00f3 <em>o que<\/em> ela faz.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplo pr\u00e1tico<\/h4>\n\n\n\n<p>Imagine que voc\u00ea tem um <code>UserService<\/code> que chama um <code>UserRepository<\/code>.<\/p>\n\n\n\n<p>O servi\u00e7o n\u00e3o precisa saber se os dados v\u00eam de um banco SQL, de um arquivo JSON ou de uma API externa, ele apenas chama algo como <code>userRepository.findById(id)<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Service\nconst user = await userRepository.findById(id)\nreturn user.activate()<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Repository\nfindById(id) {\n  return database.query('SELECT * FROM users WHERE id = ?', &#91;id])\n}<\/code><\/pre>\n\n\n\n<p>Essa abstra\u00e7\u00e3o permite trocar o reposit\u00f3rio sem mexer na camada de neg\u00f3cio. Mas vale lembrar: <strong>abstrair demais tamb\u00e9m \u00e9 perigoso<\/strong>.<\/p>\n\n\n\n<p>J\u00e1 vi projetos com 10 camadas intermedi\u00e1rias entre o controller e o banco.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Camadas demais viram um labirinto.<\/li>\n\n\n\n<li>Camadas de menos viram um caos acoplado.<\/li>\n\n\n\n<li>O segredo est\u00e1 no equil\u00edbrio.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Layer vs Tier: a confus\u00e3o cl\u00e1ssica<\/strong><\/h3>\n\n\n\n<p>\u00c9 muito comum confundir <strong>Layer<\/strong> com <strong>Tier<\/strong>, mas eles s\u00e3o coisas diferentes.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Layer (Camada):<\/strong> separa\u00e7\u00e3o <em>l\u00f3gica<\/em> no c\u00f3digo.<br>Exemplo: controller, service, repository.<\/li>\n\n\n\n<li><strong>Tier:<\/strong> separa\u00e7\u00e3o <em>f\u00edsica<\/em> na infraestrutura.<br>Exemplo: front-end em um servidor, backend em outro, banco em um terceiro.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplo pr\u00e1tico<\/h4>\n\n\n\n<p>Um sistema pode ter <strong>tr\u00eas layers<\/strong> (Controller \u2192 Service \u2192 Repository)<br>mas rodar <strong>em apenas um tier<\/strong> (um \u00fanico servidor).<\/p>\n\n\n\n<p>J\u00e1 outro sistema pode ter as mesmas camadas, s\u00f3 que divididas fisicamente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O front-end React hospedado na Vercel,<\/li>\n\n\n\n<li>O backend Node em um servidor AWS,<\/li>\n\n\n\n<li>E o banco PostgreSQL em outro tier.<\/li>\n<\/ul>\n\n\n\n<p>Resumindo:<br><strong>Camada = organiza\u00e7\u00e3o do c\u00f3digo.<\/strong><br><strong>Tier = organiza\u00e7\u00e3o da infraestrutura.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Pasta n\u00e3o \u00e9 camada<\/strong><\/h3>\n\n\n\n<p>Outro erro super comum \u00e9 achar que separar arquivos em pastas significa que o c\u00f3digo est\u00e1 em camadas.<br>N\u00e3o est\u00e1.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplo pr\u00e1tico<\/h4>\n\n\n\n<p>Ter algo assim:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/controllers\n\/services\n\/repositories<\/code><\/pre>\n\n\n\n<p>n\u00e3o garante que exista separa\u00e7\u00e3o de responsabilidades.<br>Se o seu controller faz valida\u00e7\u00e3o, acessa banco e envia e-mail, <strong>as pastas n\u00e3o serviram pra nada<\/strong>.<\/p>\n\n\n\n<p>Camada \u00e9 <strong>sobre o comportamento do c\u00f3digo<\/strong>, n\u00e3o sobre onde ele est\u00e1 salvo.<br>Voc\u00ea pode ter um \u00fanico arquivo com separa\u00e7\u00f5es claras \u2014 e isso ainda \u00e9 layering.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Conclus\u00e3o: camadas s\u00e3o sobre clareza e longevidade<\/strong><\/h3>\n\n\n\n<p>Entender a diferen\u00e7a entre separa\u00e7\u00e3o <strong>l\u00f3gica (layer)<\/strong> e <strong>f\u00edsica (tier)<\/strong> \u00e9 essencial para construir sistemas que duram.<\/p>\n\n\n\n<p>Camadas bem definidas ajudam voc\u00ea a:<br>\ud83d\udd27 Manter e evoluir c\u00f3digo com seguran\u00e7a<br>\ud83e\udde0 Raciocinar sobre a arquitetura com clareza<br>\ud83d\ude80 Escalar sistemas sem perder o controle<\/p>\n\n\n\n<p>Pense nas camadas como o esqueleto de uma boa aplica\u00e7\u00e3o.<br>Elas sustentam o corpo, d\u00e3o forma e garantem que cada parte funcione sem atrapalhar a outra.<\/p>\n\n\n\n<p>No fim das contas, <strong>fazer arquitetura \u00e9 cuidar do seu c\u00f3digo como quem cultiva um jardim<\/strong>: aparando excessos, separando o que precisa de espa\u00e7o e garantindo que tudo cres\u00e7a em harmonia.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um dos livros que mais marcaram o mundo da arquitetura de software \u00e9 Patterns of Enterprise Application Architecture, do Martin Fowler. \u00c9 um cl\u00e1ssico, denso, cheio de conceitos e discuss\u00f5es&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-357","post","type-post","status-publish","format-standard","hentry","category-arquitetura-de-software"],"aioseo_notices":[],"featured":false,"read_time":4,"_links":{"self":[{"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/posts\/357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/comments?post=357"}],"version-history":[{"count":4,"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/posts\/357\/revisions"}],"predecessor-version":[{"id":363,"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/posts\/357\/revisions\/363"}],"wp:attachment":[{"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/media?parent=357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/categories?post=357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cahfelix.tech\/blog\/wp-json\/wp\/v2\/tags?post=357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}