<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nicolas de Souza</title>
    <description>The latest articles on DEV Community by Nicolas de Souza (@nicolasdesouza).</description>
    <link>https://dev.to/nicolasdesouza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F781002%2Fd9867e3b-5818-4113-9ed7-f2eeae51cead.jpg</url>
      <title>DEV Community: Nicolas de Souza</title>
      <link>https://dev.to/nicolasdesouza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nicolasdesouza"/>
    <language>en</language>
    <item>
      <title>Design Pattern - Bridge</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Mon, 02 Sep 2024 20:09:31 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/design-pattern-bridge-630</link>
      <guid>https://dev.to/nicolasdesouza/design-pattern-bridge-630</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Dando sequência aos estudos sobre design patterns, chegou a hora de falarmos sobre o padrão BRIDGE. Como seu nome sugere, sua implementação cria conexões entre interfaces e implementações nos auxiliando a criar classes cada vez mais específicas e com pouca ou nenhuma repetição de código mas vamos com calma! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O &lt;strong&gt;Bridge&lt;/strong&gt; é um padrão de projeto estrutural que permite que você divida uma classe grande ou um conjunto de classes intimamente ligadas em duas hierarquias separadas—abstração e implementação—que podem ser desenvolvidas independentemente umas das outras.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O texto supracitado, foi tirado do site &lt;a href="//refactoring.guru"&gt;Refactoring GURU&lt;/a&gt; e foi a melhor definição que encontrei para esse padrão mas o livro: Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos, traz um síntese interessante que também quero deixar registrado&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A intenção deste padrão é desacoplar uma abstração da sua implementação, de modo que as duas possam variar independentemente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Padrão
&lt;/h3&gt;

&lt;p&gt;O padrão bridge é composto geralmente por cinco partes, são elas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;A abstração, responsável pelo controle de alto nível, ela depende do objeto de implementação para que possa desempenhar o sua função.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A implementação (uma interface), que declara a interface comum a todas as implementações concretas. Nossa abstração só pode se comunicar com um objeto de implementação através de métodos declarados aqui.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A abstração pode listar os mesmos métodos que a implementação, mas geralmente a abstração declara alguns comportamentos complexos que dependem de uma ampla variedade de operações primitivas declaradas pela implementação&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementações concretas que contém as implementações reais da nossa implementação comum&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abstrações refinadas que proveem variantes para o controle lógico. Como a abstração original, as refinadas também podem trabalhar com diferentes implementações através de uma interface comum&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cliente, que é quem vai realmente utilizar nossas estruturas lógicas citadas anteriormente.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Conceitual
&lt;/h3&gt;

&lt;p&gt;Se você leu o artigo sobre o padrão &lt;a href="https://nicolasdesouza.com/design-patterns-singleton" rel="noopener noreferrer"&gt;Singleton&lt;/a&gt;, deve imaginar que eu gosto de esportes então para fugir dos exemplos de formas e cores e oferecer uma abordagem diferente, vamos falar sobre basquete! &lt;/p&gt;

&lt;p&gt;No basquete temos, em quadra jogando, 5 jogadores em cada equipe. Desses 5 temos posições variadas: armador, pivô, ala, ala-armador e ala-pivô. Cada uma dessas posições apresentam características ímpares e papéis bem definidos para uma boa execução das estratégias da equipe. Mas mesmo dentro de uma posição teremos comportamentos bem diferentes, por exemplo, um pivô pode ser um defensor agressivo, mas podemos ter um outro pivô que seja um defensor mais posicional, um ala que seja rápido e outro que seja lento...&lt;/p&gt;

&lt;p&gt;Vamos pensar um pouco como isso se daria em um código, teríamos uma classe base chamada &lt;code&gt;Jogador&lt;/code&gt; e então iríamos implementar um &lt;code&gt;ArmadorRápido&lt;/code&gt;, &lt;code&gt;PivoLento&lt;/code&gt;, &lt;code&gt;AlaAtaqueLento&lt;/code&gt;...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Jogador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Pontos&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JogadorRapido&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Jogador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Correr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Correu rápido!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JogadorLento&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Jogador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Correr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Correu lento..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JogadorRapidoDefensor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JogadorRapido&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Defender&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Defendeu com velocidade!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JogadorRapidoAtacante&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JogadorRapido&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ChutarBola&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chutou a bola com velocidade!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JogadorLentoDefensor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JogadorLento&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Defender&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Defendeu com resistência!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;JogadorLentoAtacante&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;JogadorLento&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ChutarBola&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chutou a bola com força!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// E assim por diante...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou seja para cada característica nova que eu fosse adicionar ao meus jogadores, exigiria a implementação de novas classes de maneira exponencial, sendo necessário inserir esta característica em todos os demais... Uma verdadeira bola de neve!&lt;/p&gt;

&lt;p&gt;Como o padrão bridge pretende resolver essa situação?! De uma maneira até que simples, inserindo em &lt;code&gt;Jogador&lt;/code&gt; uma interface com nome &lt;code&gt;IEstiloDeJogo&lt;/code&gt;. Dessa forma ao criarmos novos jeitos de jogo, poderíamos apenas construir classes que implementem &lt;code&gt;IEstiloDeJogo&lt;/code&gt; e então usar essas classes para construir nosso jogador.&lt;/p&gt;

&lt;p&gt;Vamos dar uma olhada rápida em como isso se daria&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IVelocidade&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Correr&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VelocidadeRapida&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IVelocidade&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Correr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Correu rápido!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;VelocidadeLenta&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IVelocidade&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Correr&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Correu lento..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPosicao&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Jogar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PosicaoDefensor&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPosicao&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Jogar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Defendeu!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PosicaoAtacante&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPosicao&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Jogar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Chutou a bola!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Jogador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Pontos&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IVelocidade&lt;/span&gt; &lt;span class="n"&gt;Velocidade&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IPosicao&lt;/span&gt; &lt;span class="n"&gt;Posicao&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Jogar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Velocidade&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Correr&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;Posicao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Jogar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deste modo consigo criar jogadores de todas as posições com estilos de jogos diferentes, sem precisar criar uma classe para cada tipo de jogo que quero fazer, herdando de jogador e de mais outras classes... Desse modo tornamos o código mais flexível a possíveis mudanças, facilitamos o trabalho de manutenção e proporcionamos o desacoplamento entre classes e interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prático
&lt;/h3&gt;

&lt;p&gt;Por mais que eu tenha gostado do exemplo envolvendo jogadores de basquete, queria um exemplo um pouco mais real para adicionarmos ao nosso repositório.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Interface for payment&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPayment&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MakePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CancelPayment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Concrete class for credit card payment&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreditCardPayment&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPayment&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MakePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Payment made with credit card for &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CancelPayment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Payment cancelled"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Concrete class for PayPal payment&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPalPayment&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPayment&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;MakePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Payment made with PayPal for &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;CancelPayment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Payment cancelled"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Interface for payment plan&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPaymentPlan&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;CalculateFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;CheckLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Concrete class for basic payment plan&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BasicPaymentPlan&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPaymentPlan&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;CalculateFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;0.05m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;CheckLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;1000m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  

&lt;span class="c1"&gt;// Concrete class for premium payment plan&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PremiumPaymentPlan&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPaymentPlan&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="nf"&gt;CalculateFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;*&lt;/span&gt; &lt;span class="m"&gt;0.03m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;CheckLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;5000m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Class for payment&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Payment&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;PaymentType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IPaymentPlan&lt;/span&gt; &lt;span class="n"&gt;PaymentPlan&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IPaymentPlan&lt;/span&gt; &lt;span class="n"&gt;paymentPlan&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;PaymentType&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;PaymentPlan&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentPlan&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Create a credit card payment&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;creditCardPayment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Create a basic payment plan&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;IPaymentPlan&lt;/span&gt; &lt;span class="n"&gt;basicPaymentPlan&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BasicPaymentPlan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Create a payment object with the credit card payment and basic payment plan&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Payment&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;creditCardPayment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;basicPaymentPlan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Make a payment of $500&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;500m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentPlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CheckLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;fee&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentPlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CalculateFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Fee: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MakePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Payment exceeds limit"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Create a PayPal payment&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;IPayment&lt;/span&gt; &lt;span class="n"&gt;payPalPayment&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PayPalPayment&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Create a premium payment plan&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;IPaymentPlan&lt;/span&gt; &lt;span class="n"&gt;premiumPaymentPlan&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PremiumPaymentPlan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Create a payment object with the PayPal payment and premium payment plan&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Payment&lt;/span&gt; &lt;span class="n"&gt;payment2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payPalPayment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;premiumPaymentPlan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="c1"&gt;// Make a payment of $2000&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;amount2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2000m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentPlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CheckLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;decimal&lt;/span&gt; &lt;span class="n"&gt;fee2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payment2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentPlan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CalculateFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Fee: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fee2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;payment2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PaymentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MakePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Payment exceeds limit"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado desse código pode ser visto aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Fee: 25.00
Payment made with credit card &lt;span class="k"&gt;for &lt;/span&gt;500
Fee: 60.00
Payment made with PayPal &lt;span class="k"&gt;for &lt;/span&gt;2000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos confrontar nosso código com a estrutura de código com o design pattern bridge:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abstração: Classe &lt;code&gt;Payment&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Implementação: Interfaces &lt;code&gt;IPayment&lt;/code&gt; e &lt;code&gt;IPaymentPlan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Implementações concretas: &lt;code&gt;CreditCardPayment&lt;/code&gt;, &lt;code&gt;PayPalPayment&lt;/code&gt;, &lt;code&gt;BasicPaymentPlan&lt;/code&gt;,  &lt;code&gt;PremiumPaymentPlan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Abstrações refinadas: &lt;code&gt;Payment&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Relação com o padrão Adapter
&lt;/h2&gt;

&lt;p&gt;Olhando superficialmente para o padrão bridge podemos ter a sensação de que ele se tornaria um coringa, tornando o &lt;a href="https://nicolasdesouza.com/design-patterns-adapter" rel="noopener noreferrer"&gt;padrão adapter&lt;/a&gt; obsoleto. Contudo é importante notar que os padrões em questão são aplicados em momento diferentes, o padrão adapter é um recurso para que possamos alinhar códigos já existentes a novas demandas de negócio, por sua vez o padrão bridge é utilizado desde o início do desenvolvimento para permitir que abstrações e implementações possam variar independentemente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Vimos que o padrão Bridge pode representar um ganho significativo de legibilidade e flexibilidade para o seu código. Para além disso, nota-se que este padrão nos ajuda a manter a atender o princípios aberto/fechado, permitindo que novas abstrações e implementações sejam introduzidas ao código independentes uma das outras, e o princípio de responsabilidade única mantendo cada implementação especializada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repositório GIT
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/DesignPatterns" rel="noopener noreferrer"&gt;Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Materiais de estudo
&lt;/h3&gt;

