{"id":9985,"date":"2023-12-04T20:40:36","date_gmt":"2023-12-04T23:40:36","guid":{"rendered":"https:\/\/elemarjr.com\/clube-de-estudos\/?post_type=artigos&#038;p=9985"},"modified":"2023-12-26T09:58:02","modified_gmt":"2023-12-26T12:58:02","slug":"pense-nos-golden-sources-de-suas-aplicacoes","status":"publish","type":"artigos","link":"https:\/\/elemarjr.com\/clube-de-estudos\/artigos\/pense-nos-golden-sources-de-suas-aplicacoes\/","title":{"rendered":"Pense nos Golden Sources de Suas Aplica\u00e7\u00f5es"},"content":{"rendered":"\n<p>Na jornada para criar sistemas robustos e de f\u00e1cil manuten\u00e7\u00e3o, muitas vezes nos deparamos com um princ\u00edpio fundamental: a import\u00e2ncia de identificar as fontes de verdade, ou <em>golden sources<\/em>, de nossa aplica\u00e7\u00e3o. Mas, o que realmente significa essa ideia dentro do contexto de Domain-driven Design?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Que s\u00e3o Golden Sources?<\/h2>\n\n\n\n<p>Imagine que voc\u00ea est\u00e1 construindo um sistema e deseja garantir que os dados estejam consistentes em toda a aplica\u00e7\u00e3o. O conceito de <em>golden source<\/em> refere-se ao local \u00fanico onde um dado \u00e9 criado e o \u00fanico lugar onde ele pode ser modificado. Esse princ\u00edpio \u00e9 vital, pois ele estabelece a autoridade e a veracidade dos dados dentro da aplica\u00e7\u00e3o.<\/p>\n\n\n\n<p>Em DDD, quando pensamos no design de uma aplica\u00e7\u00e3o, focamos na modelagem do dom\u00ednio do neg\u00f3cio. Assim, \u00e9 essencial identificar claramente qual \u00e9 o <em>golden source<\/em> de cada peda\u00e7o de informa\u00e7\u00e3o. Mas por que isso \u00e9 t\u00e3o importante?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Import\u00e2ncia dos Golden Sources no DDD<\/h2>\n\n\n\n<p>Em DDD, o dom\u00ednio do neg\u00f3cio \u00e9 decomposto em subdom\u00ednios, cada um encapsulando uma parte espec\u00edfica da l\u00f3gica de neg\u00f3cio. Ao definir um <em>golden source<\/em>, voc\u00ea est\u00e1 identificando qual subdom\u00ednio tem a responsabilidade exclusiva sobre a cria\u00e7\u00e3o e modifica\u00e7\u00e3o de determinados dados.<\/p>\n\n\n\n<p>Vamos usar o exemplo de um cliente novo em um sistema de CRM. Se o subdom\u00ednio de Gest\u00e3o de Clientes \u00e9 designado como o <em>golden source<\/em> para a informa\u00e7\u00e3o do cliente, ent\u00e3o ele \u00e9 o \u00fanico que deve criar e modificar esses dados. Outros subdom\u00ednios podem ler esses dados, mas qualquer altera\u00e7\u00e3o deve passar pelo subdom\u00ednio de Gest\u00e3o de Clientes.<\/p>\n\n\n\n<p>Esse controle centralizado n\u00e3o \u00e9 apenas uma prefer\u00eancia t\u00e9cnica; ele reflete a maneira como as opera\u00e7\u00f5es s\u00e3o geridas no neg\u00f3cio real. No mundo real, existem regras e regulamentos que ditam onde e como os dados dos clientes podem ser alterados. Transpondo essas regras para o design do sistema ajuda a garantir que o sistema esteja alinhado com as necessidades e restri\u00e7\u00f5es do neg\u00f3cio real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Como Identificar e Aplicar Golden Sources<\/h2>\n\n\n\n<p>Identificar um <em>golden source<\/em> come\u00e7a com uma compreens\u00e3o profunda do dom\u00ednio do neg\u00f3cio. Isso envolve conversar com especialistas do dom\u00ednio, entender os processos e as regras de neg\u00f3cio e mapear claramente as responsabilidades entre os diferentes subdom\u00ednios.<\/p>\n\n\n\n<p>Uma vez identificados, os <em>golden sources<\/em> devem ser protegidos no design da arquitetura de software. Isso pode significar restri\u00e7\u00f5es na comunica\u00e7\u00e3o entre servi\u00e7os, pol\u00edticas de acesso aos dados e at\u00e9 mecanismos de persist\u00eancia que refletem a propriedade exclusiva dos dados.<\/p>\n\n\n\n<p>Para exemplificar, considere um sistema de gerenciamento de pedidos onde o subdom\u00ednio de Pedidos \u00e9 o <em>golden source<\/em> para informa\u00e7\u00f5es sobre os pedidos dos clientes. Aqui est\u00e1 um breve trecho em C# que ilustra um acesso restrito a esse subdom\u00ednio:<\/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=\"public class OrderService\n{\n    private readonly IOrderRepository _orderRepository;\n\n    public OrderService(IOrderRepository orderRepository)\n    {\n        _orderRepository = orderRepository;\n    }\n\n    public Order CreateOrder(Customer customer, List<Product&gt; products)\n    {\n        \/\/ Regra de neg\u00f3cio para cria\u00e7\u00e3o de pedidos\n        var order = new Order(customer, products);\n        _orderRepository.Add(order);\n        return order;\n    }\n\n    public void UpdateOrder(Order order, OrderStatus newStatus)\n    {\n        \/\/ Regra de neg\u00f3cio para atualiza\u00e7\u00e3o de pedidos\n        order.UpdateStatus(newStatus);\n        _orderRepository.Save(order);\n    }\n\n    \/\/ Outros m\u00e9todos que manipulam pedidos...\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\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">OrderService<\/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\">private<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">readonly<\/span><span style=\"color: #D8DEE9FF\"> IOrderRepository _orderRepository<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">OrderService<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">IOrderRepository orderRepository<\/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: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_orderRepository<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">orderRepository<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">public<\/span><span style=\"color: #D8DEE9FF\"> Order <\/span><span style=\"color: #88C0D0\">CreateOrder<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Customer customer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> List<\/span><span style=\"color: #ECEFF4\">&lt;<\/span><span style=\"color: #D8DEE9FF\">Product<\/span><span style=\"color: #ECEFF4\">&gt;<\/span><span style=\"color: #D8DEE9FF\"> products<\/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 style=\"color: #616E88\">\/\/ Regra de neg\u00f3cio para cria\u00e7\u00e3o de pedidos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">var<\/span><span style=\"color: #D8DEE9FF\"> order <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">new<\/span><span style=\"color: #D8DEE9FF\"> Order<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">customer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">products<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_orderRepository<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Add<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">order<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">order<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/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\">UpdateOrder<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Order order<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> OrderStatus newStatus<\/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 style=\"color: #616E88\">\/\/ Regra de neg\u00f3cio para atualiza\u00e7\u00e3o de pedidos<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">order<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">UpdateStatus<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">newStatus<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #D8DEE9\">_orderRepository<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">Save<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9\">order<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #81A1C1\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">    <\/span><span style=\"color: #616E88\">\/\/ Outros m\u00e9todos que manipulam pedidos...<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Nesse exemplo, <code>OrderService<\/code> \u00e9 o \u00fanico ponto de entrada para a cria\u00e7\u00e3o e atualiza\u00e7\u00e3o de pedidos. Ele utiliza <code>IOrderRepository<\/code>, que encapsula a l\u00f3gica de acesso a dados \u2013 garantindo que o subdom\u00ednio de Pedidos seja o <em>golden source<\/em> para essas opera\u00e7\u00f5es.<\/p>\n\n\n\n<p>Al\u00e9m disso, \u00e9 vital que a equipe de desenvolvimento compreenda e respeite essas fontes de verdade. Isso muitas vezes requer treinamento e um esfor\u00e7o consciente para promover boas pr\u00e1ticas de design dentro da equipe.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Os <em>golden sources<\/em> s\u00e3o um pilar na constru\u00e7\u00e3o de aplica\u00e7\u00f5es que refletem as regras e os fluxos do neg\u00f3cio. Eles n\u00e3o apenas melhoram a consist\u00eancia dos dados, mas tamb\u00e9m auxiliam na manuten\u00e7\u00e3o e na escalabilidade do sistema. Ao adotar o DDD e pensar cuidadosamente sobre onde e como os dados s\u00e3o gerenciados, criamos sistemas mais resilientes e alinhados com o mundo real.<\/p>\n\n\n\n<p>A reflex\u00e3o sobre esses conceitos \u00e9 facilitada quando se compreende o neg\u00f3cio em quest\u00e3o. Isso demonstra a import\u00e2ncia da colabora\u00e7\u00e3o entre desenvolvedores e especialistas de dom\u00ednio no processo de design do sistema. Te convido a analisar seu pr\u00f3prio sistema para identificar os <em>golden sources<\/em>, revisar sua arquitetura e verificar se h\u00e1 um alinhamento com as regras de neg\u00f3cio.<\/p>\n\n\n\n<p>Esses temas s\u00e3o explorados em meus grupos de estudos e mentorias, onde aprofundamos no DDD e nas pr\u00e1ticas que promovem sistemas bem projetados.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">TL;DR<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><em>Golden sources<\/em> referem-se aos locais \u00fanicos onde os dados nascem e podem ser modificados em uma aplica\u00e7\u00e3o.<\/li>\n\n\n\n<li>Identificar e respeitar os <em>golden sources<\/em> \u00e9 crucial para a consist\u00eancia e integridade dos dados no DDD.<\/li>\n\n\n\n<li>O design e a arquitetura da aplica\u00e7\u00e3o devem incorporar e proteger os <em>golden sources<\/em> para refletir as opera\u00e7\u00f5es e regras do neg\u00f3cio real.<\/li>\n<\/ol>\n","protected":false},"featured_media":9967,"parent":0,"template":"","cursos":[12],"class_list":["post-9985","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\/9985","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\/9967"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/media?parent=9985"}],"wp:term":[{"taxonomy":"cursos","embeddable":true,"href":"https:\/\/elemarjr.com\/clube-de-estudos\/wp-json\/wp\/v2\/cursos?post=9985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}