{"id":10175,"date":"2023-12-19T12:20:29","date_gmt":"2023-12-19T15:20:29","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=10175"},"modified":"2023-12-24T11:53:10","modified_gmt":"2023-12-24T14:53:10","slug":"como-o-domain-driven-design-ajuda-no-desenvolvimento-de-sistemas-transacionais","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/como-o-domain-driven-design-ajuda-no-desenvolvimento-de-sistemas-transacionais\/","title":{"rendered":"Como o Domain-Driven Design Ajuda no Desenvolvimento de Sistemas Transacionais"},"content":{"rendered":"\n<p>A utiliza\u00e7\u00e3o do <em>Domain-Driven Design<\/em> (DDD) oferece uma abordagem estruturada e focada para o desenvolvimento de software, especialmente para sistemas complexos e transacionais. Mas por que isso \u00e9 t\u00e3o importante e como o DDD pode realmente melhorar a cria\u00e7\u00e3o desses sistemas?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Clave do Conhecimento: Entendendo os Subdom\u00ednios<\/h2>\n\n\n\n<p>Quando come\u00e7o um projeto novo, uma das primeiras coisas que tento entender s\u00e3o os subdom\u00ednios da organiza\u00e7\u00e3o. Isso me ajuda a identificar claramente as diferentes partes do neg\u00f3cio e como elas devem interagir no sistema. O DDD nos guia na delimita\u00e7\u00e3o desses subdom\u00ednios, mantendo contextos bem definidos.<\/p>\n\n\n\n<p>Por exemplo, em um sistema banc\u00e1rio, subdom\u00ednios como &#8220;gest\u00e3o de contas&#8221;, &#8220;empr\u00e9stimos&#8221; e &#8220;investimentos&#8221; requerem l\u00f3gicas de neg\u00f3cio distintas. Ao modelar estes como subdom\u00ednios separados, a complexidade de cada um pode ser melhor gerenciada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Construindo Independ\u00eancia: Vantagens dos Sistemas Desacoplados<\/h2>\n\n\n\n<p>A independ\u00eancia operacional \u00e9 um ponto crucial em sistemas complexos. Com DDD, cada subdom\u00ednio pode ser tratado como um sistema independente. Isso minimiza o acoplamento e promove a modularidade. Ao reconhecer os setores como subdom\u00ednios, com suas pr\u00f3prias l\u00f3gicas e regras de neg\u00f3cio encapsuladas, crio sistemas resilientes e adapt\u00e1veis.<\/p>\n\n\n\n<p>Para ilustrar, pense em um sistema de e-commerce com um subdom\u00ednio de &#8220;gerenciamento de pedidos&#8221; e outro de &#8220;controle de estoque&#8221;. Ao desenvolv\u00ea-los como m\u00f3dulos independentes, mudan\u00e7as em um n\u00e3o afetam o outro diretamente, tornando assim o sistema mais flex\u00edvel e f\u00e1cil de manter.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Colheita de Benef\u00edcios: A Efici\u00eancia de Manter Sistemas Modulares<\/h2>\n\n\n\n<p>Acoplamento \u00e9 algo que todo desenvolvedor deseja evitar, pois pode complicar as mudan\u00e7as no sistema. Ao seguir as pr\u00e1ticas de DDD, os sistemas s\u00e3o desenvolvidos de forma separada para cada subdom\u00ednio, permitindo que operem de maneira independente e facilitando a manuten\u00e7\u00e3o. Um bom design de sistema DDD pode parecer assim em C#:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" style=\"font-size:.875rem;line-height:1.25rem\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"namespace Banking.Domain.Accounts\n{\n    public class AccountService\n    {\n        public void ProcessAccount(Account account) \n        {\n            \/\/ L\u00f3gica espec\u00edfica do subdom\u00ednio de gest\u00e3o de contas\n        }\n    }\n}\n\nnamespace Banking.Domain.Loans\n{\n    public class LoanService\n    {\n        public void ProcessLoan(Loan loan) \n        {\n            \/\/ L\u00f3gica espec\u00edfica do subdom\u00ednio de empr\u00e9stimos\n        }\n    }\n}\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\"><code><span class=\"line\"><span style=\"color: #81A1C1\">namespace<\/span><span style=\"color: #D8DEE9FF\"> Banking<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">Domain<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">Accounts<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">AccountService<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">ProcessAccount<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Account account<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">            <\/span><span style=\"color: #616E88\">\/\/ L\u00f3gica espec\u00edfica do subdom\u00ednio de gest\u00e3o de contas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">namespace<\/span><span style=\"color: #D8DEE9FF\"> Banking<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">Domain<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">Loans<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">LoanService<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">void<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">ProcessLoan<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Loan loan<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">            <\/span><span style=\"color: #616E88\">\/\/ L\u00f3gica espec\u00edfica do subdom\u00ednio de empr\u00e9stimos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Aqui, cada <code>Service<\/code> encapsula a l\u00f3gica de neg\u00f3cios do seu respectivo subdom\u00ednio, seguindo os princ\u00edpios do DDD.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Domain-Driven Design n\u00e3o \u00e9 apenas uma metodologia de desenvolvimento; \u00e9 uma estrat\u00e9gia essencial para criar sistemas transacionais robustos e eficientes. Ao compreender e aplicar os conceitos de DDD, os desenvolvedores podem criar software que \u00e9 mais f\u00e1cil de manter, escalar e que responde melhor \u00e0s necessidades de neg\u00f3cios complexos. DDD age como um &#8220;atalho&#8221; para a cria\u00e7\u00e3o de sistemas que apoiam a opera\u00e7\u00e3o do dia a dia das empresas sem causar interrup\u00e7\u00f5es ou dores de cabe\u00e7a desnecess\u00e1rias. \u00c9 fundamental que n\u00e3o ignoremos esse conceito em nossos projetos.<\/p>\n\n\n\n<p>O desenvolvimento orientado por dom\u00ednio \u00e9 um tema que abordo frequentemente em meus grupos de estudos e sess\u00f5es de mentoria, sempre enfatizando sua import\u00e2ncia na obten\u00e7\u00e3o de boas pr\u00e1ticas de arquitetura e design de software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>DDD ajuda a identificar e delimitar claramente os subdom\u00ednios do neg\u00f3cio, promovendo sistemas com contextos bem definidos.<\/li>\n\n\n\n<li>Os sistemas desenvolvidos seguindo o DDD operam de forma independente, facilitando manuten\u00e7\u00e3o e evolu\u00e7\u00e3o atrav\u00e9s da redu\u00e7\u00e3o de acoplamentos.<\/li>\n\n\n\n<li>A implementa\u00e7\u00e3o de DDD \u00e9 facilitada atrav\u00e9s de exemplos e estruturas de c\u00f3digo, oferecendo caminhos claros para a cria\u00e7\u00e3o de sistemas transacionais robustos.<\/li>\n<\/ol>\n","protected":false},"featured_media":10116,"parent":0,"template":"","cursos":[12],"class_list":["post-10175","artigos","type-artigos","status-publish","has-post-thumbnail","hentry","cursos-ddd-do-jeito-certo"],"acf":[],"_links":{"self":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos\/10175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/artigos"}],"about":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/types\/artigos"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media\/10116"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=10175"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=10175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}