&lt;p&gt;Estamos chegando ao fim do nosso artigo e queria deixar alguns materiais que usei para estudar esse padrão de software: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns/bridge" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="[Padr%C3%B5es%20de%20Projetos:%20Solu%C3%A7%C3%B5es%20Reutiliz%C3%A1veis%20de%20Software%20Orientados%20a%20Objetos%20|%20Amazon.com.br](https://www.amazon.com.br/Padr%C3%B5es-Projetos-Solu%C3%A7%C3%B5es-Reutiliz%C3%A1veis-Orientados/dp/8573076100)"&gt;Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>designpatterns</category>
      <category>csharp</category>
      <category>bridge</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Design Pattern - Adapter</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Mon, 02 Sep 2024 12:00:00 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/design-pattern-adapter-5hgi</link>
      <guid>https://dev.to/nicolasdesouza/design-pattern-adapter-5hgi</guid>
      <description>&lt;p&gt;Sabe quando seu sistema legado precisa de um feature nova mas a biblioteca que você usa não tem suporte para isso e a biblioteca que você achou para implementar não faz o que a biblioteca antiga faz e de alguma forma você precisa fazer as duas trabalharem juntas no seu sistema ?! É aí que podemos contar com o Design Patter Adapter!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Design Patter - Adapter é um padrão estrutural que permite objetos com interfaces incompatíveis trabalhem juntos!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Estrutura básica
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Target ( Alvo ) - é (geralmente) a nova interface que precisamos adicionar ao nosso projeto&lt;/li&gt;
&lt;li&gt;Adapter ( Adaptador ) - irá realizar ajustes necessários, convertendo a interface da classe a ser adaptada para que a interface target possa ser utilizada&lt;/li&gt;
&lt;li&gt;Adaptee ( Classe adaptada ) -  nossa classe legada, a classe que faz todo esse esforço ser necessário&lt;/li&gt;
&lt;li&gt;Client - Usa a interface Target para interagir com os objetos do sistema&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Situação problema
&lt;/h2&gt;

&lt;p&gt;Vamos esmiuçar essa estrutura com um exemplo. Imagina que você faz parte da equipe do Spotify e a empresa decidiu que agora irão trabalhar com vídeos. O júnior da equipe logo fica ansioso imaginando que será necessário refazer todo o código, procurar uma nova biblioteca que suporte tanto áudios mp3 e os vídeos mp4. Ele chega a sugerir isso na reunião mas todo mundo fica preocupado com a ideia de mexer no que já está funcionando, mas e se houvesse uma forma de fazer uma biblioteca de vídeos funcionar junto com a biblioteca de áudio que a equipe já está acostumada a usar?! &lt;/p&gt;

&lt;p&gt;É nesse momento que vamos propor nosso mais novo amigo como a solução dos problems! &lt;/p&gt;

&lt;h2&gt;
  
  
  Mão na massa!
&lt;/h2&gt;

&lt;p&gt;Vamos iniciar criando nossa interface target, ela deverá ter a declaração de um método Play que recebe o nome do arquivo a ser executado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interface Alvo (Target)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IMidiaPlayer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nossa classe antiga .mp3
&lt;/h3&gt;

&lt;p&gt;Observe que ela só sabe executar .mp3&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mp3Player&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PlayMp3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Reproduzindo MP3: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Nossa nova classe .mp4
&lt;/h3&gt;

&lt;p&gt;Esta classe já implementa nossa interface mas ainda falta a estrela dessa operação&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mp4Player&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IMidiaPlayer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Reproduzindo MP4: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A estrela do dia: Mp3PlayerAdapter
&lt;/h3&gt;

&lt;p&gt;Note como ela será responsável por tornar viável a integração entre as nossas classes mp3 e mp4&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mp3PlayerAdapter&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IMidiaPlayer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Mp3Player&lt;/span&gt; &lt;span class="n"&gt;mp3Player&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;Mp4Player&lt;/span&gt; &lt;span class="n"&gt;mp4Player&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Mp3PlayerAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mp3Player&lt;/span&gt; &lt;span class="n"&gt;mp3Player_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mp4Player&lt;/span&gt; &lt;span class="n"&gt;mp4Player_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mp3Player&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mp3Player_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mp4Player&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mp4Player_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EndsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".mp3"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mp3Player&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PlayMp3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;EndsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".mp4"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mp4Player&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Media Client
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MediaClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IMidiaPlayer&lt;/span&gt; &lt;span class="n"&gt;mediaPlayer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MediaClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IMidiaPlayer&lt;/span&gt; &lt;span class="n"&gt;mediaPlayer_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mediaPlayer&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mediaPlayer_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mediaPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Main
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;AdapterPlayer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ServiceCollection&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mp4Player&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Mp3Player&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IMidiaPlayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mp3PlayerAdapter&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MediaClient&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildServiceProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;mediaClient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MediaClient&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;  

            &lt;span class="n"&gt;mediaClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"musica.mp3"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mediaClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"video.mp4"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;mediaClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Play&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"documento.pdf"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resultado em tela
&lt;/h3&gt;

&lt;p&gt;Olha que legal, o arquivo .pdf foi ignorado já que não possui uma classe que seja capaz de executá-lo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Reproduzindo MP3: musica.mp3

Reproduzindo MP4: video.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Algumas considerações sobre esse padrão
&lt;/h2&gt;

&lt;p&gt;Esse padrão é um coringa muito interessante para se ter em mente, ele tem como vantagens a flexibilidade, o desacoplamento,  a reutilização de código, facilita a integração de sistemas legados e ainda melhora a legibilidade do código! Mas como nem tudo são flores, é necessário certos cuidados, esse padrão pode aumentar a complexidade do seu sistema, limitar a capacidade de debugar o código... Como tudo na vida, use com moderação!&lt;/p&gt;

&lt;h2&gt;
  
  
  Repositório GIT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/DesignPatterns" rel="noopener noreferrer"&gt;Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais de Estudo
&lt;/h2&gt;

&lt;p&gt;Estamos chegando ao fim do nosso artigo e queria deixar alguns materiais que usei para estudar esse padrão de software:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns/builder" rel="noopener noreferrer"&gt;Refactoring Guru&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dofactory.com/net/builder-design-pattern" rel="noopener noreferrer"&gt;Dofactory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Padr%C3%B5es-Projetos-Solu%C3%A7%C3%B5es-Reutiliz%C3%A1veis-Orientados/dp/8573076100/ref=pd_lpo_sccl_1/139-0743064-7931502?pd_rd_w=nD2cg&amp;amp;content-id=amzn1.sym.8151c21e-945b-4095-a73d-67d730c81d28&amp;amp;pf_rd_p=8151c21e-945b-4095-a73d-67d730c81d28&amp;amp;pf_rd_r=07QHYYC7KPHXE3WGN9X2&amp;amp;pd_rd_wg=oApzi&amp;amp;pd_rd_r=4dfbb257-085b-49d3-89ba-d4230649574a&amp;amp;pd_rd_i=8573076100&amp;amp;psc=1" rel="noopener noreferrer"&gt;Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.devmedia.com.br/padrao-adapter/22524" rel="noopener noreferrer"&gt;Padrão Adapter - DevMedia&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>designpatterns</category>
      <category>adapter</category>
    </item>
    <item>
      <title>Design Pattern - Singleton</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Mon, 03 Jun 2024 12:30:00 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/design-pattern-singleton-32cj</link>
      <guid>https://dev.to/nicolasdesouza/design-pattern-singleton-32cj</guid>
      <description>&lt;p&gt;O objetivo deste padrão é bem simples, garantir que apenas uma instância de uma determinada classe seja criada. &lt;/p&gt;

&lt;p&gt;Simples não?! Após padrões um tanto quanto confusos e complexos, parece até pegadinha mas é fato, realmente é simples. Mas quando isso pode ser aplicado?! Um exemplo comum são as situações de conexões com banco, normalmente não queremos ter N fontes de verdades sobre os dados, o que poderia ocasionar situações de conflito entre essas instâncias. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não vou me extender neste padrão, ele realmente é simples, deixarei algumas recomendações no final caso queira saber mais!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ótimo, você já entendeu que o objetivo é criar apenas uma instância, mas como podemos fazer isso?! Algumas linguagens como C# permitem que "marquemos" determinados  serviços como singleton quando realizamos a injeção de dependências, então talvez você já tenha visto algo como isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddSingleton&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas aqui quero falar um pouco mais sobre a ótica de criarmos uma classe que só possa ter uma instância e não sobre um serviço em si. Pensemos no seguinte, você está construindo um jogo de futebol, neste jogo teremos vários objetos que teremos um ou mais, como jogadores de linha, goleiros, bandeirinhas, mas teremos apenas uma objeto bola, apenas um objeto juíz...&lt;/p&gt;

&lt;p&gt;Primeiro vamos criar nossa classe de interesse&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Ball&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Ball&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;ImagePath&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Weight&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;ElasticCoefficient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;Ball&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Ball&lt;/span&gt; &lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;??=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Ball&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// só é instanciado se instace é nula&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos verificar se tudo ocorreu bem&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;SingletonFootball&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ball&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;b2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ball&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A mesma instância foi atribuída aos dois objetos"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Instância diferentes foram atribuídas"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No console veremos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;A mesma instância foi atribuída aos dois objetos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ótimo, funcionou!!! Mas aqui mora uma pegadinha, se por algum motivo estivermos trabalhando com Threads, teremos a possibilidade de várias rotinas acessarem simultaneamente obtendo várias instância, para corrigir isso precisamos realizar pequenas modificações em nosso código.&lt;/p&gt;

&lt;p&gt;Para isso vamos implementar a classe Referee utilizando uma instrução chamada &lt;code&gt;lock&lt;/code&gt;. A ideia é que a primeira instância a chave, irá bloquear que outras possíveis instâncias sejam iniciadas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Referee&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Referee&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;_lock&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;Referee&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Referee&lt;/span&gt; &lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;lock&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Referee&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos testar o que implementamos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;process1&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nf"&gt;TestSingleton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"George"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;Thread&lt;/span&gt; &lt;span class="n"&gt;process2&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nf"&gt;TestSingleton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hamilton"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;process1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;process2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;TestSingleton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Referee&lt;/span&gt; &lt;span class="n"&gt;Referee&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Referee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Referee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na saída teremos então:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;George
George
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desse modo garantiremos que apenas uma instância será criada, mesmo quando utilizarmos threads para execução de tarefas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repositório GIT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/DesignPatterns"&gt;Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais de Estudo
&lt;/h2&gt;

&lt;p&gt;Estamos chegando ao fim do nosso artigo e queria deixar alguns materiais que usei para estudar esse padrão de software: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns/builder"&gt;Refactoring Guru&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dofactory.com/net/builder-design-pattern"&gt;Dofactory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/higordiego/padrao-singleton-4chj#:~:text=O%20padr%C3%A3o%20Singleton%20tem%20algumas,de%20verdade%20para%20um%20dado."&gt;Higor Diego - Padrão - Singleton&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://balta.io/blog/addtransient-addscoped-addsingleton"&gt;Balta - AddTransit, AddScopped, AddSingleton&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/pt-br/dotnet/csharp/language-reference/statements/lock"&gt;Um pouco sobre a instrução lock&lt;/a&gt;&lt;/p&gt;

</description>
      <category>designpatterns</category>
      <category>singleton</category>
      <category>futebol</category>
    </item>
    <item>
      <title>Design Patterns - Prototype</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Fri, 31 May 2024 17:27:08 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/design-patterns-prototype-ea8</link>
      <guid>https://dev.to/nicolasdesouza/design-patterns-prototype-ea8</guid>
      <description>&lt;p&gt;Uma das primeiras coisas que aprendemos na programação, seja qual for a linguagem, é como copiar valor de uma variável para outra. Uma atividade extremamente comum mas que rende situações interessantes no nosso dia a dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definição
&lt;/h2&gt;

&lt;p&gt;É um padrão criacional que permite a criação de novos objetos copiando um objeto já existente, isso pode ser útil quando a criação de um objeto é custosa ao sistema, seja por sua complexidade inerente ou pelo alto consumo de recursos envolvidos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo conceitual
&lt;/h2&gt;

&lt;p&gt;Quando estudei pela primeira vez este padrão de design, confesso que tive dificuldade para entender sua aplicação. Num primeiro momento me pareceu um tanto quanto desnecessário, criar toda uma estrutura para realizar uma simples cópia. Mas foi aí que pensei em um possível uso na minha rotina. &lt;/p&gt;

&lt;p&gt;Imagine que você possua uma entidade Perfil cujo uma de suas propriedades seja a classe Configuração, e a cada vez que você for criar um novo Perfil, precisamos ir na tabela de configurações e obter as configurações mais recentes... Agora imagine, toda vez que precisar criar um novo objeto, será feito uma consulta em banco!! Se esses dados são os mesmos de outros objetos que já estamos manipulando, por quê não usá-los?! É aí que o prototype brilha, padronizando o processo de cópia desses objetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shallow Copy e Deep Copy
&lt;/h2&gt;

&lt;p&gt;Há, pelo menos inicialmente, duas situações para pensarmos sobre as cópias de objetos, as cópias parciais (shallow copy) e as cópias profundas (Deep Copy). A diferença está na forma como os valores são passados de um objeto ao outro. &lt;/p&gt;

&lt;p&gt;Quando estudei programação pela primeira vez, a linguagem C era dominante na instituição (até hoje é ela) e o conceito de passagem de valor e referência fazia parte das primeiras aulas, já que é extremamente comum nesta linguagem, como sei que não é o caso de todos, vou explicar um pouco sobre. &lt;/p&gt;

&lt;h3&gt;
  
  
  Passagem de Valor vs Referência
&lt;/h3&gt;

&lt;p&gt;Passagem de valor é literalmente passar um valor, passamos o conteúdo de uma variável para outra, como no exemplo que segue, onde passamos o valor que está em &lt;code&gt;a&lt;/code&gt; para &lt;code&gt;b&lt;/code&gt;. Com isso temos duas alocações na memória, dois endereços de memória diferentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parece óbvio que se queremos copiar algo, queremos copiar o seu valor, mas na programação certos tipos são sempre passados como referência, é o caso dos vetores em C.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso é feito uma passagem por referência, isso significa que passamos para &lt;code&gt;b&lt;/code&gt; apenas o endereço de memória de &lt;code&gt;a&lt;/code&gt;. Isso significa que toda e qualquer modificação neste vector será refletida tanto em &lt;code&gt;a&lt;/code&gt; quanto em &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas o que isso tem a ver com as cópias?!
&lt;/h3&gt;

&lt;p&gt;Em diversas linguagens, Java e C#, por exemplo, os objetos são passados como referência e isso entrega comportamentos peculiares. Ao realizarmos a cópia de um objeto que possui outros objetos, estes objetos internos serão copiados como referência para o seu destino, portanto compartilharam o mesmo estado em memória, tendo seus valores sempre iguais entre suas cópias, portanto uma cópia parcial (Shallow Copy). &lt;/p&gt;

&lt;h3&gt;
  
  
  Qual devo usar?!
&lt;/h3&gt;

&lt;p&gt;O ganho do uso de cópias parciais é a eficiência do seu código, que usará menos recursos do que se realizasse uma cópia profunda, instanciando um novo objeto interno e copiando os valores presentes. &lt;/p&gt;

&lt;p&gt;Mas qual o melhor a ser usado? Dependerá do seu projeto e necessidades, o padrão Prototype, conferirá a você a padronização desses processos, para que sempre que for necessário copiar um objeto, não seja necessário abrir a classe e verificar se há mais objetos internos, se esses objetos internos não possuem outros objetos internos... &lt;/p&gt;

&lt;h1&gt;
  
  
  Aplicando o Prototype
&lt;/h1&gt;

&lt;p&gt;A primeira coisa que iremos precisar é uma interface do tipo Prototype, que terá os métodos &lt;code&gt;ShallowCopy&lt;/code&gt; e &lt;code&gt;DeepCopy&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IPrototype&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;DeepCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora poderemos implementar a nossa classe abstrata que herdará de &lt;code&gt;IPrototype&lt;/code&gt;, aqui já poderíamos implementar a interface se assim quiséssemos mas no caso prefiro usar uma classe intermediária. &lt;/p&gt;

&lt;p&gt;Criarei também a classe &lt;code&gt;Weapon&lt;/code&gt; para ser nossa classe interna, ela eu já opto por implementar diretamente e portanto não marco suas propriedades como abstract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Enemy&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPrototype&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Enemy&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Weapon&lt;/span&gt; &lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="nf"&gt;ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="nf"&gt;DeepCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Weapon&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IPrototype&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Damage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;damage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Damage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;damage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Weapon&lt;/span&gt; &lt;span class="nf"&gt;ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MemberwiseClone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Weapon&lt;/span&gt; &lt;span class="nf"&gt;DeepCopy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Damage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Note que os métodos herdados de &lt;code&gt;IPrototype&lt;/code&gt; são marcados como abstract para que na próxima herança seja codificado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora podemos finalmente implementar nossa classe produto, a classe Troll.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Troll&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Enemy&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="nf"&gt;ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enemy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MemberwiseClone&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="nf"&gt;DeepCopy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="n"&gt;enemy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;enemy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Damage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;enemy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;Str&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;StringBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Name: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Description: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AppendLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Weapon: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Damage&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que a classe Troll implementa nossos dois tipos de cópia e já na sua implementação entendemos que por mais que seus valores sejam parecidos, haverá um comportamento diferente entre os dois.&lt;/p&gt;

&lt;h2&gt;
  
  
  Executando nossas classes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="n"&gt;Boss&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Troll&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Boss"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Tordoaldo is an evil troll, with a sharp intelligence and hidden strength, who lives in a forest cave adorned with treasures from his adventures."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Weapon&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="n"&gt;Boss_ShallowCopy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Boss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;Enemy&lt;/span&gt; &lt;span class="n"&gt;Boss_DeepCopy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Boss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DeepCopy&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"First Run \n"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;ConsoleInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Boss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"BossWithNewName"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Boss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Weapon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Other Sword"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  

&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Second Run \n"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;ConsoleInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ConsoleInfo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Boss"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Boss&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Boss Shallow Copy"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Boss_ShallowCopy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Boss Deep Copy"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Boss_DeepCopy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Passo a Passo
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Step 1
&lt;/h4&gt;

&lt;p&gt;Aqui realizamos as duas cópias e podemos ver que todas as propriedades são idênticas como deveria ser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch9bzdzvnwrd7u740pk1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fch9bzdzvnwrd7u740pk1.png" alt="Image description" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2
&lt;/h4&gt;

&lt;p&gt;Após isso atualizamos o nome do nosso "Boss" original, e trocamos o nome da sua arma e o que vemos na saída é interessante!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf1ui9avldpchmr1e9w6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcf1ui9avldpchmr1e9w6.png" alt="Image description" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver nosso "Boss" aparece com seu nome novo, sem nenhum problema. Mas nosso "Boss Shallow Copy" também teve sua arma alterada! Isso se dá justamente pela propriedade que comentamos anteriormente, como realizamos uma cópia parcial, a classe interna &lt;code&gt;Weapon&lt;/code&gt; compartilha o mesmo espaço na memória, assim, toda alteração realizada ali refletirá nos dois objetos, "Boss" e "Boss Shallow Copy"&lt;/p&gt;

&lt;h1&gt;
  
  
  Sobre seu uso
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quando usar?!
&lt;/h2&gt;

&lt;p&gt;O livro sobre padrões do Erich Gamma, enumera três casos de uso para este modelo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando classes que serão instanciadas são especificadas em tempo de execução, por carga dinâmica por exemplo.&lt;/li&gt;
&lt;li&gt;Para evitar o acoplamento do nosso código, evitando a construção de uma hierarquia de classes factories paralela à hierarquia de classes do produto.&lt;/li&gt;
&lt;li&gt;Quando as instâncias de uma classe puderem ter uma dentre poucas combinações diferentes de estados. Pode ser mais vantajoso instalar um número correspondente de protótipos e cloná-los, ao invés de instanciar a classe manualmente, cada vez com um estado apropriado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Vantagens
&lt;/h2&gt;

&lt;p&gt;Ainda utilizando o livro supracitado, temos alguns benefícios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acrescentar e remover produtos em tempo de execução. É um padrão mais flexível que outros padrões de criação, permitindo registrar novos produtos ao instanciar um novo prototype no cliente, deste modo o cliente pode instalar e remover protótipos em tempo de execução.&lt;/li&gt;
&lt;li&gt;Especificar novos objetos pela variação de valores. Ao utilizarmos o padrão prototype podemos reduzir consideravelmente o número de classes envolvidas. &lt;/li&gt;
&lt;li&gt;Especificar novos objetos pela variação da estrutura. Este design permite que criemos objetos com partes e subpartes, desde que o nosso objeto composto implemente um clone profundo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desvantagem
&lt;/h2&gt;

&lt;p&gt;A principal desvantagem é que cada subclasse do Prototype deve implementar a operação Clone, o que pode ser difícil. Casos onde as classes possuem referências circulares, ou que não suportam a operação de cópia, são exemplos dessa dificuldade. &lt;/p&gt;

&lt;h2&gt;
  
  
  Repositório GIT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/DesignPatterns"&gt;Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais de Estudo
&lt;/h2&gt;

&lt;p&gt;Estamos chegando ao fim do nosso artigo e queria deixar alguns materiais que usei para estudar esse padrão de software:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns/builder"&gt;Refactoring Guru&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dofactory.com/net/builder-design-pattern"&gt;Dofactory&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.amazon.com.br/Padr%C3%B5es-Projetos-Solu%C3%A7%C3%B5es-Reutiliz%C3%A1veis-Orientados/dp/8573076100/ref=pd_lpo_sccl_1/139-0743064-7931502?pd_rd_w=nD2cg&amp;amp;content-id=amzn1.sym.8151c21e-945b-4095-a73d-67d730c81d28&amp;amp;pf_rd_p=8151c21e-945b-4095-a73d-67d730c81d28&amp;amp;pf_rd_r=07QHYYC7KPHXE3WGN9X2&amp;amp;pd_rd_wg=oApzi&amp;amp;pd_rd_r=4dfbb257-085b-49d3-89ba-d4230649574a&amp;amp;pd_rd_i=8573076100&amp;amp;psc=1"&gt;Padrões de Projetos: Soluções Reutilizáveis de Software Orientados a Objetos&lt;/a&gt;&lt;/p&gt;

</description>
      <category>designpatterns</category>
      <category>csharp</category>
    </item>
    <item>
      <title>Design Patterns - Builder</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Fri, 17 May 2024 18:29:41 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/design-patterns-builder-4g6k</link>
      <guid>https://dev.to/nicolasdesouza/design-patterns-builder-4g6k</guid>
      <description>&lt;p&gt;Seguindo os estudos sobre Design Patterns, hoje vou escrever um pouco sobre o Builder! &lt;/p&gt;

&lt;h2&gt;
  
  
  Objetivo do padrão
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Builder é um padrão criacional que nos auxilia na criação de objetos complexos, passo a passo, permitindo a produção de diferentes tipos e representações de um objeto usando um mesmo código de construção&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qual problema ele resolve?
&lt;/h2&gt;

&lt;p&gt;Imagine um objeto complexo com inúmeros campos, com objetos agregados, e que sua inicialização necessite da realização de inúmeros passos e interações. Poderíamos deixar que o cliente que usará nossa classe, fique responsável por implementar os passos, mas estaríamos assumindo um risco muito grande de que os passos não sejam respeitados, criando objetos com comportamentos errôneos.&lt;/p&gt;

&lt;p&gt;Mas, Nicolas, eu poderia criar um objeto intermediário e passar ele na construção. Sim, você poderia resolver esse problema de inúmeras formas, mas ficaria intuitivo para outros dev's no futuro? Talvez sim. &lt;/p&gt;

&lt;p&gt;Não pense nos padrões como regras absolutas, padrões são acima de tudo sugestões de modelos já consolidados no mercado para elucidar problemas comuns. Cabe a cada desenvolvedor a responsabilidade de interpretar se é uma boa ideia ou não, o famoso: depende!&lt;/p&gt;

&lt;h2&gt;
  
  
  Vamos usar um exemplo?!
&lt;/h2&gt;

&lt;p&gt;Nos materiais que usei para estudar, os exemplos geralmente giram em torno de casas, carros... Isso por que é bem intuitivo entender que um mesmo objeto carro pode ser criado de inúmeras formas, manual, automático, com 2 ou 3 portas... Tentei fugir um pouco do óbvio, pode dar errado, então me contem nos comentários 🤞&lt;/p&gt;

&lt;p&gt;Vamos pensar em um jogo de RPG, onde os jogadores podem montar o seu personagem. Cada personagem será construído de uma forma, com atributos e comportamentos diferentes um dos outros. Além disso, algo comum em alguns RPG's é a possibilidade de combinarmos tipos, por exemplo, posso criar um Mago Bárbaro e ter inúmeras combinações...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;[!warning]&lt;br&gt;
Farei inúmeras limitações, o objetivo aqui é explicar o padrão builder e não criar um jogo!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para começar, vamos criar nossa classe personagem, será ela que terá n construções possíveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Personagem&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;HP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;classe&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//bárbaro, mago...&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que já vimos nossa classe personagem, vamos construir nossa interface responsável por produzir tipos específicos de personagens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IBuilder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;BuildMago&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;BuildBarbaro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;BuildLandino&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos implementar o nosso &lt;code&gt;IBuilder&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Builder&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IBuilder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Personagem&lt;/span&gt; &lt;span class="n"&gt;_personagem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;BuildMago&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_personagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mago"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
        &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AtaqueMagico"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"20"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DanoMagico"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"5"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;BuildBarbaro&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;       
        &lt;span class="n"&gt;_personagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Barbaro"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AtaqueFisico"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"20"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DanoFisico"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;BuildLandino&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;_personagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Landino"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AtaqueFurtivo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"20"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;atributos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DanoFurtivo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Personagem&lt;/span&gt; &lt;span class="nf"&gt;GetPersonagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_personagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_personagem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HP&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dado&lt;/span&gt;&lt;span class="p"&gt;*&lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;Personagem&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_personagem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_personagem&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse ponto já poderíamos usar o builder para criar os nossos personagens, mas podemos também usar uma classe "Diretor", que no nosso caso será a classe Mestre. É dela (classe Mestre) o trabalho de realizar os passos necessários para que combinemos nossos Build de cada personagem, agregando propriedade e comportamentos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mestre&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IBuilder&lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Mestre&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Personagem&lt;/span&gt; &lt;span class="nf"&gt;BuildMagoBarbaro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildMago&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildBarbaro&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Personagem&lt;/span&gt; &lt;span class="nf"&gt;BuildMagoLandino&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dado&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildMago&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildLandino&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dado&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos ver como usaríamos estas classes?!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Utilizando o Mestre "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mestre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildMagoBarbaro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nicolas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mestre&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildMagoLandino&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria Eduarda"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;



&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Utilizando o Builder "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildLandino&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetPersonagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Judith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que no último exemplo estou usando diretamente o Builder para construir um objeto simples. A saída pode ser visto aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyq2a99lvnjdnmltako6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyq2a99lvnjdnmltako6q.png" alt="saída do console" width="677" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olhando a implementação, já entendemos que podemos padronizar o objeto principal com diversas funcionalidades. Neste exemplo foquei nas propriedades (por ser mais fácil de implementar) mas poderíamos ter funções sendo implementadas de jeitos diferentes para cada objeto. Nosso personagem Mago poderia atacar com uma bola de fogo, nosso bárbaro ao atacar usaria uma clava, mas todos continuarão sendo Personagens do nosso RPG.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repositório GIT
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/DesignPatterns"&gt;Design Patterns&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Materiais de Estudo
&lt;/h2&gt;

&lt;p&gt;Estamos chegando ao fim do nosso artigo e queria deixar alguns materiais que usei para estudar esse padrão de software: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://refactoring.guru/pt-br/design-patterns/builder"&gt;Refactoring Guru&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dofactory.com/net/builder-design-pattern"&gt;Dofactory&lt;/a&gt;&lt;/p&gt;

</description>
      <category>designpatterns</category>
      <category>builderpattern</category>
      <category>csharp</category>
      <category>programming</category>
    </item>
    <item>
      <title>Comunicar bem é diferente de falar bem!</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Fri, 10 May 2024 12:00:00 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/comunicar-bem-e-diferente-de-falar-bem-44kb</link>
      <guid>https://dev.to/nicolasdesouza/comunicar-bem-e-diferente-de-falar-bem-44kb</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Uma das habilidades mais sensíveis para nosso desenvolvimento profissional é a nossa capacidade de comunicar. Particularmente acho a comunicação uma das habilidades mais úteis não só para o desenvolvimento de software como para as mais diversas interações que temos ao longo do nosso dia. &lt;/p&gt;

&lt;p&gt;Ao contrário do que possa parecer, falar bem é diferente de se comunicar bem. Penso ser um erro comum no nosso entendimento, somos levados a crer que quem fala bem, com a voz empostada, fazendo uso de palavras difíceis, é uma pessoa com alta capacidade comunicativa mas isto está longe de ser o mais importante para uma boa comunicação. Mas antes de falar sobre os sinais de uma boa comunicação, vamos entender o que é comunicação.&lt;/p&gt;

&lt;p&gt;Uma das definições clássicas para comunicação diz que se comunicar é o ato de transmitir uma mensagem e, eventualmente, receber outra mensagem como resposta. É uma definição simples para um processo simples, queremos falar e ser compreendidos ao ponto de estabelecer uma conversa entre os envolvidos. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A capacidade de trocar ou discutir ideias, de dialogar, com vista ao bom entendimento entre pessoas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Enquanto pesquisava para escrever este artigo, me deparei com esta definição. Acredito que ela traga um elemento fundamental para comunicação que é alcançar o bom entendimento entre os envolvidos. Ao analisar grandes oradores, como Martin Luther King, Mandela, e tantos outros, vamos notar que seus discursos eram focados em alcançar pessoas. Afinal, sempre que falarmos de comunicação estaremos nos comunicando com outras pessoas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sinais que a minha comunicação é eficiente
&lt;/h2&gt;

&lt;p&gt;Provavelmente se perguntarmos a n pessoas o que é comunicar, teremos n resposta mas acredito que essas duas definições nos tragam elementos importantes para entender um pouco mais sobre comunicação. Ao analisar as duas e tentar tirar lições dessas definições proponho alguns pontos sobre boas práticas de comunicação, e vou dividir entre os 3 elementos: Comunicador, Mensagem e Ouvinte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ouvinte
&lt;/h3&gt;

&lt;p&gt;Sempre que falo sobre comunicação com meus colegas noto que muitos subestimam o poder de ser um bom ouvinte para o processo de comunicação. Se você, assim como eu, estiver no começo da carreira, não serão poucos os momentos onde será necessário ouvir mais do que falar e desenvolver a escuta é fundamental. &lt;/p&gt;

&lt;p&gt;As habilidades de escuta estão diretamente relacionadas a abrir mão de achismos preconceitos para com o falante, estar disposto e de mente aberta ao que será apresentado por ele. Em filmes vemos inúmeras vezes a representação do adolescente que não escuta os pais por estarem chateados com algo, no meio profissional vemos essa mesma situação se repetir por outros motivos. Deixamos que nossas opiniões sobre o mensageiro corroam nossa comunicação ao ponto de ser impossível a realização de qualquer diálogo, seja por acharmos o mensageiro inexperiente, incompetente ou apenas porque "com certeza a ideia dele é ruim". &lt;/p&gt;

&lt;p&gt;Acredito piamente que toda ideia deve ser ouvida com o mesmo cuidado e diligência, focando sempre no objetivo que é entender a mensagem que está sendo passada e garantir que entendeu o que o emissor da mensagem deseja com ela. Parte do processo de se comunicar bem dependerá sempre de um público disposto a ouvir e entender o que quer se transmitir. &lt;/p&gt;

&lt;h3&gt;
  
  
  Mensagem
&lt;/h3&gt;

&lt;p&gt;Agora que já somos bons ouvintes é hora de pensarmos em como nos comunicar com eficiência e para isso vamos começar do começo. Uma boa comunicação se inicia no entendimento de como a mensagem deve ser passada para seu público. Talvez agora você se lembre da tia Teteca (ou qualquer outra professora do ensino fundamental) que falava sobre o uso de linguagem formal e informal, e dizia inteiradas vezes que o processo de fala é definido pelo grupo que está falando, mas o que isso tem a ver com se comunicar bem?! Tudo, pequeno gafanhoto. &lt;/p&gt;

&lt;p&gt;Não adianta falar com o presidente empresa da mesma forma como você fala com seus amigos no futebol, o contexto é outro, são ouvintes diferentes com objetivos diferentes. Por essa razão a mensagem também deve ser diferente. Entender isso por si só já garantirá uma maior efetividade na sua comunicação.&lt;/p&gt;

&lt;p&gt;Outro ponto importa a falar sobre a mensagem é a necessidade de confirmação do que foi dito. Uma das grandes dificuldades que encontrei durante o período de pandemia e isolamento foi entender se a minha mensagem realmente havia sido transmitida como eu gostaria. Lembro que em apresentações dos projetos no tempo da faculdade e monitorias que dei, raramente acertava a forma da minha mensagem na primeira tentativa. Ficava sempre buscando em meus ouvintes sinais de que talvez não tenha sido claro ou de que outra abordagem se fazia necessária. &lt;/p&gt;

&lt;p&gt;Não há nada pior para um ouvinte do que ao realizar uma pregunta ouvir a mesma explicação inteira novamente, transferindo para ele (o ouvinte) a responsabilidade por não entender a mensagem. Um dos grandes erros ao nos comunicar é acharmos que nossa mensagem deve ser imutável, excluindo do processo tudo que envolve o processo de comunicação, nos agarrando ao ego e inevitavelmente afundando com ele. Portanto, entenda sempre que sua mensagem tem uma função a ser exercida e se não é exercida com louvor, deve ser adaptada até que alcance o seu propósito.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comunicador
&lt;/h3&gt;

&lt;p&gt;Neste ponto já temos nos atentado para a importância de ouvir com atenção e de que nossa mensagem deve ser capaz de comunicar o que queremos, mas chegamos finalmente ao papel de um bom transmissor de mensagens. Talvez seja o ponto onde a maioria de nós foca as energias, muito embora se você é um bom ouvinte e entende o papel da mensagem, já esteja com 75% do caminho pavimentado para uma boa comunicação. &lt;/p&gt;

&lt;p&gt;No processo de comunicação, ao comunicador cabe o cuidado para que o ouvinte receba a mensagem da melhor forma possível. Nicolas, é só isso?! Sim, se você conseguir ouvir o que seu público diz com atenção, adaptar sua mensagem a ele, você terá alcançado uma comunicação efetiva. É claro que existem outros pontos para se comunicar bem ( assim como outros pontos para uma boa mensagem e para ser um bom ouvinte) mas o grande objetivo é transmitir algo a alguém. &lt;/p&gt;

&lt;p&gt;Algo que se soma a isso na busca de comunicar com qualidade é sempre que falar, fale com intenção de dizer algo e nunca por querer falar. Ainda no tempo de faculdade percebi que era comum silêncio me incomodava, parecia que eu não estava sendo útil no projeto, que não estava me interessando pela aula, mas não foram poucas as vezes em que preferia ter ficado quieto ao falar sem ter como contribuir para a pauta. No trabalho não é diferente, precisamos focar sempre em falar com intenção e não ficar repetindo coisas como um papagaio. Se não entendeu algo que foi dito, comunique, se entende que pode somar ao debate fale, mas evite falar por falar. &lt;/p&gt;

&lt;h2&gt;
  
  
  Como praticar (e melhorar) minhas habilidades?!
&lt;/h2&gt;

&lt;p&gt;Após falarmos sobre como é importante ouvir, adaptar a mensagem e os cuidados que devemos ter com a comunicação, vamos buscar entender práticas para alavancar nosso desenvolvimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como ouvinte
&lt;/h2&gt;

&lt;p&gt;Uma das situações mais complicadas no processo de ser um bom ouvinte é acompanhar situações que por vezes não nos dizem respeito diretamente, ou até mesmo reuniões muito longas onde manter o foco durante muito tempo se torna um verdadeiro desafio. Nestes casos uma forma de praticar suas habilidades como ouvinte é adquirir o hábito de tomar notas. Parece bobo, eu sei, mas escrever durante as reuniões fará com que você se concentre mais na mensagem que está sendo transmitida. &lt;/p&gt;

&lt;p&gt;Durante conversas, reuniões e demais situações onde estejam sendo passadas instruções para você, se certifique de que entendeu tudo o que está sendo transmitido (tome notas sempre que possível). É importante como ouvinte, informar que não entendeu algo, fazer perguntas para entender melhor, ser capaz de alinhar o que é esperado por parte do comunicador. Como vimos, nem sempre o comunicador será capaz de expressar sua mensagem na primeira tentativa, desse modo, dê a ele feedbacks que indiquem o quanto você entendeu da mensagem.&lt;/p&gt;

&lt;p&gt;Saiba esperar o fim de uma mensagem, deixe que o mensageiro formule seu pensamento no próprio tempo. Algo muito danoso a comunicação é lidar com constantes interrupções, com ouvinte é seu papel esperar. Em dias de comunicação assíncrona, ou remota, é comum interrupções, atravessar o colega, mas não deve ser um hábito, sendo necessário atenção e cuidado para não atrapalhar o mensageiro.&lt;/p&gt;

&lt;p&gt;Sendo um bom ouvinte, você será capaz de fornecer insumos e ideias interessantes a seus pares em situações onde os mesmos já não conseguem mais formatar a mensagem. Em tempos de escola, todos devem ter passado por situações onde um determinado colega conseguia ensinar melhor determinado assunto do que o professor, isso se dá principalmente porque o aluno que ensina consegue utilizar da sua experiência como ouvinte para formar uma mensagem mais assertiva do que a usada pelo professor. De igual modo, podemos auxiliar o mensageiro, quando necessário, dando novos formatos a sua mensagem. Esse processo pode auxiliar não só o mensageiro e aos demais ouvintes como a você próprio, fixando melhor a mensagem transmitida.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nesse tipo de situação devemos ter o cuidado e sensibilidade de entender se o mensageiro aceitará sua ajuda e ainda se é realmente necessário, não devemos nos intrometer a todo momento somente para aparecer. nosso objetivo deve ser exclusivamente ajudar.&lt;/p&gt;
&lt;h2&gt;
  
  
  Com a mensagem
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;Saber formatar sua mensagem é fundamental e pra ajudar nisso queria deixar algumas dicas que julgo serem importantes para melhorar suas habilidades. A primeira delas é a leitura, com o passar dos anos outras mídias surgiram mas o hábito da leitura fará com que você desenvolva não só seu vocabulário, como irá expandir seu mundo de possibilidades para se comunicar. Ao nos depararmos com personagens diferentes iremos notar suas formas, trejeitos, e hábitos de fala, isso nos fará mais capazes de adaptar com maior facilidade a nossa mensagem ao nosso público. &lt;/p&gt;

&lt;p&gt;Uma outra atividade que pode te ajudar no processo de elaborar uma mensagem, é a escrita. Escrever o que será apresentado, tomar notas de reuniões, escrever artigos (como esse por exemplo), nos ajuda a estruturar nossa mensagem, com início, meio e fim. O primeiro ponto de uma boa mensagem é a capacidade de estruturar o pensamento, desse modo, papel e caneta tornam o processo mais visual. &lt;/p&gt;

&lt;p&gt;Aprenda a observar a mensagem de outros bons comunicadores, siga pessoas que falem em público, pessoas que você goste e tente copiar as entonações, o fluxo de pensar, analise detalhadamente buscando os elementos que fazem com que você goste de ouvir aquela pessoa. Colha insumos para aperfeiçoar a sua mensagem também.&lt;/p&gt;

&lt;p&gt;Nos últimos dias tenho tentado ser mais visual ao explicar, notei que por mais que me expresse com facilidade oralmente, nem sempre tenho bons retornos sobre o entendimento da mensagem. Nesse sentido, passei a usar mais ferramentas como miro, excalidraw, por exemplo, que deixam minha mensagem mais simples ao meu ouvinte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como comunicador
&lt;/h2&gt;

&lt;p&gt;Aprender a ler suas emoções é um passo importante no processo de comunicar. Quando falamos em público, principalmente, precisamos controlar os nervos para que o nervosismos e ansiedade não atrapalhem a nossa mensagem. Um exercício interessante para isso é praticar em frente ao espelho as apresentações mas somente isso pode não ser suficiente para o dia a dia. Em situações diárias, onde não temos controle sobre os assuntos e temas, uma boa dica é focar no ritmo da sua fala. Tente falar com calma, pausadamente, controlando bem a respiração, isso te dará maior controle sobre sua ansiedade e evitará que sua mensagem seja despejada de qualquer jeito.&lt;/p&gt;

&lt;p&gt;Ao falar em público, precisamos ter cuidado com a nossa própria imagem. Algo que costuma acontecer quando estamos nervosos, ou inseguros com uma apresentação, é admitirmos isso aos nossos ouvintes. E aqui nós perdemos todo o respeito de nossos ouvintes, que imediatamente começaram a questionar se o que estão ouvindo é verdade, se é realmente importante... Parecer confiante é mais importante do que ser confiante nessas situações, não estou falando aqui sobre a mensagem, aqui estou falando sobre a sua postura ao falar. A grande maioria das pessoas que falam ou se apresentam em público irão te confessar que sentem medo, nervosismo, ansiedade... A diferença é que aprenderam a lidar com as suas emoções e a controla-las. &lt;/p&gt;

&lt;p&gt;Ainda sobre essa experiência, uma recomendação, extremamente particular, é a prática de alguma atividade artística. No meu caso foi o saxofone, mas pode ser teatro, canto, dança... Qualquer atividade que te impulsione a se apresentar em público, pode te ajudar a desenvolver habilidades importantes para sua comunicação. Mas preciso alertar que em casos extremos de ansiedade ou até mesmo pânico, pode ser necessário procurar ajuda médica para lidar com isso.&lt;/p&gt;

&lt;p&gt;Outro ponto que me ajuda bastante a me comunicar bem é a franqueza com aqueles que me escutam. Num mundo onde todos fingem ser especialistas em tudo, reconhecer suas possíveis limitações sobre o que está sendo dito, torna o processo de comunicação mais orgânico e aproxima o ouvinte de você e de sua mensagem. Precisamos saber dosar com cuidado esta abordagem mais franca, mas por vezes será fundamental para alcançar o sucesso do processo em nossas relações. Penso que ao ouvirmos de um cliente suas demandas, nem sempre iremos entender o que ele precisa e por vezes nos fará questionamentos chaves que não havíamos pensado ainda, nessas situações a franqueza é fundamental para que a comunicação seja estabelecida (e o serviço entregue). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O leitor nesse momento pode estar questionando se os parágrafos a cima não são naturalmente contraditórios e talvez sejam, mas creio que não. Quando digo que precisamos ser confiantes ao falar, estou falando diretamente sobre a forma como falamos, já ao dizer que precisamos ser francos e honestos com nosso ouvinte, digo isso pensando puramente no conteúdo da mensagem que estamos passando.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Um bom comunicador não é aquele que fala bonito ou de maneira pomposa, evite ser exageradamente complexo, torne sempre sua mensagem palatável para aqueles que te ouvem. Você provavelmente conhece inúmeras pessoas que falam "errado", que não possuem um vocabulário muito grande, mas que ainda assim são comunicadores primorosos, pois o objetivo não é parecer inteligente ou fomentar a imagem de bom comunicador, e sim porque focam em se fazer entender.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A arte da comunicação é um ramo incrível com muitas nuances e peculiaridades, deixo o convite a assistir esta talk como forma de consolidar o seu conhecimento e impulsionar a uma carreira comunicativa. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/hjhD0lhCGHk?si=tNNaPyVkO2OlQ0Ya"&gt;O olhar do SIM&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softskills</category>
      <category>comunicao</category>
    </item>
    <item>
      <title>Kubernetes + RabbitMQ</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Tue, 07 May 2024 16:26:46 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/kubernetes-rabbitmq-4ed7</link>
      <guid>https://dev.to/nicolasdesouza/kubernetes-rabbitmq-4ed7</guid>
      <description>&lt;h2&gt;
  
  
  Instalação do cluster operator
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instalação de toda estrutura necessária para utilizar o RabbitMQ (services, imagens...)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalação do plugin krew
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;krew é utilizado para instalar plugins no cluster para facilitar a interação através de plugins
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'[:upper:]'&lt;/span&gt; &lt;span class="s1"&gt;'[:lower:]'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'s/x86_64/amd64/'&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'s/\(arm\)\(64\)\?.*/\1\2/'&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'s/aarch64$/arm64/'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nv"&gt;KREW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"krew-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  curl &lt;span class="nt"&gt;-fsSLO&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/kubernetes-sigs/krew/releases/latest/download/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KREW&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nb"&gt;tar &lt;/span&gt;zxvf &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KREW&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.tar.gz"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  ./&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KREW&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nb"&gt;install &lt;/span&gt;krew
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  É necessário salvar no arquivo .zshrc
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano .zshrc   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No final do arquivo adicionamos a seguinte linha:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Instalação do plugin rabbitmq
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl krew &lt;span class="nb"&gt;install &lt;/span&gt;rabbitmq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilizando o plugin rabbitmq
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Este plugin fornece uma interface para operar a instância do RabbitMQ instalada no cluster
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl rabbitmq create &amp;lt;nome_da_instancia&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl rabbitmq get &amp;lt;nome_da_instancia&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl rabbitmq delete &amp;lt;nome_da_instancia&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Obtendo os dados de acesso
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl rabbitmq secrets &amp;lt;nome_da_instancia&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Acessando a Manager UI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl rabbitmq manage &amp;lt;nome_da_instancia&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Será solicitado os dados de login obtidos com o comando secrets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Para acessar via APP
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Necessário fazer o roteamento para que consigamos acessar &lt;/li&gt;
&lt;li&gt;O serviço de mensagens funciona na porta 5672&lt;/li&gt;
&lt;li&gt;O serviço de UI funciona na porta 15672
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; kubectl port-forward &amp;lt;servico&amp;gt; 5672:5672
 kubectl port-forward &amp;lt;servico&amp;gt; 15672:15672
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Foi necessário passar os dados de acesso
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user: default_user_dOjGazQi6DE0u23JWCu
password: 25j4FKb0ESJQc4cYUJzJvbbmZNelOWnJ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>k8s</category>
      <category>rabbitmq</category>
      <category>kubernetes</category>
      <category>mensageria</category>
    </item>
    <item>
      <title>Bot Telegram + Notion</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Tue, 07 May 2024 13:35:56 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/bot-telegram-notion-356c</link>
      <guid>https://dev.to/nicolasdesouza/bot-telegram-notion-356c</guid>
      <description>&lt;h1&gt;
  
  
  Objetivo
&lt;/h1&gt;

&lt;p&gt;📢Desenvolver um bot telegram capaz de gerir meu banco de dados Notion atravs da sua API oficial&lt;/p&gt;

&lt;p&gt;🔎Rodar a aplicação dentro de um container Docker&lt;/p&gt;

&lt;h1&gt;
  
  
  Tecnologias Empregadas
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Node.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Bots são &lt;strong&gt;pequenos aplicativos&lt;/strong&gt; executados inteiramente no aplicativo Telegram&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa é a definição do próprio Telegram em seu site oficial, interessante né?! Imagina rodar uma aplicação com toda sua interface já construída e solidificada, tanto nas questões de da experiência do usuário, quanto na sua interface, é exatamente o que ocorre aqui. Os bots permitem desenvolver aplicações únicas, capazes de auxiliar seus usuáios em diversas tarefas, como baixar uma música, enviar um tweet, receber uma notícia…&lt;/p&gt;

&lt;p&gt;Nesse projeto em questão somaremos a tudo isso o poder do Notion.&lt;/p&gt;

&lt;p&gt;Como primeira etapa, estamos mesclando grande parte do seu fluxo de trabalho em um espaço de trabalho completo . Quer uma lista de tarefas? Um roteiro de produto? Um repositório de design? Eles agora estão todos em um só lugar. Você pode até personalizar seu próprio espaço de trabalho a partir de dezenas de blocos de construção estilo LEGO.&lt;/p&gt;

&lt;h1&gt;
  
  
  Funcionalidades
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Este bot acabou por ficar muito pessoal, mas com algumas adaptações, qualquer um pode criar o seu próprio Jarvis!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Menu Principal
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QiFnIpny--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088035050/c659da85-20cf-4a3d-b75b-32f16d867af3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QiFnIpny--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088035050/c659da85-20cf-4a3d-b75b-32f16d867af3.png" alt="" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Menu Cursos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B-Obba3Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088121000/7ce7e928-3668-4eeb-81ec-14fd634e5aa4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B-Obba3Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088121000/7ce7e928-3668-4eeb-81ec-14fd634e5aa4.png" alt="" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Menu de Task
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u-qOpxRx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088129505/4294b1f2-899e-4c48-ac74-44ee341fb205.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u-qOpxRx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088129505/4294b1f2-899e-4c48-ac74-44ee341fb205.png" alt="" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Menu Projetos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YKhBUm7u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088139950/121c6d36-badf-4ff0-9d62-2d5acf64cf3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YKhBUm7u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088139950/121c6d36-badf-4ff0-9d62-2d5acf64cf3f.png" alt="" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Comandos
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rsF3D3wb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088181163/fa1d209e-59b8-4a41-a9b8-e999dfedef05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rsF3D3wb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088181163/fa1d209e-59b8-4a41-a9b8-e999dfedef05.png" alt="" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Busca por conteúdo
&lt;/h2&gt;

&lt;p&gt;Para realizar uma busca por um registro específico basta enviar uma mensagem sem um comando Telegram — /algumacoisa — que o bot irá realizar uma busca por todos os conteúdos que contenham o termo buscado ou no título do registro ou em uma das tags.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9y5lo4ux--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088211432/c21b4a59-2099-4509-90fa-ea771000709c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9y5lo4ux--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1715088211432/c21b4a59-2099-4509-90fa-ea771000709c.png" alt="" width="800" height="618"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Para saber mais
&lt;/h1&gt;

&lt;p&gt;Se quiser ver o código e fazer seus ajustes basta clicar &lt;a href="https://github.com/nicolas-souza/Bot-Telegram-Notion"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>projeto</category>
      <category>notion</category>
      <category>telegram</category>
      <category>docker</category>
    </item>
    <item>
      <title>Design Pattern - Factory Method</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Fri, 26 Apr 2024 14:32:33 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/design-pattern-factory-method-136p</link>
      <guid>https://dev.to/nicolasdesouza/design-pattern-factory-method-136p</guid>
      <description>&lt;p&gt;Design Patterns, padrões de design ou até padrões de projeto, são um conjunto de soluções típicas para problemas comuns dentro do desenvolvimento de software. &lt;/p&gt;

&lt;p&gt;São algoritmos?! Não. Um algoritmo é uma descrição detalhada de passos para realizar uma determinada tarefa. Um design pattern é mais alto nível que isso, expõe comportamentos e orientações a nível organizacional do código.&lt;/p&gt;

&lt;p&gt;É importante salientar que diferente de funções e bibliotecas que encontramos e rapidamente incorporamos ao nosso código, implementar um padrão é muito mais do que isso, sendo necessário uma análise minuciosa dos relacionamentos existentes e dos possíveis ganhos que cada padrão poderá nos fornecer. &lt;/p&gt;

&lt;p&gt;Há três grandes grupos dentro do estudo de padrões de projeto:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Padrões criacionais&lt;/li&gt;
&lt;li&gt;Padrões estruturais&lt;/li&gt;
&lt;li&gt;Padrões Comportamentais&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vamos focar no primeiro e esmiuçar alguns pontos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Padrões criacionais
&lt;/h2&gt;

&lt;p&gt;A criação de objetos é intrínseco ao desenvolvimento de software, é normal que passemos diariamente por problemas que outros já passaram e assim podemos nos beneficiar do estudo de padrões, afim de não reinventarmos a roda sempre que nos depararmos com um novo problema. &lt;/p&gt;

&lt;p&gt;Poderemos então abrir nossa caixa de ferramentas e encontrar algo que nos ajude.&lt;/p&gt;

&lt;h3&gt;
  
  
  Factory Method
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;O &lt;strong&gt;Factory Method&lt;/strong&gt; é um padrão criacional de projeto que fornece uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objetos que serão criados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Talvez seja o padrão criacional mais simples de se entender, talvez você já até tenha usado esse padrão nos seus projetos e nem sabia que havia um nome para esta abordagem. &lt;/p&gt;

&lt;p&gt;A ideia aqui é criar uma &lt;em&gt;fábrica&lt;/em&gt; de objetos, sempre que precisarmos de um objeto específico poderemos usar esta fábrica e obter um objeto válido sem maiores dificuldades. Mas por que? Como? Quando?&lt;/p&gt;

&lt;p&gt;Vamos dar um passo atrás...&lt;/p&gt;

&lt;p&gt;Vamos pensar em uma faculdade, no primeiro semestre há apenas o curso de Engenharia Civil.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CivilEngineeringStudent&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Courses&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculus I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Programming I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"algebra"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então quando queríamos criar seria só usar o &lt;code&gt;new&lt;/code&gt; e pronto, teríamos um novo estudante. E estava tudo certo, até que em algum momento o CEO decidiu que agora teríamos também o curso de Biologia. E lá vamos nós construir um novo modelo de dados para vídeo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BiologyStudent&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Courses&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Marina Life I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Algebra"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculus I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas pera aí, na hora de criar um novo estudante, vou precisar selecionar o tipo de post para então criar um objeto. Estou aumentando a complexidade... Há uma forma mais interessante de fazer isso, usando o &lt;strong&gt;Factory Method&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos criar a interface &lt;em&gt;graduation&lt;/em&gt;, e nossas classes &lt;em&gt;CivilEngineeringStudent&lt;/em&gt; e &lt;em&gt;BiologyStudent&lt;/em&gt;, irão herdar dela os seus dados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IGraduation&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Courses&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="p"&gt;;}&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintStudent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CivilEngineeringStudent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Graduation&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculus I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Programming I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"algebra"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintStudent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Student of Civil Engineering - &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BiologyStudent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Graduation&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;DateOfBirth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Marina Life I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Algebra"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;Courses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Calculus I"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;PrintStudent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Student of Biology - &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas só isso ainda não resolve nosso problema original, continuaria sendo necessário fazer duas chamadas diferentes, selecionando manualmente qual objeto seria criado em qual momento.&lt;/p&gt;

&lt;p&gt;Para isso criaremos também uma classe abstrata chamada de Creator, que irá criar os objetos de acordo a nossa necessidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;Creator&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;IGraduation&lt;/span&gt; &lt;span class="nf"&gt;FactoryMethod&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConcreteCreator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Creator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="n"&gt;IConteudo&lt;/span&gt; &lt;span class="nf"&gt;GetGraduation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;graduation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graduation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Biology"&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BiologyStudent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Civil Engineering"&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CivilEngineeringStudent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateOfBirth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora podemos criar estudantes para os dois cursos como poderemos ver no código que segue. Vamos criar dois estudantes, uma de Biologia outro de Engenharia Civil.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ConcreteCreator&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;studenteOfBiology&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetGraduation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Biology"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Judith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"01/01/2003"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;studenteOfCivilEngineering&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetGraduation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Civil Engineering"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Kirk W."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"01/01/1958"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IGraduation&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;studenteOfBiology&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;studenteOfCivilEngineering&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PrintStudent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Prós e Contras
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Prós&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Baixo acoplamento&lt;/li&gt;
&lt;li&gt;Auxilia a implementar os conceitos de SOLID, em especial: 

&lt;ul&gt;
&lt;li&gt;Princípio de responsabilidade única &lt;/li&gt;
&lt;li&gt;Princípio aberto/fechado&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contras&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aumento significativo da complexidade do código&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>designpatterns</category>
      <category>csharp</category>
    </item>
    <item>
      <title>RabbitMQ + .NET + Mass Transit</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Tue, 09 Apr 2024 19:19:12 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/rabbitmq-net-mass-transit-m9g</link>
      <guid>https://dev.to/nicolasdesouza/rabbitmq-net-mass-transit-m9g</guid>
      <description>&lt;h1&gt;
  
  
  RabbitMQ
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Filas
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjh9ly3pxdt13kjzvi5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjh9ly3pxdt13kjzvi5l.png" alt="Image description" width="800" height="209"&gt;&lt;/a&gt;&lt;br&gt;
A estrutura mais simples dentro do RabbitMQ são as filas. Nessa estrutura há o envio de dados feito por um &lt;em&gt;producer&lt;/em&gt; e o seu consumo é feito por um &lt;em&gt;consumer&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Fila é uma estrutura de dados caracterizada pelo comportamento FIFO - &lt;em&gt;first in, first out&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Exchange
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu1083y7dyiawkjiuksd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu1083y7dyiawkjiuksd.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subindo o nível das estruturas presentes na solução RabbitMQ temos as Exchanges que podem ser lidas como um distribuidor de mensagens.&lt;/p&gt;

&lt;p&gt;Mas quando isso pode ser útil?! Situações onde uma mesma mensagem tem múltiplos consumidores diferentes. Exemplo: Restaurantes processam o pedido do cliente e inserem numa exchange (em outros provedores pode ser chamado de tópico), e então esse mesmo pedido será processado em uma fila na cozinha, para fazer criar os pratos, e também pode ser processada em uma fila de financeiro para levantar os lucros do dia.&lt;/p&gt;

&lt;p&gt;Como é feito isso?! A exchange precisa de meios para rotear as mensagens, isso pode ser feito via interface, configurando a para enviar suas mensagens para filas específicas. Outra possibilidade é que para cada &lt;em&gt;consumer&lt;/em&gt; será criado uma fila temporária onde o dado será consumido. Há também como usar &lt;em&gt;headers&lt;/em&gt; para marcar a mensagem.&lt;/p&gt;
&lt;h1&gt;
  
  
  Mass Transit
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Usando diretamente as Filas
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Mesmo utilizando só filas, é criada uma exchange por padrão&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Minhas observações
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Achei mais difícil usar esta lib do que a disponibilizada pela própria RabbitMQ, para publicação dos dados&lt;/li&gt;
&lt;li&gt;Gostei de usá-la para consumo, ficou mais agradável a leitura do código &lt;/li&gt;
&lt;li&gt;Foi necessário utilizar o padrão da program + main para inicializar o serviço do consumer com a inversão do handler&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Producer
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;MassTransit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.DependencyInjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Common.Models&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Data.Common&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ServiceCollection&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddMassTransit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UsingRabbitMq&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"default_user_dOjGazQi6DE0u23JWCu"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"25j4FKb0ESJQc4cYUJzJvbbmZNelOWnJ"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureEndpoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt; 

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;BuildServiceProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serviceProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetRequiredService&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IBusControl&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;StartAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Start transmission..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;idNumber&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idNumber&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;$"Pedido qualquer de numero &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idNumber&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// var endpoint = await bus.GetSendEndpoint(new Uri("rabbitmq://localhost/order-service")); &lt;/span&gt;
    &lt;span class="c1"&gt;//enviar para uma exchange&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetSendEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"queue:kitchen"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Message &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; sent..."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;idNumber&lt;/span&gt;&lt;span class="p"&gt;++;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Para enviar a uma fila específica é necessário utilizar  dessa estrutura, onde passamos o nome da fila na criação do objeto &lt;code&gt;Uri("queue:nome_da_fila")&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Para enviar a uma exchange devemos utilizar &lt;code&gt;Uri("rabbitmq://localhost/nome_da_exchange")&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;Além disso será necessário configurar o &lt;em&gt;bind&lt;/em&gt; para um fila específica via UI&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Consumer
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Program
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;MassTransit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.DependencyInjection&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Extensions.Hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OrderHandler.Domain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OrderHandler.Domain.Interfaces&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OrderHandler.Infrastructure&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Program&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CreateDefaultBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureServices&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;services&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScoped&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;IOrderManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OrderManager&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddMassTransit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddConsumer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UsingRabbitMq&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rabbitmq://localhost/"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Username&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"default_user_dOjGazQi6DE0u23JWCu"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"25j4FKb0ESJQc4cYUJzJvbbmZNelOWnJ"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReceiveEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"kitchen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureConsumer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ConfigureEndpoints&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Consumer
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Common.Models&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;MassTransit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;OrderHandler.Domain.Interfaces&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;OrderHandler.Infrastructure&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Consumer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IConsumer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="n"&gt;IOrderManager&lt;/span&gt; &lt;span class="n"&gt;orderManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IOrderManager&lt;/span&gt; &lt;span class="n"&gt;orderManager_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;orderManager&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;orderManager_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; 
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="nf"&gt;Consume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ConsumeContext&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;orderManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PrintOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompletedTask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Dessa forma toda mensagem lida é enviada para o consumer tratar 
## Usando as Exchanges&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Minhas observações
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Como foi dito, para que um exchange encaminhe os dados é necessário fazer o bind&lt;/li&gt;
&lt;li&gt;Nosso consumer consegue configurar o bind quando é criado logo há uma ordem na subida de cada parte do sistema

&lt;ul&gt;
&lt;li&gt;RabbitMQ =&amp;gt; Consumer =&amp;gt; Producer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;o código é o mesmo, só vou mostrar as pontuais diferenças&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Producer
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetSendEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"rabbitmq://localhost/order-service"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;//exchange:name&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Consumer
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetEntityName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"order-service"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;//exchange name&lt;/span&gt;
&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReceiveEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"finance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;//queue name&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ep&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureConsumer&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Consumer&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Configurando TTL - Time To Live
&lt;/h2&gt;

&lt;p&gt;Determina um tempo de vida para mensagem, testei usando milissegundo, segundos e horas. Podemos implementar para dias também.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TimeToLive&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>rabbitmq</category>
      <category>dotnet</category>
      <category>masstransit</category>
    </item>
    <item>
      <title>Microsserviços</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Fri, 17 Nov 2023 18:56:00 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/microsservicos-3ela</link>
      <guid>https://dev.to/nicolasdesouza/microsservicos-3ela</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3511ionan2yyqs5qqan.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3511ionan2yyqs5qqan.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Sumário
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;Monolitos, o mundo antes dos microsserviços&lt;/li&gt;
&lt;li&gt;Monólitos vs Microsserviços

&lt;ul&gt;
&lt;li&gt;Monólitos&lt;/li&gt;
&lt;li&gt;Microsserviços&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Quando usar microsserviços?&lt;/li&gt;
&lt;li&gt;Microsserviços

&lt;ul&gt;
&lt;li&gt;Pontos de atenção&lt;/li&gt;
&lt;li&gt;Exemplos de microsserviços&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Continue seus estudos&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Resumo
&lt;/h1&gt;

&lt;p&gt;Este artigo busca oferecer um guia claro e prático sobre microsserviços, explorando não apenas os benefícios e exemplos dessa abordagem, mas também considerações essenciais, ferramentas como Docker e Kubernetes, além de práticas cruciais como mensageria e testes automatizados. Ao compartilhar essas perspectivas, esperamos fornecer uma base sólida para aqueles que buscam entender, implementar e otimizar arquiteturas baseadas em microsserviços em seus projetos de desenvolvimento de software.&lt;/p&gt;

&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;No cenário dinâmico e evolutivo da tecnologia, onde a computação em nuvem se firma como uma pedra angular e novas aplicações surgem constantemente, o conhecimento sobre microsserviços torna-se indispensável. Este artigo busca proporcionar uma orientação prática, compartilhando insights que encurtam a curva de aprendizado em um tema crucial para o desenvolvimento de software na era contemporânea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monolitos, o mundo antes dos microsserviços
&lt;/h2&gt;

&lt;p&gt;Um monolito é, sem dúvida, a abordagem mais simples para o desenvolvimento de um projeto de software, caracterizada pela concentração de todas as funcionalidades em um único processo executado no mesmo ambiente. É provável que todo desenvolvedor tenha experiência com projetos desse tipo, seja durante a faculdade ou em cursos, já que representa uma maneira direta de transformar uma ideia em realidade. Nesse contexto arquitetônico, cada serviço da aplicação é desenvolvido e implementado em conjunto com os demais serviços existentes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Acoplamento

&lt;ul&gt;
&lt;li&gt;Sistemas monolíticos apresentam alto acoplamento, como vimos nos nossos exemplos, toda e qualquer modificação implica na necessidade de realizar um deploy de toda a aplicação. Esta criticidade no deploy fere inclusive o pensamento de entrega contínua da cultura Devops.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Escalabilidade limitada

&lt;ul&gt;
&lt;li&gt;Escalar um sistema monolítico é um desafio peculiar, não sendo possível escalar apenas uma parte do sistema, você precisará escalar toda a aplicação, mesmo que apenas um dos seus componentes esteja necessitando deste ajuste. Neste tipo de sistema, escalar significará adicionar recursos como CPU, RAM e armazenamento no servidor, esta escalabilidade tem limite físico e financeiro.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Manutenção e implementação

&lt;ul&gt;
&lt;li&gt;Dar manutenção em um sistema legado, com um milhão de funcionalidades e relações que você nunca nem viu, ser torna uma grande dor de cabeça. Pequenas modificações podem se tornar pull requests enormes, os testes (se existirem) levarão bem mais do que 10 minutos, e o deploy será crítico e tenso.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Tecnologia uniforme

&lt;ul&gt;
&lt;li&gt;Não interessa que lidar com arquivos em GO seja muito mais simples, ou que construir uma interface em C# seja mais intuitivo, se o sistema foi construído em JAVA, toda nova funcionalidade também deverá ser escrita em JAVA.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjzzk6okl0bfcxsswpr4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyjzzk6okl0bfcxsswpr4.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monólitos vs Microsserviços
&lt;/h2&gt;

&lt;p&gt;Ao optarmos pela abordagem de microsserviços em vez da monolítica, a diferença fundamental reside na resiliência do sistema diante de falhas específicas. É importante ressaltar que, embora o erro ainda pudesse ocorrer da mesma forma, o impacto poderia ser significativamente reduzido. Vamos considerar um exemplo prático: suponha que o erro estivesse relacionado ao envio de e-mails. Em um ambiente de microsserviços, a aplicação continuaria funcionando globalmente, permitindo o cadastro e movimentação de mercadorias, mesmo que a funcionalidade de envio de e-mails estivesse comprometida.&lt;/p&gt;

&lt;p&gt;Embora esse exemplo possa parecer simplista, ele ilustra a ideia de que, em situações de instabilidade, certas partes do sistema podem ser afetadas, mas outras permaneceriam operacionais. Uma analogia mais concreta pode ser observada em plataformas populares como o Instagram. Durante períodos de instabilidade, os "stories" podem enfrentar problemas, enquanto o feed continua funcionando sem interrupções aparentes.&lt;/p&gt;

&lt;p&gt;Essa descentralização de funcionalidades em microsserviços é particularmente benéfica para aplicações críticas, como redes sociais massivamente utilizadas, exemplificadas pelo Instagram e TikTok. Em ambientes de microsserviços, a falha em uma parte específica do sistema não compromete sua totalidade, evitando assim a perda de credibilidade junto aos usuários, mesmo quando algumas funcionalidades estão temporariamente indisponíveis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar microsserviços?
&lt;/h2&gt;

&lt;p&gt;Após lermos os benefícios do uso dessa abordagem, podemos pensar que nunca mais iremos desenvolver um sistema monolítico mas isso é uma péssima ideia. Sim, as vantagens são ótimas mas a complexidade desta abordagem é alta, equipes com pouca experiência terão imensa dificuldade de performar de maneira satisfatória. Uma outra situação delicada é a relação de custo e benefício dessa abordagem que precisa ser discutida, de fato ela resolverá muitos problemas mas será que você já precisa se preocupar com isso?!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As consequências de nossos atos são sempre tão complexas, tão diversas, que predizer o futuro é uma tarefa realmente difícil. — Alvo Dumbledore&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As palavras de Dumbledore são bem certeiras no mundo do desenvolvimento. Não é viável nos preocuparmos com cenários que podem nunca chegar. É com o objetivo de evitar excessos de engenharia, que surge o conceito de “&lt;em&gt;&lt;strong&gt;MonolithFirst&lt;/strong&gt;&lt;/em&gt;”.&lt;/p&gt;

&lt;p&gt;Este conceito, defendido por Martin Fowler, vai recomendar que comecemos nosso projeto com um monolito e somente quando for necessário, façamos a mudança para microsserviços. Pode parecer contra intuitivo, afinal queremos desenvolver o melhor e mais moderno sempre, mas precisamos ter o cuidado de entender que o melhor envolve muito mais coisas do que apenas hype.&lt;/p&gt;

&lt;p&gt;Ao iniciar nossa aplicação como um monolito, ganharemos velocidade para desenvolver, errar e corrigir. Algo que ouvi essa semana e gostei muito é que desenvolvimento é sobre feedback, quanto mais rápido temos feedback, mais rápido corrigimos e melhoramos nossa aplicação. Quando nossa aplicação estiver robusta, bem escrita, com as regras de negócio bem amarradas, o cliente estiver satisfeito e tivermos a demanda por maior disponibilidade, ou ainda quando estiver inviável manter o sistema, aí sim começaremos a estrangular nosso monolito buscando criar serviços especializados, nossos microsserviços.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12rajmk0c7eyg1oyzuaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12rajmk0c7eyg1oyzuaf.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Microsserviços
&lt;/h1&gt;

&lt;p&gt;Agora que já entendemos as vantagens e motivações por trás dessa abordagem, podemos nos debruçar sobre o tema principal deste artigo. Microsserviços representam uma abordagem arquitetônica e organizacional no desenvolvimento de software que se fundamenta na descentralização de responsabilidades e processos de um sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desacoplamento

&lt;ul&gt;
&lt;li&gt;Como cada serviço será desenvolvido e implementado isolado dos demais, o impacto de alterações e modificações será consideravelmente menor&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Escalabilidade

&lt;ul&gt;
&lt;li&gt;Escalar um microsserviço é de certa forma simples uma vez que podem ser escalado individualmente, reduzindo custos e otimizando recursos.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Tecnologia Variada

&lt;ul&gt;
&lt;li&gt;O primeiro serviço foi escrito em JAVA, mas agora você precisa lidar com arquivos e quer usar GO?! Tudo bem, os serviços são independentes, permitindo que novas funcionalidades sejam desenvolvidas com a melhor ferramenta para aquela tarefa. Podemos ter uma aplicação com quantos microsserviços quisermos, com quantas linguagens forem necessárias.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Facilidade de manutenção e de implantação

&lt;ul&gt;
&lt;li&gt;Realizar manutenção em uma aplicação que usa microsserviços possibilita que as modificações e alterações sejam realizadas em um único serviço, os testes executados serão apenas daquele serviço, ganhamos tempo e tornamos o deploy muito mais simples ao diminuir riscos — com isso nos aproximamos dos objetivos de integração e desenvolvimento contínuo.&lt;/li&gt;
&lt;li&gt;Uma outra possibilidade dessa escolha arquitetônica é a criação de equipes especializadas em cada aspecto da nossa aplicação, isso torna nosso time mais dinâmico e mais eficiente para resolver possíveis chamados, atendendo com eficiência as demandas dos nossos clientes.&lt;/li&gt;
&lt;li&gt;Quando um serviço sair do ar os demais continuarão funcionando, diminuindo a frustração dos usuários do sistema o que pode resultar em um menor impacto as operações&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf1vzltjm52jpucihxx0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faf1vzltjm52jpucihxx0.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos de atenção
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Organização dos repositórios
&lt;/h3&gt;

&lt;p&gt;É necessário muito cuidado ao decidir como os repositórios de cada serviço será criado. Há duas estratégias para organização de repositórios, monorepos ou multi-repos. O mais intuitivo para a organização é pensarmos em utilizar vários repositórios, mantendo cada serviço 100% independente dos demais, e isso é totalmente aceitável e faz muito sentido. Quando atuamos em projetos com uma quantidade aceitável de repositórios, é consideravelmente simples manter todos os serviços atualizados mas e quando trabalhamos com 200, 300 serviços diferentes?! É nesses casos que monorepos ganham espaço.&lt;/p&gt;

&lt;p&gt;Em sistema grandes e complexos, a abordagem intuitiva de manter cada serviço em repositórios separados pode impactar toda a governança do projeto, dificultando e até impossibilitando uma gerência das equipes envolvidas. Um outro ponto é que, para serviços interligados, será muito mais trabalhoso ao desenvolvedor preparar sua máquina para desempenhar o seu trabalho, perdendo eficiência.&lt;/p&gt;

&lt;p&gt;Monorepos não são novidade dentro do mundo do desenvolvimento, Linux e Windows já usavam essa abordagem mas tem ganhado força nos últimos anos dentro da cultura Devops que prega, entre outras coisas, a total participação e integração das equipes envolvidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comunicação entre microsserviços
&lt;/h3&gt;

&lt;p&gt;Não adianta criarmos vários microsserviços se eles não interagem para solucionar o problema do cliente, então como integrar esses serviços?! Ao separar um sistema em microsserviços, vamos encontrar as relações entre as parte e como as interações devem ser implementadas.&lt;/p&gt;

&lt;p&gt;A comunicação síncrona é a mais habitual em softwares, onde cada nova ação depende do término da anterior. Um site que realiza um chamada HTTP a um servidor, precisa esperar os dados chegarem para então renderizar em tela, ou seja há uma sincronicidade das informações.&lt;/p&gt;

&lt;p&gt;Já a comunicação assíncrona, embora menos utilizada em outras arquiteturas, é fundamental para um bom funcionamento de microsserviços. Você deve lembrar que uma das vantagens nessa abordagem é o desacoplamento entre as partes do nosso sistema, sendo assim se algo para de funcionar, o sistema pode continuar operando mesmo que sem aquela funcionalidade. Mas agora imagine que toda comunicação fosse síncrona, isso seria possível?!&lt;/p&gt;

&lt;p&gt;Vamos pensar em uma rede social, você cria a sua conta e já tem acesso a algumas funcionalidades, para que acesse outras é necessário que sua conta seja verificada. Essa verificação pode ocorrer ou não em sequência, o serviço de e-mails talvez tenha saído do ar por algum erro no processamento mas isso não vai impactar o usuário que pode continuar mexendo sem que sua aplicação trave e fique esperando essa confirmação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automatização e Padronização
&lt;/h3&gt;

&lt;p&gt;Para criarmos microsserviços de modo eficaz é de bom tom que usemos modelos, padrões, &lt;em&gt;templates&lt;/em&gt;, capazes de abstrair e diminuir a manualidade da operação. O ajuste para funcionamento de um sistema com essa abordagem é fino, precisando garantir a sincronicidade das informações, manter contratos entre interfaces e outros mil e um detalhes. Se para cada novo serviço for necessário implementar do zero, perderemos tempo e aumentaremos o risco de falhas no nosso sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logs e Monitoramento
&lt;/h3&gt;

&lt;p&gt;A essa altura do artigo, imagino que já deve estar percebendo que certas práticas comuns no desenvolvimento de sistemas centralizados não serão possíveis aqui. Dentre essas práticas algo que tive muita dificuldade trabalhando em um sistema com microsserviços foi a dificuldade de investigar bugs. Quando usamos um código monolítico é fácil &lt;em&gt;entupir&lt;/em&gt; o código com breakpoints (ou console.log) para acompanharmos o funcionamento do sistema mas se o sistema é descentralizado, como fazer isso, como acompanhar os fluxos se muitas vezes não são síncronos, como identificar requisições que falharam, processos que quebraram, como examinar tudo?!&lt;/p&gt;

&lt;p&gt;Por isso o uso de logs e ferramentas de monitoramento serão fundamentais. É nítido que todo sistema se beneficia do uso dessas tecnologias mas para microsserviços é fundamental, será a única forma de rastrear as requisições e interações do nosso sistema.&lt;/p&gt;

&lt;p&gt;O monitoramento por sua vez permitirá uma ação proativa da equipe de desenvolvimento, identificando erros antes mesmo que a massa de clientes perceba. Além da detecção de falhas temos alguns outros pontos como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Visibilidade&lt;/p&gt;

&lt;p&gt;Será que todos os serviços estão realmente disponíveis?! Cada serviço pode estar sendo disponibilizado em estruturas de clouds diferentes, em lugares geográficos diferentes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detecção de Falhas&lt;/p&gt;

&lt;p&gt;Falhas em microsserviços menos utilizados podem passar despercebidos pelos usuários devido sua baixa frequência de uso, uma ferramenta de monitoramento permitirá as equipes de desenvolvimento envolvidas atuar antes mesmo que o usuário final perceba.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Otimização de Desempenho&lt;/p&gt;

&lt;p&gt;Se o foco do dessa abordagem é o desempenho, com certeza vamos quere manter o desempenho do sistema. O monitoramento dos status dos nossos serviços permitirá identificar gargalos, prever sobrecargas do sistema, e esse conhecimento prévio permitirá ajustes e melhorias na nossa infra de modo a garantir o desempenho da aplicação.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Exemplos de microsserviços
&lt;/h2&gt;

&lt;p&gt;Sendo o ponto para criarmos microsserviços o momento após a criação de um monólito, teremos como técnica principal de criação de microsserviços o estrangulamento do nosso monólito, onde iremos remover de pouco a pouco os microsserviços. Mas como identificar os microsserviços possíveis?! Uma possibilidade interessante ocorre quando nosso monolito já está dividido em módulos, então podemos separar cada módulo em um microsserviço independente. Como nem sempre teremos essa divisão clara, acredito que uma boa forma de identificar os serviços da nossa aplicação é conhecer alguns exemplos de microsserviços.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Serviços de Negócios&lt;/p&gt;

&lt;p&gt;Processos internos do negócio estão sujeitos a se tornar serviços. A geração de boletos é um bom exemplo de um serviço que não precisaria estar acoplado a outras partes do sistema, poderíamos ter uma fila que salvasse os dados necessários para criar um boleto e um &lt;em&gt;cronjob&lt;/em&gt; que rodasse 2 vezes ao dia lendo a fila e criando os boletos necessários.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serviços de Autenticação e Autorização&lt;/p&gt;

&lt;p&gt;Centralizar operações de autenticação e autorização pode ser uma boa ideia. Todo sistema utiliza maneiras de implementar mas via de regra são um módulo dentro do sistema já tendo sua implementação desacoplada do restante do código.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serviços de Armazenamento de Dados&lt;/p&gt;

&lt;p&gt;Em alguns casos pode ser interessante isolar os serviços de armazenamento de dados, não somente banco de dados mas também sistemas de cache, manipulação de arquivos… Ao isolar este serviço poderíamos centralizar atividades de gerenciamento, recuperação de dados, criação de backups e outras funções relacionadas aos dados da nossa aplicação.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serviços de Monitoramento e Registro&lt;/p&gt;

&lt;p&gt;Como vimos, monitorar e registrar é fundamental e com o intuito de padronizar nossos registros e insights, seria viável a criação de um serviço que ficasse responsável por gerir essa parte tão crítica ao nosso sistema.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Serviços de Gateway&lt;/p&gt;

&lt;p&gt;Em alguns casos podemos optar pela criação de um serviço centralizador de operações, que iria concentrar as requisições do cliente e teria a responsabilidade de rotear para o devido serviço. Esse gateway poderia centralizar solicitações de autenticação, autorização, e até mesmo o balanceamento de carga.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Bônus
&lt;/h1&gt;

&lt;p&gt;Agora que já entendemos o que são microsserviços e suas possibilidades, é hora de conversarmos sobre algumas ferramentas e conceitos que são utilizadas em muitos projetos quando se opta pelo uso de microsserviços.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contêineres
&lt;/h2&gt;

&lt;p&gt;Garantir que o host do nosso serviço terá as configurações necessária de rede, DNS, versões de bibliotecas e SDK’s, de maneira simples e prática é fundamental para um bom aproveitamento da abordagem de microsserviços. Além disso, segundo as práticas de Devops e integração contínua, devemos buscar por ferramentas que nos permitam desenvolver, testar, homologar em ambientes que sejam o mais próximo possível do ambiente de produção, é nessa busca por ambiente iguais que os contêineres fazem sua mágica.&lt;/p&gt;

&lt;p&gt;A ferramenta de contêiner mais comum e usada é o Docker mas existem outras opções no mercado como o Podman, no fim o que nos interessa aqui é o uso de contêineres para desenvolvimento e deploy, garantindo o máximo de uniformidade entre os ambientes.&lt;/p&gt;

&lt;p&gt;Um contêiner possui aspectos interessantes para nosso propósito de criar serviços interdependentes como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Isolamento&lt;/p&gt;

&lt;p&gt;Cada contêiner é uma unidade isolada no sistema, o que significa dizer que um aplicativo rodando em um container não será afetado por nenhuma alteração que ocorra em outra aplicação em outro container.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Empacotamento de aplicativos&lt;/p&gt;

&lt;p&gt;Ao criar um arquivo de configuração, um &lt;em&gt;dockerfile&lt;/em&gt; por exemplo, somos capazes de definir tudo o que será necessário para execução do nosso aplicativo, dependências como a versão do node necessária, ou a versão do mongo que queremos usar, podemos configurar ainda se iremos usar uma imagem Ubuntu para rodar a aplicação ou uma imagem Debian.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Portabilidade&lt;/p&gt;

&lt;p&gt;Uma vez que nosso contêiner está funcional, podemos facilmente migrá-lo para um serviço de cloud diferente ou ainda executá-lo na máquina local, com todas as suas funcionalidades preservadas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Orquestração&lt;/p&gt;

&lt;p&gt;Parte da complexidade dos microsserviços é justamente garantir que todos os serviços estejam no ar, disponíveis e operando e fazer isso manualmente pode ser uma dor de cabeça e tanto. Para nossa sorte é possível utilizarmos um orquestrador de containers, que irá subir cada container necessário, numa determinada ordem lógica, garantindo o correto funcionamento de todo o nosso sistema.&lt;/p&gt;

&lt;p&gt;Uma das ferramenta utilizadas para orquestração é o Kubernetes, que dentre muitas coisas possui sistemas de auto recuperação, que em caso de falha pode reiniciar os contêineres, abstrai infraestruturas subjacentes e outros aspectos que merecem o estudo.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mensageria
&lt;/h2&gt;

&lt;p&gt;A comunicação entre microsserviços é parte fundamental para um bom aproveitamento desta arquitetura. Com já dito há duas possibilidades de comunicação, assíncrona e síncrona, neste tópico vamos quero falar em especial da comunicação assíncrona e o uso de serviços de mensageria.&lt;/p&gt;

&lt;p&gt;Mensageria é a prática de enviar mensagens entre componentes de software, nossos microsserviços, possibilitando a comunicação, facilitando a integração e a coordenação das operações do sistema. Okay, mas quais informações teremos nessas mensagens?!&lt;/p&gt;

&lt;p&gt;Podemos montar uma mensagem com diversas informações, variando com as necessidades do projeto. A mensagem pode conter informações sobre eventos, solicitações, respostas, atualização de informações…&lt;/p&gt;

&lt;p&gt;Vamos imaginar uma rede social, ao fazer a inscrição é criado uma mensagem contendo o nome, o &lt;em&gt;user&lt;/em&gt;, e-mail. Então o serviço responsável por confirmar os dados leria a mensagem e dispararia o e-mail para o usuário realizar a confirmação da inscrição.&lt;/p&gt;

&lt;p&gt;No mercado há algumas ferramentas que facilitam a implementação de mensageria, como Kafka e RabbitMQ que merecem um estudo aprofundado sobre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testes Automatizados
&lt;/h2&gt;

&lt;p&gt;Neste momento da leitura, imagino que já ficou claro que trabalhar com microsserviços pode ser complexo. Cada microsserviço precisa operar de maneira satisfatória para que todo o sistema realmente funcione, garantir o funcionamento de serviço manualmente pode ser uma grande dor de cabeça. Além da dificuldade, se a cada alteração em um microsserviço não tivermos a confiança de que ele se integrará corretamente aos demais serviços, nunca teremos confiança para realizar o deploy com independência e iremos perder mais um dos aspectos positivos desta abordagem.&lt;/p&gt;

&lt;p&gt;Com tudo isso em mente o uso de testes automatizados pode ser uma excelente ideia. Ao criarmos testes unitários, testes de integração, aumentaremos a confiabilidade no que foi feito, permitindo agilidade ao realizar o deploy e quando alcançarmos a maturidade e a devida cobertura, poderemos estar realizando integração contínua bem como o deploy contínuo da nossa solução.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Como tudo na nossa área, usar ou não a arquiteturas de software depende de muita avaliação e estudo. A abordagem “&lt;em&gt;&lt;strong&gt;MonolithFirst&lt;/strong&gt;&lt;/em&gt;” é uma grande aliada para não cometermos erros de &lt;em&gt;over engineering&lt;/em&gt; aumentando toda a complexidade do projeto antes que haja necessidade. Após a construção do nosso monolito, podemos começar a estrangula-lo, extraindo seus serviços em microsserviços, com eficácia e entregando valor ao nosso cliente. Para isso podemos lançar mão de várias tecnologias, ferramentas e abordagens que nos ajudarão a alcançar nossos objetivos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Continue seus estudos
&lt;/h1&gt;

&lt;p&gt;Sabendo que se chegou até aqui é porque está estudando, deixo aqui alguns artigos que podem te ajudar (como me ajudaram) a entender melhor alguns temas que estão presentes nesse artigo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/microservices.html"&gt;Microservices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/bliki/MonolithFirst.html"&gt;bliki: MonolithFirst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.bytebytego.com/p/ep62-why-does-google-use-monorepo"&gt;EP62: Why Does Google Use Monorepo?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pt.slideshare.net/helderdarocha/padres-essenciais-de-mensageria-para-integrao-de-sistemas"&gt;Padrões essenciais de mensageria para integração de sistemas&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://continuousdelivery.com/"&gt;What is Continuous Delivery? - Continuous Delivery&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://12factor.net/pt_br/"&gt;The Twelve-Factor App (traduzido)&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://martinfowler.com/delivery.html"&gt;Software Delivery Guide&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://open.spotify.com/episode/1oCMLmcCtmH8tQz8S6xrHS?si=d9d0da1b0f934e7f"&gt;Testes Automatizados – Hipsters #51&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/episode/4Z9Fyl6IHR7QX6VC2CNTlC?si=8990d07640414752"&gt;Integração Contínua, Deploy Contínuo e Github Actions – Hipsters #213&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>microsservices</category>
      <category>development</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Protótipo de um modelo de gerenciamento de espaços baseado na Internet das Coisas</title>
      <dc:creator>Nicolas de Souza</dc:creator>
      <pubDate>Tue, 17 Jan 2023 20:35:28 +0000</pubDate>
      <link>https://dev.to/nicolasdesouza/prototipo-de-um-modelo-de-gerenciamento-de-espacos-baseado-na-internet-das-coisas-4ngo</link>
      <guid>https://dev.to/nicolasdesouza/prototipo-de-um-modelo-de-gerenciamento-de-espacos-baseado-na-internet-das-coisas-4ngo</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Esse é o texto selecionado do meu trabalho de conclusão, escrito junto com Thátilla Curty&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1 Introdução
&lt;/h2&gt;

&lt;p&gt;Com a introdução da globalização nos mais variados contextos do cotidiano, nota-se a busca constante por tecnologia para tornar atividades das mais complexas às mais simples, virtualmente praticáveis. Paralelamente a isso, vê-se conceitos de escritórios, moradias e lazer com propostas inovadoras a fim de modernizar a gestão de espaços compartilhados. Logo, unindo-se às duas vertentes, vê-se a busca por métodos que realizem o controle e a organização do acesso a alguns espaços a fim de restringi-los a um determinado grupo de pessoas por tempo predefinidos. Disponibilidade de salas para locação é prática cada vez mais comum, assim como aluguéis de imóveis a curto prazo, espaço privativo existente em um local mais amplo, bem como salas privativas de bares e restaurantes nos quais soluções convencionais ainda são muito aplicadas a fim de pô-los em uso, como a utilização de fechaduras, trincos, cadeados e chaves. Um desses &lt;em&gt;cases&lt;/em&gt; de compartilhamento de espaços é a empresa de aluguéis de imóveis &lt;em&gt;Airbnb&lt;/em&gt;, que permite que usuários, chamados de anfitriões, aluguem espaços para viajantes desconhecidos. Pensando rapidamente sobre essa relação, fica evidenciado o poder de uma ferramenta de gerenciamento, que tranquilizaria ambas as partes e ainda melhoraria a experiência dos mesmos. Essas ferramentas, no entanto, não são efetivas no controle organizacional, tampouco auxiliam na privacidade dos envolvidos, podendo esses pontos serem alcançados por fechaduras inteligentes. Porém, ainda há uma carência de dispositivos como este de baixo custo no qual seja possível centralizar e gerenciar remotamente. Com intuito de suprir essas carências, funcionalidades e conceitos da Internet das Coisas são aplicadas, cuja natureza pode ser descrita com base na capacidade de dispositivos se comunicarem entre eles e com usuários, do controle e automação de atividades cotidianas e na redução dos custos destas atividades. Todos estes aspectos, quando aliados, proporcionam uma melhor experiência a quem utilizará o dispositivo. Desta forma, propõe-se no presente trabalho o estudo e desenvolvimento de um protótipo de dispositivo de gestão inteligente do acesso de espaços compartilhados utilizando-se da &lt;em&gt;IoT&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2 Justificativa
&lt;/h2&gt;

&lt;p&gt;O uso de objetos tem sido revolucionado ao redor do mundo com a inserção de dispositivos inteligentes, cada vez mais e mais pessoas se aventuram neste mundo, integrando suas casas com assistentes virtuais, obtendo assim uma experiência totalmente única. Indo de encontro a esse anseio por obter uma melhor experiência, a criação de um sistema de gerenciamento como proposto nesse trabalho irá, sem sombra de dúvidas, impactar a vida de todos aqueles que compartilham espaços, desde professores e alunos, que usam laboratórios como os presentes em nossa instituição, bem como aqueles que alugam salas comerciais, escritórios e tantos outros recursos que podem ser compartilhados. Diferentemente do que se pensava há alguns anos, a internet das coisas não é um assunto de ficção, já é uma realidade e é impreterível abraçarmos seus conceitos e ideias para construir tecnologias cada vez mais acessíveis e impactantes para as pessoas.&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Objetivos
&lt;/h2&gt;

&lt;p&gt;O objetivo deste trabalho é desenvolver um sistema de reservas constituído por um aplicativo &lt;em&gt;web&lt;/em&gt; e um dispositivo físico, que permita um maior controle do uso dos espaços compartilhados.&lt;/p&gt;

&lt;p&gt;Como objetivos específicos têm-se as escolhas das ferramentas mais eficazes para o desenvolvimento do sistema, ou seja, a escolha das tecnologias, &lt;em&gt;frameworks&lt;/em&gt; e bancos de dados que irão permitir a realização do projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  4 Desenvolvimento
&lt;/h2&gt;

&lt;p&gt;Neste capítulo serão apresentados conceitos relacionados à temática e ao desenvolvimento do trabalho no qual se baseia na funcionalidade de fechaduras digitais e na comunicação com os utilizadores, descrevendo a implementação da &lt;em&gt;IoT&lt;/em&gt; (&lt;em&gt;Internet&lt;/em&gt; das coisas), bem como suas ramificações para a prototipagem através da interface estética por meio da programação voltada ao &lt;em&gt;front-end&lt;/em&gt; e não menos importante, o desenvolvimento do &lt;em&gt;back-end&lt;/em&gt; a fim de garantir a eficácia da comunicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Fechadura Digital
&lt;/h3&gt;

&lt;p&gt;As fechaduras digitais conforme ilustrado na Figura 1, são dispositivos eletrônicos que possuem a capacidade tanto de facilitar quanto dificultar a entrada e saída de pessoas a determinados ambientes, além de permitir vantagens secundárias como a comodidade no dia-a-dia. Ainda que possuam benefícios consideráveis, estes dispositivos ainda possuem certa resistência quando a implementação por parte dos brasileiros. Isso se dá por alguns motivos, dentre eles destacam-se o custo considerável que são comercializadas custando em média mil reais, a dificuldade de instalação e a necessidade de mão de obra qualificada para reparos. Através dos inúmeros tipos de acionamento, como explicado por (GOUVEIA, 2017), as fechaduras podem funcionar por meio de cartão de aproximação, biometria, senha numérica e até mesmo por &lt;em&gt;bluetooth&lt;/em&gt;, permitindo a abertura por comando de voz, por exemplo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcsz5zgr271udrzfnuh2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffcsz5zgr271udrzfnuh2.png" alt="Figura 1 - Exemplo de Fechadura Digital" width="280" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Iot: &lt;em&gt;Internet of Things&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Segundo Weber (2010, p.1), “A &lt;em&gt;Internet&lt;/em&gt; das Coisas (&lt;em&gt;IoT&lt;/em&gt;) é uma arquitetura de informação global emergente baseada na &lt;em&gt;Internet&lt;/em&gt; que facilita a troca de bens e serviços”. Logo, o objetivo deste conceito é fornecer representações nos sistemas de informação de objetos físicos, permitindo que sejam consultadas qualquer informação pertinente a eles através da &lt;em&gt;internet&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Objetos simples e cotidianos, assim como serviços mais avançados de informação, podem interagir e comunicar. Segundo Magrani (2018, p.22), é essa conexão das coisas junto a Internet “com capacidade para compartilhar, processar, armazenar e analisar um volume enorme de dados entre si” que explicita e unifica os conceitos de &lt;em&gt;IoT&lt;/em&gt; e &lt;em&gt;Big Data&lt;/em&gt;, sendo este último termo, referência a uma quantidade volumosa de dados que, também segundo Magrani (2018, p.22), “têm potencial de ser explorados para obter informações.”.&lt;/p&gt;

&lt;p&gt;É pelo uso de tecnologias interconectadas e demais vantagens e características da &lt;em&gt;IoT&lt;/em&gt;, que a mesma, segundo Magrani (2018, p.24) “poderá trazer diversos benefícios aos consumidores.”, sendo possível solução para desafios de gestão pública, por exemplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Banco de Dados
&lt;/h3&gt;

&lt;p&gt;Desde os primórdios da humanidade o ser humano busca formas de armazenar informação, desenhos rupestres, a invenção do papiro, as fotografias e tantas outras formas de registrar e armazenar informações de modo digital.&lt;/p&gt;

&lt;p&gt;A informação possui valor estratégico, sendo necessário cuidado e estudos para o desenvolvimento de um sistema de gerenciamento de banco de dados (SGBD). Para (FONTES, 2006), é fundamental que a informação não seja apenas armazenada como também seja disponibilizada para quem necessita dela.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4 Plataformas de Prototipagem
&lt;/h3&gt;

&lt;p&gt;Prototipar é a ação de criar um protótipo, ou seja, criar uma versão do seu produto que permita testar e validar ideias antes de conceber o produto que será entregue ao mercado. Com o intuito de atender a demandas de profissionais e entusiastas da cultura &lt;em&gt;maker&lt;/em&gt;, nos últimos anos surgiram inúmeras plataformas que visam facilitar o desenvolvimento de protótipos.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.4.1 Arduino
&lt;/h4&gt;

&lt;p&gt;A plataforma &lt;em&gt;Arduino&lt;/em&gt;, como o exemplo da Figura 2, lançada em 2005 por um grupo de pesquisadores tem por objetivo democratizar o acesso à tecnologia, facilitando o desenvolvimento de projetos e apoiando atividades de ensino. Como citado por (MCROBERTS, 2015),“A maior vantagem do &lt;em&gt;Arduino&lt;/em&gt; em relação a outras plataformas de desenvolvimento de microcontroladores é sua facilidade de utilização, o que permite que pessoas que não sejam da área técnica possam aprender o básico e criar seus próprios projetos em um período relativamente curto”. Esta plataforma é baseada nos conceitos de &lt;em&gt;softwares&lt;/em&gt; e &lt;em&gt;hardwares&lt;/em&gt; livres, permitindo que todo e qualquer usuário contribua com novas bibliotecas e funcionalidades, além de permitir a fabricação de placas genéricas por outros fabricantes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnf3v9btw5f8obna97ugy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnf3v9btw5f8obna97ugy.png" alt="Figura 2 - Arduino" width="295" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este ecossistema de desenvolvimento conta com uma IDE (&lt;em&gt;Integrated Development Environment&lt;/em&gt;, que em português significa Ambiente de Desenvolvimento Integrado), que permite programação de placas como ESP32, NODEMCU, etc. A IDE, como explicado por (MCROBERTS, 2015), permite compilar e embarcar códigos escritos em &lt;em&gt;wiring&lt;/em&gt;, linguagem tipo C/C++ que permite uma abstração de particularidades dos &lt;em&gt;hardwares&lt;/em&gt;, facilitando o desenvolvimento.&lt;/p&gt;

&lt;h4&gt;
  
  
  4.4.2 Raspberry
&lt;/h4&gt;

&lt;p&gt;As placas &lt;em&gt;raspberry&lt;/em&gt; criadas e mantidas pela &lt;em&gt;Raspberry Foundation&lt;/em&gt;, são uma opção para o desenvolvimento de protótipos. Segundo (OLIVEIRA; ZANETTI; NABARRO, 2018), são plataformas versáteis que permitem fácil conexão de circuitos e módulos eletrônicos, sendo uma excelente ferramenta para desenvolvimento de conceitos &lt;em&gt;IoT&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F39biydhizu6ul2yqeiij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F39biydhizu6ul2yqeiij.png" alt="Figura 3 - Raspberry" width="385" height="227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estes microcomputadores de baixo custo são constituídos de placa única como ilustrado na Figura 3, possuindo capacidades suficientes para desenvolvimento de projetos envolvendo robótica, ainda que possuam capacidade de armazenamento, processamento e memória RAM inferiores se comparados a de computadores convencionais.&lt;/p&gt;

&lt;p&gt;As primeiras placas desenvolvidas tinham por objetivo proporcionar o acesso a computação através de suas placas, que não eram maiores do que um celular.&lt;/p&gt;

&lt;p&gt;Aliando seu tamanho compacto ao poder de processamento de um computador, as placas &lt;em&gt;raspberry&lt;/em&gt; logo se tornaram uma alternativa para criação de servidores, &lt;em&gt;machine learning&lt;/em&gt; e demais aplicações da computação. Ademais, trabalham com código aberto através de um sistema operacional baseado na distribuição &lt;em&gt;Linux Debian&lt;/em&gt;, sendo, de acordo com (OLIVEIRA; ZANETTI; NABARRO, 2018), uma ferramenta de inclusão digital tendo vasta opção de programas gratuitos por ser um &lt;em&gt;software&lt;/em&gt; livre.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5 Comunicação entre as partes
&lt;/h3&gt;

&lt;p&gt;Para que a comunicação exista, as partes (transmissor e receptor) devem possuir um pré-acordo de como será a troca de informações. Numa aula, por exemplo, o professor deve falar a mesma língua nativa dos estudantes. Já para comunicação usando a rede de computadores, hoje já melhor, definida como uma rede de &lt;em&gt;hosts&lt;/em&gt;, se faz necessário que as partes saibam quais são as regras para que possa haver a troca de dados. O protocolo HTTP, que foi desenvolvido em 1965 por Ted Nelson e que viria a se tornar um dos pilares da &lt;em&gt;WEB&lt;/em&gt; moderna, é um protocolo da camada de aplicação do modelo TCP/IP, que segundo (COMER, 2015), permite o acesso das informações de modo de texto estruturado, não se preocupando de como o dado ali foi recebido/tratado já que no modelo TCP/IP cada camada tem sua função.&lt;/p&gt;

&lt;p&gt;Para (KUROSE; ROSS, 2006), O HTTP está dividido em duas partes, servidor e cliente, que se comunicam através de mensagens HTTP. Deste modo, entende-se que o HTTP provê uma estrutura para essas mensagens bem como a forma como essas mensagens são compartilhadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.6 Aplicação &lt;em&gt;Web&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Os sistemas &lt;em&gt;Web&lt;/em&gt; evoluíram significativamente desde suas primeiras versões, isso se deve a muitos fatores, mas especialmente ao aumento de desempenho das máquinas como um todo. Nos primórdios da &lt;em&gt;web&lt;/em&gt;, a principal forma de se visualizar um &lt;em&gt;site&lt;/em&gt; era carregar um arquivo estático que seria apenas exibindo na tela do usuário, ou seja, toda a parte de tratamento de dados e envio de mídias era feito dentro do servidor e entregue pronto ao computador do usuário. Assim, como explicado por (CUNHA, 2022), “ todos os arquivos e documentos produzidos dentro do sistema eram armazenados localmente ou em algum diretório da rede.”&lt;/p&gt;

&lt;p&gt;Com o aumento da performance dos computadores pessoais passou a ser possível a criação de sistemas mais complexos e robustos, dentro dos navegadores, aumentando a interoperabilidade de sistemas e abrindo uma nova era de desenvolvimento. Um exemplo dessa evolução pode ser vista nos editores de texto, em que no início dos anos 2000, seria inimaginável pensar em um editor de texto que não fosse um programa específico de computador, hoje já somos capazes de escrever dentro do próprio navegador, sincronizados com nossos celulares e &lt;em&gt;tablets&lt;/em&gt;. Uma aplicação &lt;em&gt;web&lt;/em&gt; é geralmente composta de &lt;em&gt;frontend&lt;/em&gt; e &lt;em&gt;backend&lt;/em&gt;, a primeira sendo tudo aquilo que é realizado diretamente no navegador do usuário e da experiência do usuário com o produto.&lt;/p&gt;

&lt;p&gt;É nesta parte que os desenvolvedores se debruçam para garantir não só a correta funcionalidade do sistema mas também que essa experiência seja simples e satisfatória. Um exemplo desta preocupação pode ser vista em certos padrões: o botão de busca que sempre fica posicionado na parte superior das páginas ou ainda as informações de contato que são colocadas no rodapé. Nada impede o usuário de inverter a localização dessas informações, mas, pensando na experiência para o usuário, faz sentido que seja o mais próximo daquilo que ele já está habituado a realizar.&lt;/p&gt;

&lt;p&gt;Por &lt;em&gt;backend&lt;/em&gt;, entende-se tudo aquilo que está acontecendo no servidor da aplicação, no qual é dele a responsabilidade de tratar os dados dos bancos ao usuário e rotinas que demandem mais processamento por exemplo.&lt;/p&gt;

&lt;p&gt;A comunicação entre &lt;em&gt;backend&lt;/em&gt; e &lt;em&gt;frontend&lt;/em&gt;, como visto no tópico anterior e no decorrer deste, é feito principalmente pelos métodos do protocolo HTTP. Através de uma interface de programação de aplicação, as comumente chamadas API’s (&lt;em&gt;Application Programming&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Interface&lt;/em&gt;), é possível integrar os serviços do cliente e do servidor resultando em uma melhor performance e experiência do usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.7 Robôs de auto-atendimento
&lt;/h3&gt;

&lt;p&gt;A fim de otimizar as operações, melhorar o atendimento e interface com o cliente, empresas buscam os robôs de auto-atendimento como recursos. Essas ferramentas, como (WITTEL, 2017) explica, surgiram para suprir demandas de canais diferenciados de atendimento ao cliente no qual podem ser conceituados como interfaces automatizadas de conversação ou assistentes virtuais. Em outras palavras, os &lt;em&gt;chatbots&lt;/em&gt; funcionam com inteligencia artificial que trabalham a partir de comandos preestabelecidos, fornecendo em tempo real, atendimento especializado aos clientes. Esses robôs de auto-atendimento se integram a aplicativos de comunicação, como &lt;em&gt;whatsapp, telegram e facebook&lt;/em&gt; , como forma mais versátil e simples à se comunicar com o cliente, uma vez que, segundo (WITTEL, 2017) , não necessita de download adicional de qualquer programa.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Metodologia
&lt;/h2&gt;

&lt;p&gt;Neste trabalho será utilizada a pesquisa experimental qualitativa, que baseia-se na manipulação direta de variáveis relacionadas com o objeto de estudo, tendo como finalidade testar hipóteses. Objetivando o melhor desenvolvimento do protótipo, optou-se por uma pesquisa de cunho experimental visando reproduzir a situação-problema em condições controladas, criando modelos de solução. Isso implica dizer que serão versões simplificadas do problema maior, a fim de proporcionar um maior entendimento do tema.&lt;/p&gt;

&lt;p&gt;Ao colocar a pesquisa em ação, escolhendo como ambiente teste e papel de espaço compartilhado a fim de aplicar o gerenciamento por meio do protótipo, os laboratórios do campus IFF Macaé servirão de objeto de estudo com finalidade de observar o funcionamento dos mesmos com objetivo de fundamento para nossas reproduções físicas do protótipo, imaginando-se sempre, sua aplicabilidade nos laboratórios de informática, bem como a realidade cotidiana do fluxo de pessoas e o gerenciamento nesses espaços.&lt;/p&gt;

&lt;p&gt;Primeiramente, será desenvolvido o modelo problemático, descrevendo o funcionamento atual das reservas. Ademais, serão realizadas análises com o propósito de encontrar uma melhor versão para os usuários deste sistema.&lt;/p&gt;

&lt;p&gt;Após o devido entendimento da situação problema, da devida delimitação de requisitos e necessidades, dará-se início a segunda etapa que, em suma, canaliza-se no estudo aprofundado de aplicações da &lt;em&gt;IoT&lt;/em&gt;, com intuito de entender e desenvolver aplicações reais que apresentam limitações mas também, inúmeras possibilidades.&lt;/p&gt;

&lt;p&gt;Como consequência, é dado início à criação de uma versão teste para o sistema &lt;em&gt;web&lt;/em&gt; de agendamento, buscando encontrar a forma mais simples à utilização do usuário. Com este intuito ocorre ainda a procura por uma forma prática e eficiente de se desenvolver e manter o sistema &lt;em&gt;web&lt;/em&gt;. Portanto é nesta etapa do desenvolvimento deste trabalho que as primeiras versões do sistema começam a serem desenhadas e testadas.&lt;/p&gt;

&lt;p&gt;Após alcançar uma certa maturidade do sistema &lt;em&gt;web&lt;/em&gt;, iniciaremos a construção da fechadura que compõe nosso sistema. A ela, damos o papel de usabilidade, comunicação e organização, criando um dispositivo &lt;em&gt;IoT&lt;/em&gt; que se conectará ao nosso sistema desenvolvido.&lt;/p&gt;

&lt;h2&gt;
  
  
  6 Resultados e discussões
&lt;/h2&gt;

&lt;p&gt;Ao iniciar-se o descritivo do modelo problemático sendo a implantação do protótipo e gerenciamento do espaço nos laboratórios de informática do IFF &lt;em&gt;campus&lt;/em&gt; Macaé, durante a execução da primeira etapa de estudo, observou-se a maneira na qual se dá as reservas dos mesmos atualmente: É disponibilizado em um site monitorado pelo professor responsável pelos laboratórios do IFF, a possibilidade de datas e horários disponíveis a serem utilizados, onde o usuário pode se cadastrar. Para acessar os espaços é disponibilizado chaves ou senhas que são únicas e compartilhadas a todos. Desta forma, é necessário contar com a cooperação e bom senso dos usuários uma vez que não há um controle, na prática, de permanência das pessoas no ambiente em seu horário específico.&lt;/p&gt;

&lt;p&gt;Dando sequência ao entendimento do modelo problemático, bem como estudo de tecnologias para tornar-se possível o desenvolver de um protótipo que suprisse as necessidades e fragilidades já citadas, foi dado inicio ao desdobramento deste trabalho, se iniciando com a aplicação &lt;em&gt;web&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;frontend&lt;/em&gt; foi construído pensando em três tipos de usuários: o primeiro, sendo ele o usuário sem qualquer nível de acesso, esse usuário poderá apenas visualizar as reservas realizadas; o segundo tipo de usuário é o usuário com nível de acesso comum, este usuário terá acesso à partes específicas do sistema que o permitirão controlar suas reservas; o terceiro e último usuário é o administrador, este por sua vez terá nível de acesso total, desde realizar reservas até inserir novos usuários no sistema. A premissa fundamental do funcionamento das reservas é que uma reserva só poderá ser efetivada se, e somente se, o horário estiver livre. Na realização da reserva o usuário selecionará o intervalo de horários, informará o título da reserva e irá informar a sua senha de acesso. Acerca dessas informações, será necessário realizar validações para garantir o correto funcionamento, entre estas regras destaca-se as orientações para a seleção de horários, o horário final deverá ser posterior ao horário inicial e deverá ser impossível ao usuário realizar uma reserva com horários anteriores ao horário da realização da reserva, ou seja, no passado. Nas figuras 4 e 5 é possível visualizar como o &lt;em&gt;frontend&lt;/em&gt; foi constituído, pensado em uma experiência simples e intuitiva ao usuário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwumh13xsjxdkk8b94jz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwumh13xsjxdkk8b94jz9.png" alt="Figura 4 - Página Home: Sistema Moisés" width="546" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86tqtwyccxu0dg1vcmlm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F86tqtwyccxu0dg1vcmlm.png" alt="Figura 5 - Página Reservas: Sistema Moisés" width="546" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;backend&lt;/em&gt;, por sua vez foi pensado de modo a validar as informações vindas do &lt;em&gt;frontend&lt;/em&gt; através das requisições HTTP, e realizar as operações necessárias junto ao banco de dados. Deste modo é no &lt;em&gt;backend&lt;/em&gt; onde os dados são tratados, manipulados e disponibilizados para as demais partes do sistema. Para criação de um modelo o mais fidedigno possível, as rotas de acesso que compõe esse sistema são protegidas a nível de acesso, ou seja, apenas usuários que possuam nível de acesso compatível podem realizar ações que afetem o banco de dados. Este nível de acesso é compartilhado através da realização do login, na forma de uma chave única, criada junto com a criação do usuário no sistema, e esta chave é salva pelo sistema que realizou o login para então ser usada na realização das requisições permitindo a interação com os dados. Uma vez que a reserva é realizada no &lt;em&gt;frontend&lt;/em&gt;, validada pela API e então salva no banco de dados, dá-se início a última parte de interação do sistema.&lt;/p&gt;

&lt;p&gt;Uma vez que o usuário realizou uma reserva, ele terá acesso ao espaço reservado durante o período solicitado, e somente durante aquele período. Esta regra é o cerne da questão aqui. Este sistema foi pensado para que os usuários tenham a devida privacidade, e estejam assegurados sobre a disponibilidade daquele recurso. De posse da senha, informada pelo próprio usuário no momento em que se realizou a reserva, o usuário deverá utilizar o &lt;em&gt;bot&lt;/em&gt; disponível para poder adentrar ao espaço, é ele o responsável por comandar o dispositivo físico, liberando ou não a fechadura. &lt;/p&gt;

&lt;p&gt;O &lt;em&gt;bot&lt;/em&gt; foi desenvolvido com o intuito de possibilitar uma interface amigável aos usuários, nas figuras 6 e 7 é mostrado como essa interação ocorre. Ao enviar um comando para iniciar o &lt;em&gt;bot&lt;/em&gt;, o usuário recebe uma mensagem de boas vindas informando como o mesmo funciona, nesta mensagem é dito ao usuário que para que ele acesse o espaço reservado, basta enviar a senha do horário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwy7138wo1d1mdbe1z3vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwy7138wo1d1mdbe1z3vn.png" alt="Figura 6 - Bot: mensagens informativas" width="432" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv4wmj8srvd91p10gpepm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv4wmj8srvd91p10gpepm.png" alt="Figura 7 - Bot: envio de mensagens" width="369" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao enviar a senha, o &lt;em&gt;bot&lt;/em&gt; irá valida-la junto a API do nosso sistema, sendo a senha válida, o &lt;em&gt;bot&lt;/em&gt; irá realizar uma requisição para que a fechadura seja aberta, em caso contrário, o &lt;em&gt;bot&lt;/em&gt; irá fechar manter o espaço bloqueado ao acesso. A fechadura do presente modelo foi constituída de modo a permitir interações vias requisições HTTP. Além das interações via rede, foi pensado na necessidade de liberação do espaço, de dentro para fora, de uma maneira física, com isso em mente foi colocado um botão capaz de controlar a fechadura.&lt;/p&gt;

&lt;p&gt;Na figura 8, é possível observar as partes físicas utilizadas na construção da fechadura.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8h2v360rs4ke78pzpzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8h2v360rs4ke78pzpzp.png" alt="Figura 8 - Fechadura" width="512" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para alcançar o objetivo principal desta empreitada, foi necessário delimitar o escopo de possibilidades e determinar as regras de uso para o sistema. Evitando o planejamento excessivo, e a perda de tempo com problemas que podiam ou não serem reais, deu-se início ao desenvolvimento do sistema &lt;em&gt;web&lt;/em&gt; utilizando a combinação de tecnologias com maior domínio, em especial destaca-se o &lt;em&gt;Flask&lt;/em&gt;. Foi este &lt;em&gt;microframework&lt;/em&gt; que possibilitou construir essa primeira versão. Neste primeiro momento, enquanto se entendia o problema, estas tecnologias ofereceram exatamente o que era necessário, um ambiente de desenvolvimento rápido, facilmente integrado e com uma curva de aprendizado que favorecia os objetivos deste projeto. De posse do conhecimento necessário a cerca do problema, conhecendo os pormenores, foi possível analisar de maneira qualitativa as ferramentas que tínhamos para desenvolver a solução. Com base nos primeiros experimentos, notou-se alguns problemas, entre eles destacam-se a dificuldade de manutenção do código e o tempo de latência entre as requisições. Para que o objetivo fosse alcançado de maneira minimamente satisfatória, foi necessário rever as tecnologias.&lt;/p&gt;

&lt;p&gt;Falando um pouco dessas escolhas, é de interesse destacar que não há aqui um juízo de valor sobre a eficácia geral dessas ferramentas. Este trabalho não se propõe a encontrar a tecnologia perfeita, atendo-se tão somente a busca da ferramenta mais adequada aos requisitos do modelo e prévios conhecimentos daqueles que o realizaram. Ao observar os requisitos e regras do nosso modelo, percebeu-se que a forma mais prática e assertiva, no momento, de implementar a solução era tendo como base o fluxo de comunicação acima apresentado e portanto dá-se início a última etapa de desenvolvimento.&lt;/p&gt;

&lt;p&gt;Para escolha das tecnologias finais deste trabalho, era necessário levar em consideração a capacidade de acesso aos dados, a modelagem de dados, tempo de desenvolvimento e o conhecimento necessário para que todos os outros aspectos fossem atendidos.&lt;/p&gt;

&lt;p&gt;Desta forma, o &lt;em&gt;framework&lt;/em&gt; escolhido para desempenhar o papel de &lt;em&gt;frontend&lt;/em&gt; foi o Angular, devido a sua alta organização de pastas, que favorece o desenvolvimento da aplicação de maneira limpa e clara, além disso, os recursos disponíveis como requisições&lt;/p&gt;

&lt;p&gt;HTTP e autorização de rotas foram fundamentais para a agilidade na codificação do projeto. O &lt;em&gt;backend&lt;/em&gt; por sua vez, possuía necessidades singulares a cerca do acesso dos dados e nesse quesito a plataforma .NET, em especial o ASP.NET, atendia de maneira impactante o que se era esperado. Isso se deve principalmente as possibilidades de manipulação dos dados dentro da linguagem C Sharp, aliado ao uso do &lt;em&gt;Entity Framework Core&lt;/em&gt; (um mapeador de banco de dados de objeto para .NET) que disponibiliza todo o acesso aos dados diretamente via código C Sharp, sem a necessidade de implementações de consultas SQL por parte do programador.&lt;/p&gt;

&lt;p&gt;No que tange a construção da fechadura o pensamento inicial era a inserção direta do &lt;em&gt;bot&lt;/em&gt; Telegram em uma &lt;em&gt;raspberry&lt;/em&gt; para que o controle da fechadura fosse feita diretamente por ele, sem a necessidade de requisições HTTP, contudo, devido ao alto preço dessas placas, e aliado a uma busca por desenvolver o modelo com o mínimo necessário, optou-se por outra abordagem. Ao separar o &lt;em&gt;bot&lt;/em&gt; Telegram da fechadura, foi possível utilizar o ESP-32 como cérebro da fechadura, o que barateou significativamente a construção do modelo. O &lt;em&gt;bot&lt;/em&gt; Telegram foi desenvolvido utilizando &lt;em&gt;Python&lt;/em&gt; , principal tecnologia utilizada para este fim, que já disponibilizava interfaces para acesso a API do Telegram, facilitando o desenvolvimento do nosso &lt;em&gt;bot&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7 Conclusão e Trabalhos futuros
&lt;/h2&gt;

&lt;p&gt;Ao findar este trabalho, nota-se que foi possível desenvolver um protótipo de sistema de reservas prático e funcional a usuários, com custo baixo e que beneficiaria toda comunidade que compartilha espaços, proporcionando um ambiente mais saudável e operacional. Com um olhar mais voltado a tecnicidade do mesmo, é perceptível que as escolhas tecnológicas feitas foram assertivas, sendo elas capazes de desempenhar o esperado, com qualidade e foco na experiência do usuário. Além do mais, os aspectos de familiaridade das tecnologias escolhidas foram decisivos para a escolha, visando um desenvolvimento ágil e eficiente do uso do tempo. Por inviabilidade operacional, não foi possível a instalação da fechadura nas dependências do Instituto Federal Fluminense &lt;em&gt;campus&lt;/em&gt; Macaé, este revés, no entanto, não foi determinante na condução deste trabalho uma vez que o mesmo serviu de inspiração mas o presente trabalho não se limita a ele.&lt;/p&gt;

&lt;p&gt;Como fruto de tudo que foi observado, algumas demandas para futuros trabalhos são levantadas. A primeira dessas demandas é a instalação do sistema para observação de seu desempenho e impactos no dia-a-dia, buscando identificar possíveis melhorias. Outro ponto é o estudo acerca da melhor maneira de disponibilizar esse sistema aos usuários, como por exemplo, o estudo sobre o uso de computação em nuvem em contraponto a servidores físicos. Não menos importante,destacam-se as necessidades de pesquisa acerca da demanda por esse produto, ou seja, ouvir possíveis consumidores e usuários afim de estabelecer o real impacto deste sistema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;ANDRADE, A. P. de. &lt;em&gt;O que é Flask?&lt;/em&gt; 2020. Disponível em: &lt;a href="https://www.treinaweb.com.br/blog/o-que-e-flask" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BRANAS, R. &lt;em&gt;AngularJS essentials: Design and construct reusable, maintainable, and modularweb applications with AngularJS&lt;/em&gt;. 1. ed. Birmingham,United Kingdom: Packt Publishing, 2014. Disponível em: &lt;a href="https://books.google.com.br/books?hl=pt-BR&amp;amp;lr=&amp;amp;id=qYtlDwAAQBAJ&amp;amp;oi=fnd&amp;amp;pg=PA1&amp;amp;dq=internet+das+coisas&amp;amp;ots=rgSvBwh959&amp;amp;sig=ZaOg-dOO_botZ4fIpLQPBSYECiE#v=onepage&amp;amp;q=internet%20das%20coisas&amp;amp;f=false" rel="noopener noreferrer"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;COMER, D. E. &lt;em&gt;Interligação de redes com TCP/IP&lt;/em&gt;. 6. ed. Rio de Janeiro: Elsevier, 2015 Disponível em: &lt;a href="https://books.google.com.br/books?hl=pt-BR&amp;amp;lr=&amp;amp;id=F1_jBwAAQBAJ&amp;amp;oi=fnd&amp;amp;pg=PT5&amp;amp;dq=modelo+TCP/IP&amp;amp;ots=k0rfRnwcJy&amp;amp;sig=14ySYGiYFzATRq9OQJniYxTRNiY#v=onepage&amp;amp;q=modelo%20TCP%2FIP&amp;amp;f=false" rel="noopener noreferrer"&gt;.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;CUNHA, F. &lt;em&gt;Sistema Web: o que é e como funciona?&lt;/em&gt; 2022. Disponível em: [&lt;a href="https://mestresdaweb.com.br/tecnologias/sistema-web-o-que-e-e-como-funciona/" rel="noopener noreferrer"&gt;https://mestresdaweb.com.br/tecnologias/sistema-web-o-que-e-e-como-funciona/&lt;/a&gt;.](&lt;a href="https://mestresdaweb.com.br/tecnologias/sistema-web-o-que-e-e-como-funciona/" rel="noopener noreferrer"&gt;https://mestresdaweb.com.br/tecnologias/sistema-web-o-que-e-e-como-funciona/&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;FILIPEFLOP. &lt;em&gt;Placa Uno R3 + Cabo USB para Arduino.&lt;/em&gt; 2017. [2022]. 1 fotografia. Disponível em: [&lt;a href="https://www.filipeflop.com/produto/placa-uno-r3-cabo-usb-para-arduino/" rel="noopener noreferrer"&gt;https://www.filipeflop.com/produto/placa-uno-r3-cabo-usb-para-arduino/&lt;/a&gt;.](&lt;a href="https://www.filipeflop.com/produto/placa-uno-r3-cabo-usb-para-arduino/" rel="noopener noreferrer"&gt;https://www.filipeflop.com/produto/placa-uno-r3-cabo-usb-para-arduino/&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;FONTES, E. &lt;em&gt;Segurança da informação: o usuário faz a diferença&lt;/em&gt;. 1. ed. São Paulo - SP: Saraiva, 2006. &lt;/p&gt;

&lt;p&gt;GOUVEIA, F. &lt;em&gt;Fechaduras digitais: como funcionam e por que usá-las?&lt;/em&gt; LinkedIn: Fahim Gouveia, 2017. Disponível em: &lt;a href="https://www.linkedin.com/pulse/fechaduras-digitais-como-funcionam-e-por-que-us%C3%A1-las-fahim-gouveia/" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GUEDES, M. &lt;em&gt;O que é o Angular e para que serve?&lt;/em&gt; 2020. Disponível em:[&lt;a href="https://www.treinaweb.com.br/blog/o-que-e-o-angular-e-para-que-serve" rel="noopener noreferrer"&gt;https://www.treinaweb.com.br/blog/o-que-e-o-angular-e-para-que-serve&lt;/a&gt;](&lt;a href="https://www.treinaweb.com.br/blog/o-que-e-o-angular-e-para-que-serve" rel="noopener noreferrer"&gt;https://www.treinaweb.com.br/blog/o-que-e-o-angular-e-para-que-serve&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;HOUSE, C. &lt;em&gt;Angular 2 versus React: There Will Be Blood&lt;/em&gt;. 2016. Disponível em: &lt;a href="https://www.freecodecamp.org/news/angular-2-versus-react-there-will-be-blood-66595faafd51" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;KUROSE, J. F.; ROSS, K. W. &lt;em&gt;Redes de Computadores e a internet: Uma abordagem top-down&lt;/em&gt;. 3. ed. São Paulo, SP: Editora Pearson, 2006.&lt;/p&gt;

&lt;p&gt;MAGRANI, E. &lt;em&gt;Internet das coisas&lt;/em&gt;. 1. ed. Rio de Janeiro,Brasil: FGV EDITORA, 2018. Disponível em: &lt;a href="https://books.google.com.br/books?hl=pt-BR&amp;amp;lr=&amp;amp;id=qYtlDwAAQBAJ&amp;amp;oi=fnd&amp;amp;pg=PA1&amp;amp;dq=internet+das+coisas&amp;amp;ots=rgSvBwh959&amp;amp;sig=ZaOg-dOO_botZ4fIpLQPBSYECiE#v=onepage&amp;amp;q=internet%20das%20coisas&amp;amp;f=false" rel="noopener noreferrer"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MCROBERTS, M. &lt;em&gt;Arduino Basico&lt;/em&gt;. 2. ed. Sao Paulo, Brasil: Novatec Editora Ltda., 2015. Disponível em: &lt;a href="https://www.google.com.br/books/edition/Arduino_B%C3%A1sico/kfZyDwAAQBAJ?hl=pt-BR&amp;amp;gbpv=1" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meta Platforms. &lt;em&gt;React - uma biblioteca javascript para criar interfaces de usuário&lt;/em&gt;. 2022. Disponível em: [&lt;a href="https://pt-br.reactjs.org/" rel="noopener noreferrer"&gt;https://pt-br.reactjs.org/&lt;/a&gt;](&lt;a href="https://pt-br.reactjs.org/" rel="noopener noreferrer"&gt;https://pt-br.reactjs.org/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;OLIVEIRA, C. L. V.; ZANETTI, H. A. P.; NABARRO, C. B. M. &lt;em&gt;Raspberry PI descomplicado&lt;/em&gt;. 1. ed. São Paulo - SP: Saraiva Educação, 2018.&lt;/p&gt;

&lt;p&gt;PADO. &lt;em&gt;Fechadura Digital de Sobrepor com Cartão RFID FDS-50.&lt;/em&gt; 2020. [2022]. 1 fotografia. Disponível em: &lt;a href="https://www.lojapado.com.br/-fechadura-eletrica-digital-cartao-rfid-sobrepor-/p" rel="noopener noreferrer"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ROTH, D.; ANDERSON, R.; LUTTIN, S. &lt;em&gt;Visão geral do ASP.NET Core&lt;/em&gt;. [S.l.], 2022. Disponível em: &lt;a href="https://docs.microsoft.com/pt-br/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-6.0" rel="noopener noreferrer"&gt;.&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;USINAINFO. &lt;em&gt;ESP32&lt;/em&gt;. 2022. Disponível em: &lt;a href="https://www.usinainfo.com.br/esp32-611#:~:text=O%20ESP32%20%C3%A9%20um%20pequeno,destaca%2Dse%20dentre%20tantos%20outros." rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WEBER, R. H. &lt;em&gt;Internet of Things: Legal Perspectives&lt;/em&gt;. 2010th. ed. Berlin,Heidelberg: Springer, 2010. Disponível em: &lt;a href="https://link.springer.com/chapter/10.1007/978-3-642-11710-7_1" rel="noopener noreferrer"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WIKIPEDIA. &lt;em&gt;RaspberryP.&lt;/em&gt; 2019. [2022]. 1 fotografia. Disponível em: [&lt;a href="https://pt.wikipedia.org/wiki/RaspberryP" rel="noopener noreferrer"&gt;https://pt.wikipedia.org/wiki/RaspberryP&lt;/a&gt;.](&lt;a href="https://pt.wikipedia.org/wiki/RaspberryP" rel="noopener noreferrer"&gt;https://pt.wikipedia.org/wiki/RaspberryP&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;WITTEL. &lt;em&gt;Robôs de autoatendimento: conheça o potencial dos bots&lt;/em&gt;. Blog Wittel, 2017. Disponível em: &lt;a href="https://blog.wittel.com/robos-de-autoatendimento-conheca-o-potencial-dos-bots/" rel="noopener noreferrer"&gt;.&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Repositórios
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/Moises_WebApp.git" rel="noopener noreferrer"&gt;https://github.com/nicolas-souza/Moises_WebApp.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/Moises_Api" rel="noopener noreferrer"&gt;https://github.com/nicolas-souza/Moises_Api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/Moises_bot" rel="noopener noreferrer"&gt;https://github.com/nicolas-souza/Moises_bot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/nicolas-souza/Moises_fechadura" rel="noopener noreferrer"&gt;https://github.com/nicolas-souza/Moises_fechadura&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
  </channel>
</rss>
