{"id":4048,"date":"2022-04-26T09:55:29","date_gmt":"2022-04-26T12:55:29","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=4048"},"modified":"2024-01-12T18:01:32","modified_gmt":"2024-01-12T21:01:32","slug":"entendendo-e-convivendo-com-o-acoplamento","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/","title":{"rendered":"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento"},"content":{"rendered":"<strong>O alto acoplamento \u00e9, provavelmente, a principal caracter\u00edstica de sistemas dif\u00edceis de evoluir e, at\u00e9 mesmo, de manter.<\/strong> Por esse motivo, as decis\u00f5es de <em>design<\/em>, n\u00e3o apenas as relacionadas \u00e0 arquitetura, devem mitigar as chances de que ele aconte\u00e7a.\n<div style=\"background-color: #f0eef4; width: 100%; padding: 35px 30px 20px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px;\">\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 28px; font-family: Montserrat; color: #432b75;\">Defini\u00e7\u00e3o: Acoplamento<\/p>\r\n<p style=\"font-size: 16px; font-weight: Regular; line-height: 20px; font-family: Roboto; color: #45365d;\">Duas ou mais partes de um sistema de software est\u00e3o acopladas quando a mudan\u00e7a em uma delas implica mudan\u00e7as nas outras.<\/p>\r\n<\/div>\n<div class=\"nota-youtube\">\r\n<table class=\"tabelayoutube\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-youtube-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/><\/td>\r\n<td class=\"nota-youtube-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/>\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">SOLID Principles (Uncle Bob)<\/p>\r\nNesta palestra, &#8220;<a href=\"http:\/\/cleancoder.com\/products\">Uncle&#8221; Bob<\/a> compartilha como a aplica\u00e7\u00e3o de princ\u00edpios SOLID, na arquitetura, podem ajudar a mitigar os riscos associados ao acoplamento. \r\n<p><a class=\"botao-youtube\" href=\"https:\/\/www.youtube.com\/watch?v=zHiWqnTWsn4\" target=\"_blank\" rel=\"noopener\" style=\"margin-top: 20px;\">Acessar v\u00eddeo<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\nEm um n\u00edvel mais alto da arquitetura &#8211; quando ponderamos na integra\u00e7\u00e3o entre aplica\u00e7\u00f5es &#8211; , uma das muitas causas para o surgimento do acoplamento \u00e9 o choque de duas for\u00e7as. De um lado, h\u00e1 um incentivo constante para o desenvolvimento de integra\u00e7\u00f5es, cada vez mais amplas, em tempos cada vez menores. De outro, h\u00e1 o desejo de garantir <span style=\"text-decoration: underline;\">governan\u00e7a arquitetural<\/span> e manter as efici\u00eancias dos times que ficam, evidentemente, prejudicadas em fun\u00e7\u00e3o do aumento da complexidade e da dificuldade para a &#8220;garantia da qualidade&#8221;, por causa das integra\u00e7\u00f5es, levando a pol\u00edticas de controle, muitas vezes, insustent\u00e1veis. <strong>Esse &#8220;aperta-solta&#8221;\u00a0 colabora para a eros\u00e3o arquitetural.<\/strong>\n<hr \/>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/sandboxing_cycle.png\" alt=\"Sandboxing Cycle\" \/><\/p>\n<span style=\"font-weight: 400;\">O combate ao acoplamento \u00e9 uma das principais motiva\u00e7\u00f5es para padr\u00f5es de <em>design<\/em> e pr\u00e1ticas de engenharia populares &#8211; como invers\u00e3o de controle, decomposi\u00e7\u00e3o em microsservi\u00e7os, comunica\u00e7\u00e3o ass\u00edncrona, CQRS, <\/span><i><span style=\"font-weight: 400;\">event-driven<\/span><\/i><span style=\"font-weight: 400;\">, distribui\u00e7\u00e3o em camadas, <\/span><span style=\"font-weight: 400;\">testes e muito mais. <strong>Ali\u00e1s, boa parte dos &#8220;problemas&#8221; percebidos na implementa\u00e7\u00e3o desses padr\u00f5es e pr\u00e1ticas decorre da &#8220;ignor\u00e2ncia&#8221; desse prop\u00f3sito.<\/strong><\/span>\n<hr \/>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> O acoplamento \u00e9 uma das principais causas para dificuldades em evoluir software. Logo, maior fonte de custo. D\u00edvidas t\u00e9cnicas associadas com acoplamento costumam ser as que cobram &#8220;juros&#8221; mais altos.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Tipos de acoplamento<\/h2>\n<div class=\"nota-alerta\">\r\n<table class=\"tabelaalerta\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img loading=\"lazy\" decoding=\"async\" class=\"img-citacao\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/ico-citacao-2.png\" alt=\"\" width=\"60\" height=\"60\" \/> <em>All things are poison, and nothing is without poison; the dosage alone makes it so a thing is not a poison.<\/em>\r\n<p><strong>Paracelsus<\/strong><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p><strong>Em termos pr\u00e1ticos, o acoplamento &#8220;amarra&#8221; iniciativas e frentes de trabalho aumentando os custos de gest\u00e3o por demandar atividades de sincroniza\u00e7\u00e3o e coordena\u00e7\u00e3o<\/strong>.<\/p>\n<p>H\u00e1 muitas formas de classificar o acoplamento. Entretanto uma das mais aceitas indica que acoplamento pode ser:<\/p>\n<ul>\n<li><strong>Operacional\u00a0<\/strong>&#8211; quando um componente n\u00e3o consegue &#8220;funcionar&#8221; quando outro componente n\u00e3o est\u00e1 dispon\u00edvel;<\/li>\n<li><strong>Desenvolvimento\u00a0<\/strong>&#8211; quando mudan\u00e7as em um componente implica em mudan\u00e7as coordenadas em outro;<\/li>\n<li><strong>Sem\u00e2ntico\u00a0<\/strong>&#8211; quando dois componentes atribuem e dependem significados comuns para determinados conceitos (por exemplo, com a implementa\u00e7\u00e3o de n\u00facleos compartilhados em DDD)<\/li>\n<li><strong>Funcional\u00a0<\/strong>&#8211; quando dois componentes precisam trabalhar juntos por compartilhar uma &#8220;responsabilidade&#8221;<\/li>\n<li><strong>Incidental\u00a0<\/strong>&#8211; quando dois componentes est\u00e3o acoplados sem nenhuma &#8220;boa&#8221; raz\u00e3o (contratos de APIs)<\/li>\n<\/ul>\n<hr \/>\n<p>Os tipos de acoplamento indicados acima n\u00e3o s\u00e3o excludentes.<\/p>\n<div class=\"nota-insight\">\r\n<table class=\"tabelainsight\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-coluna-1\" valign=\"top\"><img decoding=\"async\" class=\"img-insight\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/><\/td>\r\n<td class=\"nota-coluna-2\"><img loading=\"lazy\" decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/ico-lamp-2.png\" alt=\"\" width=\"70\" height=\"70\" \/> Sempre que poss\u00edvel, evite a defini\u00e7\u00e3o de n\u00facleos compartilhados.<\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<div class=\"nota-youtube\">\r\n<table class=\"tabelayoutube\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-youtube-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/><\/td>\r\n<td class=\"nota-youtube-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/11\/youtube.png\" alt=\"\" width=\"80\" height=\"80\" \/>\r\n<p style=\"font-size: 24px; font-weight: bold; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Uncoupling - Michael Nygard<\/p>\r\nNesta palestra, <a href=\"https:\/\/www.michaelnygard.com\/\">Michael Nygard<\/a> compartilha conceitos e <em>insights<\/em> sobre acoplamento, principalmente considerando sua inevitabilidade. \r\n<p><a class=\"botao-youtube\" href=\"https:\/\/www.youtube.com\/watch?v=esm-1QXtA2Q\" target=\"_blank\" rel=\"noopener\" style=\"margin-top: 20px;\">Acessar v\u00eddeo<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<p>H\u00e1 tamb\u00e9m a classifica\u00e7\u00e3o entre acoplamento est\u00e1tico &#8211; aquele que pode ser identificado a partir de an\u00e1lise est\u00e1tica &#8211; e acoplamento din\u00e2mico &#8211; que \u00e9 percebido em tempo de execu\u00e7\u00e3o.<\/p>\n<h2>A busca pela melhoria cont\u00ednua na arquitetura<\/h2>\n<p>A redu\u00e7\u00e3o de custos no desenvolvimento de software, ao longo do tempo, pode ser obtida pela busca disciplinada e mitiga\u00e7\u00e3o das fontes de acoplamento.<\/p>\n<p>As pr\u00e1ticas de arquitetura de software devem, continuamente:<\/p>\n<ol>\n<li>Procurar e explicitar acoplamentos latentes;<\/li>\n<li>Analisar os custos decorrentes dos acoplamentos identificados;<\/li>\n<li>Analisar\u00a0<em>trade-offs\u00a0<\/em>para determinar formas alternativas de acoplamento, mais baratas<\/li>\n<li>Projetar e acompanhar a implementa\u00e7\u00e3o de &#8220;ant\u00eddotos&#8221; para o acoplamento.<\/li>\n<\/ol>\n<div class=\"nota-livro\">\r\n<table class=\"tabelalivro\" style=\"width: 100%;\">\r\n<tbody>\r\n<tr>\r\n<td class=\"nota-livro-coluna-1\" valign=\"top\"><img decoding=\"async\" src=\"https:\/\/m.media-amazon.com\/images\/I\/51oVT2PQgPL.jpg\" alt=\"\" width=\"150\" \/><\/td>\r\n<td class=\"nota-livro-coluna-2\"><img decoding=\"async\" class=\"nota-img\" src=\"https:\/\/m.media-amazon.com\/images\/I\/51oVT2PQgPL.jpg\" alt=\"\" width=\"150\" \/>\r\n<p style=\"font-size: 20px; font-weight: bold; color: #4c4c4c; line-height: 1.1; font-family: Montserrat; margin-bottom: 10px;\">Software Architecture: The Hard Parts<\/p>\r\nComo o acoplamento fundamenta as decis\u00f5es e pr\u00e1ticas de arquitetura? Este \u00e9 o tema central desse livro, mais do que recomendado,\r\n<p><a class=\"botao-livro\" href=\"https:\/\/www.amazon.com.br\/Software-Architecture-Hard-Parts-English-ebook\/dp\/B09H2H5QKC\/\" target=\"_blank\" rel=\"noopener\">Acessar livro<\/a><\/p>\r\n<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<\/div>\n<h2>Acoplamento aferente e eferente<\/h2>\n<p>O acoplamento &#8220;nasce&#8221; de diversas formas, mas assume apenas duas naturezas gen\u00e9ricas distintas: aferente (<em>incoming<\/em>) e eferente (<em>outcoming<\/em>).<\/p>\n<p><strong>O acoplamento aferente de um artefato &#8211; seja ele um componente, classe, fun\u00e7\u00e3o, etc &#8211; surge quando este \u00e9 referenciado por outro.<\/strong> Quando, por exemplo, o c\u00f3digo de uma classe &#8220;A&#8221; faz refer\u00eancia ao c\u00f3digo de uma classe &#8220;B&#8221;, diz-se que &#8220;B&#8221; tem um incremento em seu acoplamento aferente. <strong>Por outro lado, o acoplamento eferente de um artefato surge quando este demanda (ou depende) de outro.<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4051\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01.png\" alt=\"\" width=\"334\" height=\"145\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01.png 2276w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01-300x130.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01-1024x445.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01-768x334.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01-1536x668.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/01-2048x891.png 2048w\" sizes=\"(max-width: 334px) 100vw, 334px\" \/><\/p>\n<p><strong>Artefatos com acoplamento eferente mais alto &#8220;quebram&#8221; com mais frequ\u00eancia<\/strong>, pois, al\u00e9m de sua qualidade interna, s\u00e3o fortemente impactados pela qualidade interna de suas depend\u00eancias.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4052\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02.png\" alt=\"\" width=\"334\" height=\"565\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02.png 1297w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02-177x300.png 177w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02-606x1024.png 606w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02-768x1299.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02-908x1536.png 908w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/02-1211x2048.png 1211w\" sizes=\"(max-width: 334px) 100vw, 334px\" \/><\/p>\n<p><strong>Artefatos com acoplamento aferente alto s\u00e3o potenciais &#8220;pontos de falha&#8221; graves<\/strong>. Afinal de contas, problemas em sua qualidade interna afetam todos os que dele dependem.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4053 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03.png\" alt=\"\" width=\"334\" height=\"565\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03.png 1363w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03-177x300.png 177w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03-606x1024.png 606w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03-768x1299.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03-908x1536.png 908w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/03-1211x2048.png 1211w\" sizes=\"(max-width: 334px) 100vw, 334px\" \/><\/p>\n<p>Um indicador derivado das m\u00e9tricas de acoplamentos aferente e eferente \u00e9 a instabilidade. Trata-se da propor\u00e7\u00e3o, em um determinado artefato, de acoplamento eferente em rela\u00e7\u00e3o ao acoplamento total.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1483 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/instabilidade.png\" alt=\"\" width=\"214\" height=\"98\" \/><\/p>\n<p>Quanto maior a instabilidade ponderada de um conjunto de artefatos, em um determinado m\u00f3dulo, maiores s\u00e3o as chances de &#8220;quebra&#8221;.<\/p>\n<h2>O &#8220;problema&#8221; das depend\u00eancias externas<\/h2>\nEm todo sistema relevante, h\u00e1 sempre um bocado de depend\u00eancias para componentes externos. <strong>As depend\u00eancias estabelecidas em componentes com maior acoplamento aferente t\u00eam, pelo menos em teoria, maior criticidade.<\/strong> Logo, demandam mais cuidados e gest\u00e3o para mudan\u00e7a (atualiza\u00e7\u00e3o). Entretanto, esse &#8220;aumento do cuidado&#8221;, se implementado de maneira ing\u00eanua, tende ao aumento perigoso de &#8220;burocracia ruim&#8221;.\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/dependency.png\" width=\"287\" height=\"365\" \/><\/p>\n<strong>Quanto maior complexidade aferente uma depend\u00eancia externa possuir, maior, tamb\u00e9m \u00e9 a criticidade para sua manuten\u00e7\u00e3o e, tamb\u00e9m, maior a tenta\u00e7\u00e3o para aumentar o &#8220;controle&#8221; sobre seu desenvolvimento, inclinando times, muitas vezes, a &#8220;reinventar a roda&#8221; ou, ainda mais impactante, trazer fornecedores para &#8220;dentro de casa&#8221;<\/strong>. Em grandes organiza\u00e7\u00f5es, isso consiste em dificuldade para organiza\u00e7\u00e3o de times e, em casos extremos, tornam inquestion\u00e1veis a relev\u00e2ncia da gest\u00e3o de c\u00f3digo envolvendo <em>open sourcing\u00a0<\/em>ou\u00a0<em>inner sourcing<\/em>.\n<hr \/>\n<p>Em grandes organiza\u00e7\u00f5es h\u00e1 um &#8220;misto de emo\u00e7\u00f5es&#8221; com rela\u00e7\u00e3o a &#8220;abertura&#8221; das depend\u00eancias externas. H\u00e1 quem considere arriscado em demasia &#8220;confiar&#8221; em padr\u00f5es e tecnologias &#8220;fechadas&#8221;. Da\u00ed, aderem a pol\u00edtica de somente utilizar tecnologias e padr\u00f5es &#8220;abertos&#8221;. No outro extremo, h\u00e1 quem suspeite, muitas vezes por ignor\u00e2ncia, da gest\u00e3o do\u00a0<em>roadmap\u00a0<\/em>e das motiva\u00e7\u00f5es das iniciativas mais abertas, optando por &#8220;marcas&#8221; no lugar de evid\u00eancias (<em>cover my ass strategy<\/em>)<em>.<\/em><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/open_source.png\" width=\"462\" height=\"309\" \/><\/p>\n<h2>O &#8220;problema&#8221; do banco de dados monol\u00edtico<\/h2>\n<p>O banco de dados \u00e9 componente importante na maioria das aplica\u00e7\u00f5es.<\/p>\n<p>Tradicionalmente, grandes aplica\u00e7\u00f5es concentram as informa\u00e7\u00f5es de todos os seus m\u00f3dulos em um mesmo banco de dados. Uma das justificativas \u00e9 que isso simplifica a integra\u00e7\u00e3o entre estes m\u00f3dulos. <strong>O &#8220;problema&#8221;, entretanto, \u00e9 que junto com a potencial simplicidade de integra\u00e7\u00e3o h\u00e1 o crescimento do acoplamento aferente.\u00a0<\/strong>Afinal, falhas no banco de dados s\u00e3o cada vez mais impactantes na medida em que mais &#8220;m\u00f3dulos&#8221; compartilham dele.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4054 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05.png\" alt=\"\" width=\"440\" height=\"250\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05.png 3113w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05-300x171.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05-1024x583.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05-768x437.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05-1536x874.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/05-2048x1166.png 2048w\" sizes=\"(max-width: 440px) 100vw, 440px\" \/><\/p>\n<p>A eventualidade de decomposi\u00e7\u00e3o de um sistema em servi\u00e7os, ou microsservi\u00e7os, preservando o banco de dados monol\u00edtico potencializa o problema.<\/p>\nH\u00e1, no mercado, solu\u00e7\u00f5es de integra\u00e7\u00e3o que envelopam o banco de dados, expondo informa\u00e7\u00f5es a partir de um &#8220;servi\u00e7o de dados&#8221;. Importante, entretanto, observar que, tais solu\u00e7\u00f5es, se implementadas de maneira ing\u00eanua, apenas transferem o acoplamento aferente do banco para o &#8220;servi\u00e7o&#8221;, aumentando as chances de &#8220;<em>vendor locking<\/em>&#8220;.\u00a0\n<hr \/>\n<h2>CQRS: Segrega\u00e7\u00e3o combatendo o acoplamento<\/h2>\n<p>Muitas aplica\u00e7\u00f5es <em>LOB\u00a0<\/em>(<em>Line-Of-Business<\/em>) s\u00e3o projetadas para agrupar componentes conforme sua fun\u00e7\u00e3o prim\u00e1ria. N\u00e3o raro, a estrat\u00e9gia adotada classifica componentes em apresenta\u00e7\u00e3o<em>,\u00a0<\/em>neg\u00f3cio (juntando aplica\u00e7\u00e3o e dom\u00ednio) e\u00a0infraestrutura.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4055 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06.png\" alt=\"\" width=\"781\" height=\"320\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06.png 3187w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06-300x123.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06-1024x419.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06-768x314.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06-1536x628.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/06-2048x838.png 2048w\" sizes=\"(max-width: 781px) 100vw, 781px\" \/><\/p>\nNessa vis\u00e3o os componentes de apresenta\u00e7\u00e3o, que &#8220;interagem&#8221; com o usu\u00e1rio, integram ao sistema recebendo dados, atrav\u00e9s de <em>viewmodels, <\/em>e enviando dados, com <em>inputmodels. <\/em>Ali\u00e1s, essa distin\u00e7\u00e3o forte entre <em>inputmodels <\/em>e <em>viewmodels, <\/em>embora aumente a complexidade (pelo incremento da dimensionalidade), \u00e9, muitas vezes, prefer\u00edvel a uma \u00fanica DTO por aliviar o acoplamento aferente (de um objeto \u00fanico), simplificando mudan\u00e7as e, potencialmente, aumentando o <em>evolvability<\/em>.\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4056 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07.png\" alt=\"\" width=\"781\" height=\"320\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07.png 3187w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07-300x123.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07-1024x419.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07-768x314.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07-1536x628.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/07-2048x838.png 2048w\" sizes=\"(max-width: 781px) 100vw, 781px\" \/><\/p>\n<p>Cabe a camada de aplica\u00e7\u00e3o &#8220;traduzir&#8221; os\u00a0<em>inputmodels\u00a0<\/em>em comandos que, na pr\u00e1tica, s\u00e3o solicita\u00e7\u00f5es para modifica\u00e7\u00f5es de estado (mudan\u00e7a de dados perceb\u00edveis no longo prazo). Ali\u00e1s, essa &#8220;especializa\u00e7\u00e3o&#8221;, permite tamb\u00e9m a distin\u00e7\u00e3o, quando necess\u00e1rio, de m\u00e9tricas de performance importantes para opera\u00e7\u00f5es de longa dura\u00e7\u00e3o, habilitando \u00eanfase de <em>response time\u00a0<\/em>para a aplica\u00e7\u00e3o e de\u00a0<em>throughput<\/em> para o dom\u00ednio, atrav\u00e9s da inclus\u00e3o de um componente para mensageria.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">M\u00e9tricas de performance e componentiza\u00e7\u00e3o<\/p>\r\nCertifique-se de adotar m\u00e9tricas apropriadas de performance para cada natureza de opera\u00e7\u00e3o.<\/p>\n<hr \/>\n<p><strong>Se uma opera\u00e7\u00e3o demandar, ao mesmo tempo, controle tanto de <em>response time\u00a0<\/em>quanto\u00a0<em>throughput<\/em>, h\u00e1 claros ind\u00edcios de revis\u00e3o arquitetural.<\/strong><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4057\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08.png\" alt=\"\" width=\"781\" height=\"324\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08.png 3210w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08-300x124.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08-1024x425.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08-768x318.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08-1536x637.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/08-2048x849.png 2048w\" sizes=\"(max-width: 781px) 100vw, 781px\" \/><\/p>\n<p>Tal medida, ali\u00e1s, reduz o acoplamento aferente do dom\u00ednio, tranferindo-o para o mecanismo de mensageria que, geralmente, tem menos demanda para mudan\u00e7as e \u00e9 ser mais &#8220;est\u00e1vel&#8221; (<a href=\"https:\/\/www.amqp.org\/\">protocolo AMQP n\u00e3o recebe altera\u00e7\u00f5es desde 2012<\/a>).<\/p>\nO &#8220;pulo do gato&#8221; est\u00e1 em identificar que o &#8220;dom\u00ednio&#8221; pode ser pesado demais para a composi\u00e7\u00e3o de <em>viewmodels\u00a0<\/em>e pode acabar sendo &#8220;penalizado&#8221; pelo crescimento do acoplamento aferente decorrente da &#8220;instabilidade&#8221; das consultas, comum em aplica\u00e7\u00f5es <em>LOB<\/em>. Eventualmente, n\u00e3o seria m\u00e1 ideia segregar modelos para aliviar tal acoplamento.\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4058 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09.png\" alt=\"\" width=\"781\" height=\"319\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09.png 3057w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09-300x123.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09-1024x419.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09-768x314.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09-1536x628.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/09-2048x837.png 2048w\" sizes=\"(max-width: 781px) 100vw, 781px\" \/><\/p>\n<p>Esta segrega\u00e7\u00e3o do neg\u00f3cio em modelos distintos para comandos e consultas (<em>Command Query Responsibility Segregation &#8211; CQRS<\/em>) literalmente &#8220;divide&#8221; o acoplamento aferente da camada de neg\u00f3cios em duas partes, aumentando o custo potencial de desenvolvimento, por\u00e9m, geralmente, reduzindo o custo de manuten\u00e7\u00e3o, por\u00e9m, aumentando o acoplamento aferente para o banco de dados.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4059 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10.png\" alt=\"\" width=\"781\" height=\"468\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10.png 3057w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10-300x180.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10-1024x613.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10-768x460.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10-1536x919.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/10-2048x1226.png 2048w\" sizes=\"(max-width: 781px) 100vw, 781px\" \/><\/p>\n<p>Em cen\u00e1rios extremos, o pr\u00f3prio banco de dados pode ser &#8220;segregado&#8221; para fun\u00e7\u00f5es de grava\u00e7\u00e3o e consulta (algo bem comum, se pensar na utiliza\u00e7\u00e3o de mecanismos de\u00a0<em>caching<\/em>) com vistas a reduzir o acoplamento aferente desse componente, com impacto positivo na escala, mas negativo no custo.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Caching, mensageria e a escalabilidade<\/p>\r\nMensageria e <em>caching\u00a0<\/em>s\u00e3o chaves para sistemas escal\u00e1veis. Por\u00e9m, aumentam a complexidade da solu\u00e7\u00e3o pelo incremento da dimensionalidade.<\/div>\n<h2>Combatendo acoplamento com abstra\u00e7\u00f5es<\/h2>\n<p><strong>Um dos principais recursos para a redu\u00e7\u00e3o o acoplamento aferente, pelo menos do ponto de vista est\u00e1tico, \u00e9 a introdu\u00e7\u00e3o de abstra\u00e7\u00f5es<\/strong>. Ou seja, a substitui\u00e7\u00e3o das depend\u00eancias de implementa\u00e7\u00f5es concretas por abstratas, como interfaces e\/ou contratos.<\/p>\nA introdu\u00e7\u00e3o de abstra\u00e7\u00f5es\u00a0 &#8211; como <em>delegates<\/em>, <em>high order functions<\/em>, interfaces, classes abstratas e contratos de servi\u00e7o &#8211; transfere o acoplamento das implementa\u00e7\u00f5es concretas para estas abstra\u00e7\u00f5es. Geralmente, isso causa al\u00edvio de complexidade e viabiliza o isolamento mais efetivo das unidades, facilitando, entre outras coisas a escrita de testes automatizados.<strong> Entretanto, quando abstra\u00e7\u00f5es s\u00e3o criadas em demasia, cresce a dificuldade dos desenvolvedores para entender como os componentes se conectam no contexto din\u00e2mico (durante a execu\u00e7\u00e3o), aumentando o volume de carga cognitiva necess\u00e1ria para o trabalho e, consequentemente, custos de desenvolvimento.<\/strong>\n<hr \/>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4060 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11.png\" alt=\"\" width=\"539\" height=\"162\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11.png 3420w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11-300x90.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11-1024x308.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11-768x231.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11-1536x462.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/11-2048x616.png 2048w\" sizes=\"(max-width: 539px) 100vw, 539px\" \/><\/p>\n<p>As abstra\u00e7\u00f5es tendem a se tornar &#8220;dif\u00edceis de mudar&#8221; na medida em que o software vai sofrendo adapta\u00e7\u00f5es, com a cria\u00e7\u00e3o de mais implementa\u00e7\u00f5es concretas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4061 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12.png\" alt=\"\" width=\"539\" height=\"356\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12.png 3407w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12-300x198.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12-1024x676.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12-768x507.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12-1536x1013.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/12-2048x1351.png 2048w\" sizes=\"(max-width: 539px) 100vw, 539px\" \/><\/p>\n<p>Entretanto, bem mais comum (e bem menos controlada) \u00e9 a prolifera\u00e7\u00e3o de artefatos &#8220;consumidores&#8221;, operando atrav\u00e9s de invers\u00e3o de controle ou mecanismos de descoberta.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4062 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13.png\" alt=\"\" width=\"539\" height=\"793\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13.png 1563w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13-204x300.png 204w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13-696x1024.png 696w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13-768x1131.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13-1043x1536.png 1043w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/13-1391x2048.png 1391w\" sizes=\"(max-width: 539px) 100vw, 539px\" \/><\/p>\n<p>Essa &#8220;prolifera\u00e7\u00e3o descontrolada&#8221;, ali\u00e1s, \u00e9 a justificativa para que aprimoramentos sejam explicitados em abstra\u00e7\u00f5es novas, de maneira a n\u00e3o quebrar contratos mais antigos e potencialmente n\u00e3o evidentes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4063 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14.png\" alt=\"\" width=\"539\" height=\"793\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14.png 1563w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14-204x300.png 204w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14-696x1024.png 696w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14-768x1131.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14-1043x1536.png 1043w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/14-1391x2048.png 1391w\" sizes=\"(max-width: 539px) 100vw, 539px\" \/><\/p>\n<p>O volume de abstra\u00e7\u00e3o tamb\u00e9m \u00e9 uma m\u00e9trica arquitetural interessante. De maneira simples, trata-se da propor\u00e7\u00e3o, em um determinado escopo, da quantidade de abstra\u00e7\u00f5es com rela\u00e7\u00e3o a quantidade de implementa\u00e7\u00f5es concretas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1489 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/abstracoes.png\" alt=\"\" width=\"150\" height=\"99\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>O &#8220;lado ruim&#8221; da testabilidade<\/h2>\n<strong>O &#8220;efeito colateral&#8221;, geralmente positivo, da testabilidade de um sistema \u00e9 a redu\u00e7\u00e3o do acoplamento aferente est\u00e1tico, pela introdu\u00e7\u00e3o de abstra\u00e7\u00f5es, necess\u00e1rias para a escrita de testes de unidade.<\/strong> O problema \u00e9 que a introdu\u00e7\u00e3o de abstra\u00e7\u00f5es implica em aumento da complexidade din\u00e2mica que precisar\u00e1 ser compensada pela prote\u00e7\u00e3o contra regress\u00f5es que os testes, em teoria, v\u00e3o apoiar.\n<hr \/>\nArtefatos inst\u00e1veis, ainda em desenvolvimento, podem demandar atualiza\u00e7\u00f5es nas abstra\u00e7\u00f5es que os representam que, como sabemos, tem complexidade aferente sempre maior. Por isso, com frequ\u00eancia \u00e9 justific\u00e1vel postergar a inclus\u00e3o de abstra\u00e7\u00f5es, mesmo sob pena de reduzir a testabilidade.\n<hr \/>\n<h2>O &#8220;lado ruim&#8221; das APIs p\u00fablicas<\/h2>\n<p><strong>APIs p\u00fablicas tem acoplamento aferente din\u00e2mico dif\u00edcil de medir<\/strong>. Entretanto, como se sabe, quanto mais bem sucedidas, geralmente maior ser\u00e1 tal acoplamento e, consequentemente, maiores ser\u00e3o as dificuldades para evoluir. Essa \u00e9 a raz\u00e3o principal para o versionamento eficiente dos contratos p\u00fablicos, com pol\u00edticas claras para descontinuidades.<\/p>\n<strong>Um &#8220;ant\u00eddoto&#8221; para o problema das APIs p\u00fablicas com acoplamento aferente muito grande \u00e9 a segmenta\u00e7\u00e3o das APIs em externas e internas.<\/strong> As APIs externas ser\u00e3o aquelas que ir\u00e3o atender publicamente demandas bem delimitadas, e internas, ir\u00e3o apenas expor funcionalidades e <em>capabilities. <\/em>Tal solu\u00e7\u00e3o, entretanto, tem como custo o aumento da dimensionalidade e, em consequ\u00eancia da complexidade. <strong>Em sistemas maiores, quase sempre \u00e9 necess\u00e1rio desenvolver algum mecanismo de media\u00e7\u00e3o.<\/strong>\n<hr \/>\n<h2>O &#8220;lado ruim&#8221; das arquiteturas <em>event-driven<\/em><\/h2>\n<p><strong>Outro &#8220;ant\u00eddoto&#8221; comum para a complexidade aferente \u00e9 ado\u00e7\u00e3o de comunica\u00e7\u00e3o atrav\u00e9s de eventos. Ali\u00e1s, essa \u00e9 uma &#8220;bomba&#8221; contra o acoplamento que, como tal, acaba tendo efeitos colaterais nem sempre desej\u00e1veis.<\/strong><\/p>\n<p>Sistemas baseados em eventos demandam o planejamento de coreografias, regulando o comportamento din\u00e2mico, tremendamente dif\u00edceis de entender sem o suporte de documenta\u00e7\u00e3o eficiente.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4064\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16.png\" alt=\"\" width=\"445\" height=\"344\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16.png 2944w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16-300x232.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16-1024x792.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16-768x594.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16-1536x1188.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/16-2048x1584.png 2048w\" sizes=\"(max-width: 445px) 100vw, 445px\" \/><\/p>\n<p>A alternativa \u00e9 a introdu\u00e7\u00e3o de componentes especificamente dedicados a orquestra\u00e7\u00e3o, por\u00e9m, estes, acabam comprometidos por terem alto acoplamento aferente.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4065 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17.png\" alt=\"\" width=\"445\" height=\"344\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17.png 2944w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17-300x232.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17-1024x792.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17-768x594.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17-1536x1188.png 1536w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/17-2048x1584.png 2048w\" sizes=\"(max-width: 445px) 100vw, 445px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>Determinando o volume ideal de abstra\u00e7\u00f5es<\/h2>\nComo j\u00e1 foi dito, transferir acoplamento aferente de algumas implementa\u00e7\u00f5es concretas para abstra\u00e7\u00f5es pode simplificar a manutenabilidade dos sistemas, aprimorando o <em>evolvability<\/em>. Entretanto, abstra\u00e7\u00f5es em demasia, ou para artefatos errados, tornam sistemas mais dif\u00edceis de entender e caros para manter.\n<hr \/>\n<p><strong>O volume ideal de abstra\u00e7\u00f5es tem rela\u00e7\u00e3o direta com a instabilidade observada<\/strong>. Quando maior a instabilidade de um artefato, menor a necessidade de uma abstra\u00e7\u00e3o que alivie seu acoplamento aferente. Por outro lado, artefatos com baixa instabilidade &#8220;gritam&#8221; por abstra\u00e7\u00f5es.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4069 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18.png\" alt=\"\" width=\"483\" height=\"489\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18.png 2206w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18-297x300.png 297w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18-1012x1024.png 1012w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18-768x777.png 768w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18-1518x1536.png 1518w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/18-2024x2048.png 2024w\" sizes=\"(max-width: 483px) 100vw, 483px\" \/><\/p>\n<p>No gr\u00e1fico indicado acima, artefatos que se posicionem no canto superior-direito se encaixam na\u00a0<em>zone of uselessness<\/em>, ou seja, c\u00f3digo t\u00e3o abstrato que se converte em algo dif\u00edcil de manter. No outro extremo, artefatos que se posicionem no canto inferior esquerdo est\u00e3o na\u00a0<em>zone of pain,\u00a0<\/em>ou seja, acoplamento aferente extremamente elevado sem o &#8220;al\u00edvio&#8221; de abstra\u00e7\u00f5es que habilitem testabilidade e novas implementa\u00e7\u00f5es.<\/p>\n<p>A medida de desequil\u00edbrio entre a instabilidade e o volume de abstra\u00e7\u00f5es de um software pode ser determinada pela dist\u00e2ncia da condi\u00e7\u00e3o atual e a propor\u00e7\u00e3o adequada.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1521 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/05\/d-1.png\" alt=\"\" width=\"286\" height=\"64\" \/><\/p>\n<h2>Algumas verdades inconvenientes<\/h2>\n<p>Um sistema n\u00e3o pode ser composto apenas por componentes est\u00e1veis. Partes do software que precisam ser adaptadas com mais frequ\u00eancia devem ser aquelas com menor acoplamento aferente e maior acoplamento eferente, logo, com menos abstra\u00e7\u00f5es.<\/p>\n<p>Algumas implica\u00e7\u00f5es da an\u00e1lise do acoplamento s\u00e3o:<\/p>\n<ul>\n<li>O <em>frontend\u00a0<\/em>das aplica\u00e7\u00f5es \u00e9, geralmente, o conjunto de componentes que mais demanda adapta\u00e7\u00f5es, por isso, geralmente, n\u00e3o \u00e9 bom local para solu\u00e7\u00f5es mais sofisticadas e abstra\u00e7\u00f5es inteligentes.<\/li>\n<li>APIs externas, embora menos demandantes de adapta\u00e7\u00f5es, tamb\u00e9m precisam ser inst\u00e1veis para a maioria dos dom\u00ednios, por isso n\u00e3o devem ser projetadas para ter alto acoplamento aferente. Assim, quase sempre \u00e9 prefer\u00edvel, por exemplo, desenvolver uma API externa para atender <em>desktop<\/em> e outra para dispositivos m\u00f3veis, movendo a parte &#8220;est\u00e1vel&#8221; para uma camada de APIs internas.<\/li>\n<li>N\u00e3o &#8220;fechar&#8221; com algumas tecnologias &#8211; como bancos de dados, por exemplo &#8211; introduz a necessidade de abstra\u00e7\u00f5es que, naturalmente, tem complexidade aferente mais alta e acabam dificultando o <em>evolvability.<\/em><\/li>\n<li>Abstra\u00e7\u00f5es em demasia s\u00e3o demonstra\u00e7\u00f5es expl\u00edcitas de ingenuidade inteligente.<\/li>\n<\/ul>\n<h2>Para toda jornada \u00e9 necess\u00e1rio ter o n\u00edvel adequado de &#8220;bagagem&#8221;<\/h2>\n<p>Acoplamento \u00e9 inevit\u00e1vel mas, sem os cuidados adequados, pode atingir n\u00edveis insustent\u00e1veis. Criar &#8220;pontos de acoplamento&#8221; \u00e9 f\u00e1cil e, depois disso, remover \u00e9 dif\u00edcil.<\/p>\n<p>Arquiteturas de software de qualidade s\u00e3o, acima de tudo, aquelas que evoluem mitigando necessidades para o acoplamento. Al\u00e9m disso, \u00e9 parte das pr\u00e1ticas de arquitetura de software monitorar e estabelecer estrat\u00e9gias para lidar com o acoplamento quando ele surgir. Entretanto, <strong>n\u00e3o ignoremos o fato que toda escolha implica em uma ren\u00fancia. Sempre haver\u00e3o\u00a0<em>trade-offs.\u00a0<\/em>Nada \u00e9 bom para tudo!\u00a0<\/strong>Reduzir o acoplamento aferente implica, muitas vezes, em introduzir abstra\u00e7\u00f5es, o que aumenta a complexidade pela dimensionalidade e pela irreversibilidade.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/imgs.xkcd.com\/comics\/shopping_teams.png\" width=\"473\" height=\"398\" \/><\/p>\n<p>&nbsp;<\/p>\n<h2>\/\/ TODO<\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo as seguintes reflex\u00f5es:<\/p>\n<ul>\n<li>A estrat\u00e9gia de modularidade do software em que voc\u00ea est\u00e1 trabalhando colabora para a mitiga\u00e7\u00e3o de causas para acoplamento?<\/li>\n<li>Os testes automatizados est\u00e3o &#8220;exigindo&#8221; abstra\u00e7\u00f5es de maneira razo\u00e1vel?<\/li>\n<li>Que artefatos de sua solu\u00e7\u00e3o tem alto n\u00edvel de acoplamento aferente?<\/li>\n<li>Os artefatos com acoplamento aferente tem n\u00edveis adequados de testes automatizados?<\/li>\n<li>As abstra\u00e7\u00f5es com acoplamento aferente mais elevado tem estrat\u00e9gia clara de versionamento?<\/li>\n<\/ul>\n","protected":false},"featured_media":3825,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[72],"sessoes":[57],"apendices":[],"capitulos":[27],"class_list":["post-4048","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","url-permanente","sessoes-secao-1","capitulos-capitulo-1-6"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento - Manual do Arquiteto de Software<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Tipos de acoplamento Em termos pr\u00e1ticos, o acoplamento &#8220;amarra&#8221; iniciativas e frentes de trabalho aumentando os custos de gest\u00e3o por demandar atividades de sincroniza\u00e7\u00e3o e coordena\u00e7\u00e3o. H\u00e1 muitas formas de classificar o acoplamento. Entretanto uma das mais aceitas indica que acoplamento pode ser: Operacional\u00a0&#8211; quando um componente n\u00e3o consegue &#8220;funcionar&#8221; quando outro componente n\u00e3o est\u00e1 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-12T21:01:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"338\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"16 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/\",\"name\":\"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg\",\"datePublished\":\"2022-04-26T12:55:29+00:00\",\"dateModified\":\"2024-01-12T21:01:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg\",\"width\":600,\"height\":338},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento - Manual do Arquiteto de Software","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/","og_locale":"pt_BR","og_type":"article","og_title":"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento - Manual do Arquiteto de Software","og_description":"Tipos de acoplamento Em termos pr\u00e1ticos, o acoplamento &#8220;amarra&#8221; iniciativas e frentes de trabalho aumentando os custos de gest\u00e3o por demandar atividades de sincroniza\u00e7\u00e3o e coordena\u00e7\u00e3o. H\u00e1 muitas formas de classificar o acoplamento. Entretanto uma das mais aceitas indica que acoplamento pode ser: Operacional\u00a0&#8211; quando um componente n\u00e3o consegue &#8220;funcionar&#8221; quando outro componente n\u00e3o est\u00e1 [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-12T21:01:32+00:00","og_image":[{"width":600,"height":338,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"16 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/","name":"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg","datePublished":"2022-04-26T12:55:29+00:00","dateModified":"2024-01-12T21:01:32+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/03\/1.5.jpg","width":600,"height":338},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/entendendo-e-convivendo-com-o-acoplamento\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"Cap 1.6 Entendendo, combatendo e convivendo com o acoplamento"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/4048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=4048"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/3825"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=4048"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=4048"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=4048"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=4048"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=4048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}