<?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>Forem: Manu Coutinho</title>
    <description>The latest articles on Forem by Manu Coutinho (@manucoutinho).</description>
    <link>https://forem.com/manucoutinho</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%2F727695%2F657046d5-0da4-4fff-a8f8-3943e3abaf79.png</url>
      <title>Forem: Manu Coutinho</title>
      <link>https://forem.com/manucoutinho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/manucoutinho"/>
    <language>en</language>
    <item>
      <title>Funções Lambda em Java</title>
      <dc:creator>Manu Coutinho</dc:creator>
      <pubDate>Mon, 03 Feb 2025 22:09:28 +0000</pubDate>
      <link>https://forem.com/manucoutinho/funcoes-lambda-em-java-44n</link>
      <guid>https://forem.com/manucoutinho/funcoes-lambda-em-java-44n</guid>
      <description>&lt;p&gt;Você sabia que as funções lambda foram introduzidas na linguagem Java  na versão 8 ? Pois é! Faz tempo, pois atualmente estamos na versão 23 da linguagem.&lt;/p&gt;

&lt;p&gt;A introdução das funções lambdas representou um marco significativo na evolução do ecossistema Java. &lt;/p&gt;

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

&lt;p&gt;Neste artigo vamos explorar a evolução cronológica desta feature, suas aplicações, vantagens, limitações e os cenários ideais para o seu uso. &lt;/p&gt;

&lt;p&gt;A análise visa oferecer uma compreensão base sobre como essas construções impactam a produtividade e a manutenção do código. E sem dúvida, ao fim, você vai estar prontinha(o) para sair aplicando no seu projeto Java.&lt;/p&gt;

&lt;p&gt;Historicamente, Java se destacou como uma linguagem orientada a objetos (OO) com sintaxe verbosa. No entanto, com a crescente popularidade de paradigmas funcionais, tornou-se evidente a necessidade de recursos que permitissem expressar operações em um estilo mais conciso e declarativo, ou se preferir, de um modo direto. &lt;/p&gt;

&lt;p&gt;Desta forma as funções lambda ganharam popularidade  como uma solução capaz de simplificar códigos que manipulam coleções e fluxos de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Antes do Java 8
&lt;/h3&gt;

&lt;p&gt;Antes da introdução das funções lambda, Java dependia fortemente de classes anônimas para implementar interfaces funcionais. Esse método era prolixo e tornava o código menos legível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nomes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bruno"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Collections&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nomes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Comparator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Chegada do Java 8 e a introdução das funções Lambda
&lt;/h3&gt;

&lt;p&gt;A partir do Java 8, o suporte para funções lambda e a inclusão da API de Streams transformaram o paradigma de desenvolvimento, permitindo uma abordagem mais concisa e legível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nomes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bruno"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;nomes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compareTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Versões subsequentes de Java continuaram aprimorando a integração funcional, incluindo melhorias nas APIs de coleções e suporte à inferência de tipos, tornando a sintaxe ainda mais limpa e eficiente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usabilidade
&lt;/h2&gt;

&lt;p&gt;Funções lambda são amplamente utilizadas em:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manipulação de coleções com Streams.&lt;/li&gt;
&lt;li&gt;Implementação de eventos e callbacks.&lt;/li&gt;
&lt;li&gt;Expressões em APIs funcionais personalizadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A API &lt;code&gt;java.util.function&lt;/code&gt; fornece interfaces funcionais como &lt;code&gt;Function&lt;/code&gt;, &lt;code&gt;Predicate&lt;/code&gt;, &lt;code&gt;Supplier&lt;/code&gt;, entre outras, que facilitam a criação e manipulação de funções lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivos para usar funções Lambda
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Redução da verbosidade
&lt;/h3&gt;

&lt;p&gt;As funções lambda reduzem a necessidade de boilerplate code, tornando o código mais claro e direto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Melhor leitura e manutenção
&lt;/h3&gt;

&lt;p&gt;A sintaxe concisa das lambdas facilita a compreensão rápida das lógicas implementadas, melhorando a manutenção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paradigma funcional
&lt;/h3&gt;

&lt;p&gt;Permitem a adoção de práticas funcionais, como imutabilidade e composição de funções.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivos para não usar funções Lambda
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Complexidade desnecessária
&lt;/h3&gt;

&lt;p&gt;Em cenários onde a simplicidade é crucial, como pequenos projetos ou códigos com baixa necessidade de manutenção, a introdução de lambdas pode ser excessiva.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debug mais complexo
&lt;/h3&gt;

&lt;p&gt;O uso extensivo de funções lambda pode dificultar o debug, pois os pontos de entrada podem se tornar menos evidentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Difícil compreensão para os “juninhos”
&lt;/h3&gt;

&lt;p&gt;Desenvolvedores iniciantes podem encontrar dificuldades para entender códigos fortemente baseados em lambdas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Processamento de Coleções
&lt;/h3&gt;

&lt;p&gt;Funções lambda simplificam operações complexas em listas, como filtragem, mapeamento e redução:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nomes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Bruno"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;filtrados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nomes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
                              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Eventos e Callbacks
&lt;/h3&gt;

&lt;p&gt;O uso de lambdas em interfaces gráficas permite a implementação direta de eventos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOnAction&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Botão clicado!"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  APIs funcionais personalizadas
&lt;/h3&gt;

&lt;p&gt;Em sistemas orientados a microserviços, lambdas ajudam a criar interfaces flexíveis e expressivas.&lt;/p&gt;

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

&lt;p&gt;Diante de toda essa informação, fica claro que as funções lambda trouxeram um paradigma poderoso ao ecossistema Java, permitindo soluções mais concisas, funcionais e ao meu ver, leve. &lt;/p&gt;

&lt;p&gt;Mesmo apresentando limitações em alguns contextos, seu uso pode transformar significativamente a manutenção e a legibilidade do código. &lt;/p&gt;

&lt;p&gt;Mas claro, como em qualquer outro caso em desenvolvimento, o equilíbrio na hora de aplicar dentro do seu código fica na mão do desenvolvedor.&lt;/p&gt;

&lt;p&gt;Espero ter ajudado 👋🏽&lt;/p&gt;

</description>
      <category>java</category>
      <category>braziliandevs</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Normalização dos Bancos de Dados Relacionais (Handbook)</title>
      <dc:creator>Manu Coutinho</dc:creator>
      <pubDate>Mon, 06 Jan 2025 18:51:58 +0000</pubDate>
      <link>https://forem.com/manucoutinho/normalizacao-dos-bancos-de-dados-relacionais-handbook-3fg</link>
      <guid>https://forem.com/manucoutinho/normalizacao-dos-bancos-de-dados-relacionais-handbook-3fg</guid>
      <description>&lt;p&gt;Você já ouviu falar nas  &lt;strong&gt;5 Regras de Normalização dos Bancos de Dados Relacionais?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;A normalização de bancos de dados é um processo sistemático que organiza os dados de forma a minimizar redundâncias e melhorar a integridade dos dados. Esse processo segue um conjunto de regras conhecidas como formas normais, desenvolvidas por &lt;a href="https://en.wikipedia.org/wiki/Edgar_F._Codd" rel="noopener noreferrer"&gt;Edgar F. Codd&lt;/a&gt;, o criador do modelo relacional. &lt;/p&gt;

&lt;p&gt;Mas você deve estar se perguntando o por quê devemos utilizar tais regras  em nos banco de dados.&lt;/p&gt;

&lt;p&gt;Então te dou 5 bons motivos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Redução de Redundâncias:&lt;/strong&gt; Evita a repetição desnecessária de dados e consequentemente otimiza o espaço de armazenamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eliminação de Anomalias:&lt;/strong&gt; Minimiza inconsistências em inserções, atualizações e deleções.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melhor Manutenção:&lt;/strong&gt; Torna o banco de dados mais fácil de atualizar e escalar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eficiência de Armazenamento:&lt;/strong&gt; Reduz o uso de espaço, armazenando dados de forma mais compacta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integridade dos Dados:&lt;/strong&gt; Garante a consistência e precisão das informações.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A normalização é um processo essencial, especialmente em projetos onde a integridade e o desempenho do banco de dados são fundamentais. Cá entre nós, esses atributos são fundamentais em qualquer projeto.&lt;/p&gt;

&lt;p&gt;Neste artigo, explicaremos as cinco primeiras formas normais, acompanhadas de exemplos práticos.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;1ª Forma Normal (1FN)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A primeira forma normal exige que uma tabela:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tenha colunas atômicas (ou indivisíveis).&lt;/li&gt;
&lt;li&gt;Não contenha grupos repetidos ou colunas que armazenem listas de valores.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Considere a tabela abaixo:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_cliente&lt;/th&gt;
&lt;th&gt;nome&lt;/th&gt;
&lt;th&gt;telefones&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;João Silva&lt;/td&gt;
&lt;td&gt;1234, 5678&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Maria Santos&lt;/td&gt;
&lt;td&gt;9876&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A coluna "telefones" viola a 1FN porque armazena múltiplos valores em uma única célula. Para corrigir, dividimos os dados:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_cliente&lt;/th&gt;
&lt;th&gt;nome&lt;/th&gt;
&lt;th&gt;telefone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;João Silva&lt;/td&gt;
&lt;td&gt;1234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;João Silva&lt;/td&gt;
&lt;td&gt;5678&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Maria Santos&lt;/td&gt;
&lt;td&gt;9876&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Em suma, a primeira forma visa eliminar dados repetidos, garantindo que cada coluna contenha apenas valores indivisíveis e que cada linha seja única.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2ª Forma Normal (2FN)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A segunda forma normal requer que a tabela:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esteja na 1FN.&lt;/li&gt;
&lt;li&gt;Não contenha dependências parciais, ou seja, cada atributo não-chave deve depender da chave primária inteira.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Considere uma tabela que armazena informações de pedidos:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_pedido&lt;/th&gt;
&lt;th&gt;id_produto&lt;/th&gt;
&lt;th&gt;nome_produto&lt;/th&gt;
&lt;th&gt;quantidade&lt;/th&gt;
&lt;th&gt;preco_unitario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A1&lt;/td&gt;
&lt;td&gt;Caneta&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A2&lt;/td&gt;
&lt;td&gt;Caderno&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;10.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aqui, "nome_produto" e "preco_unitario" dependem apenas de "id_produto", não de "id_pedido". Para corrigir, dividimos a tabela em duas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabela Pedidos:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_pedido&lt;/th&gt;
&lt;th&gt;id_produto&lt;/th&gt;
&lt;th&gt;quantidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A1&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;A2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tabela Produtos:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_produto&lt;/th&gt;
&lt;th&gt;nome_produto&lt;/th&gt;
&lt;th&gt;preco_unitario&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A1&lt;/td&gt;
&lt;td&gt;Caneta&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A2&lt;/td&gt;
&lt;td&gt;Caderno&lt;/td&gt;
&lt;td&gt;10.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Com a remoção das dependências parciais, garantimos que todos os atributos não-chave (secundários), dependam apenas da key ou chave, evitando redundância associadas às dependências parciais.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3ª Forma Normal (3FN)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A terceira forma normal requer que a tabela:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esteja na 2FN.&lt;/li&gt;
&lt;li&gt;Não contenha dependências transitivas, ou seja, nenhum atributo não-chave deve depender de outro atributo não-chave.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Considere uma tabela de vendas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_venda&lt;/th&gt;
&lt;th&gt;id_cliente&lt;/th&gt;
&lt;th&gt;nome_cliente&lt;/th&gt;
&lt;th&gt;cidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;João Silva&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Maria Santos&lt;/td&gt;
&lt;td&gt;Rio de Janeiro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aqui, "nome_cliente" e "cidade" dependem de "id_cliente", não de "id_venda". Para corrigir, dividimos em duas tabelas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabela Vendas:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_venda&lt;/th&gt;
&lt;th&gt;id_cliente&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tabela Clientes:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_cliente&lt;/th&gt;
&lt;th&gt;nome_cliente&lt;/th&gt;
&lt;th&gt;cidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;João Silva&lt;/td&gt;
&lt;td&gt;São Paulo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Maria Santos&lt;/td&gt;
&lt;td&gt;Rio de Janeiro&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A remoção das dependências transitivas visa minimizar ainda mais as redundâncias, tornando as tabelas mais simples de compreender e manter.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;4ª Forma Normal (4FN)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A quarta forma normal trata das dependências multivaloradas. Ela exige que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esteja na 3FN.&lt;/li&gt;
&lt;li&gt;Não existam dependências multivaloradas, ou seja, cada fato independente deve estar representado em sua própria tabela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Considere uma tabela que armazena habilidades de empregados e idiomas falados:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_empregado&lt;/th&gt;
&lt;th&gt;habilidade&lt;/th&gt;
&lt;th&gt;idioma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Programar&lt;/td&gt;
&lt;td&gt;Inglês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Programar&lt;/td&gt;
&lt;td&gt;Espanhol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;Inglês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;Espanhol&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aqui, habilidades e idiomas são informações independentes. Para corrigir, dividimos em duas tabelas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tabela Habilidades:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_empregado&lt;/th&gt;
&lt;th&gt;habilidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Programar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tabela Idiomas:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_empregado&lt;/th&gt;
&lt;th&gt;idioma&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Inglês&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Espanhol&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Implementando a quarta forma, evitamos combinações redundantes de dados e organizamos as tabelas com relacionamentos complexos de forma objetiva.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;5ª Forma Normal (5FN)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A quinta forma normal, também conhecida como forma normal de projeção e junção, exige que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esteja na 4FN.&lt;/li&gt;
&lt;li&gt;Nenhum dado possa ser reconstruído a partir de tabelas menores de forma que a divisão cause perda de informação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt; Considere uma tabela de fornecedores, produtos e clientes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id_fornecedor&lt;/th&gt;
&lt;th&gt;id_produto&lt;/th&gt;
&lt;th&gt;id_cliente&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;F1&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;C1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F1&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;C2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F2&lt;/td&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;C1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Se houver uma relação direta entre fornecedores, produtos e clientes, dividir essas informações em tabelas menores pode gerar perda de dados. A 5FN assegura que todos os dados só sejam separados se cada fato puder ser representado independentemente sem ambiguidade. A quinta forma assegura que os dados sejam armazenados de forma modular e que todas as suas dependências sejam explícitas.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusão&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A normalização melhora a organização dos dados e a integridade do banco, embora possa aumentar a complexidade das consultas. O uso adequado depende do contexto e do equilíbrio entre desempenho e consistência.&lt;/p&gt;

&lt;p&gt;Agora que você já conhece as 5FN e seus benefícios, que tal implementá-las?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Referências:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Codd, E. F. "A Relational Model of Data for Large Shared Data Banks" (1970).&lt;/li&gt;
&lt;li&gt;Silberschatz, A., Korth, H., &amp;amp; Sudarshan, S. "Database System Concepts".&lt;/li&gt;
&lt;li&gt;Date, C. J. "An Introduction to Database Systems".&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>braziliandevs</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Tipos de arquitetura de API</title>
      <dc:creator>Manu Coutinho</dc:creator>
      <pubDate>Fri, 21 Apr 2023 16:29:43 +0000</pubDate>
      <link>https://forem.com/manucoutinho/tipos-de-arquitetura-de-api-463b</link>
      <guid>https://forem.com/manucoutinho/tipos-de-arquitetura-de-api-463b</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;API é um acrônimo para &lt;em&gt;Application Programming Interfaces&lt;/em&gt;, que em tradução livre quer dizer: “Interface de Programação de Aplicações/Aplicativos”.&lt;/p&gt;

&lt;p&gt;Na prática, são construções de programação que permitem a desenvolvedores criar funcionalidades mais complexas contendo abstração de código, de forma que seja simples sua utilização.&lt;/p&gt;

&lt;p&gt;No dia a dia do desenvolvimento de software as APIs entram em cena quando um aplicativo precisa se conectar a outro aplicativo. Mas como?&lt;/p&gt;

&lt;p&gt;Tudo começa quando uma aplicação, seja ela front-end ou back-end, inicia uma interação com outra aplicação por meio de uma requisição. Após a recepção dessa requisição, dentro dos parâmetros pré-estabelecidos, a aplicação receptora, realiza a rotina prevista e entrega o dado solicitado por meio de uma resposta.&lt;/p&gt;

&lt;p&gt;A MDN¹ em sua documentação traz uma analogia que nos ajuda a desmistificar esse processo: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;”Pense no seguinte exemplo: o uso de energia elétrica em sua casa ou apartamento. Quando você deseja utilizar um eletrodoméstico, você precisa somente ligar o aparelho na tomada. Não é preciso conectar diretamente o fio do aparelho diretamente na caixa de luz. Isso seria, além de muito ineficiente, difícil e perigoso de ser feito (caso você não seja eletricista).”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nesta analogia a tomada e o plug seriam as APIs que se conectam e, transmitem o dado solicitado: a energia elétrica.&lt;/p&gt;

&lt;p&gt;Todo esse processo é chamado de transação de API, que pode ocorrer com ou sem acesso a Web. Pois nem todas as APIs são Web APIs. &lt;/p&gt;

&lt;p&gt;Tanto as requisições como as respostas podem assumir diversos formatos, à depender da arquitetura e tipo de API, conforme veremos a seguir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de API
&lt;/h3&gt;

&lt;p&gt;Existem várias formas de categorizar as APIs, a maneira geralmente utilizada é baseada no escopo de uso pretentido. Em se tratando de escopo, podemos dividir em quatro principais tipos de APIs, que são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API Aberta/pública (Open/public)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como o nome bem sugere uma API Pública está publicada e documentada publicamente, podendo ser acessada por quem tiver o interesse de fazê-lo. Em alguns casos é necessário o uso de alguma chave de autenticação e ou cabeçalho específico, quais estarão na documentação da mesma. Exigindo assim, pouco ou nenhum gerenciamento de identidade. São exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nasa - &lt;a href="https://api.nasa.gov/" rel="noopener noreferrer"&gt;https://api.nasa.gov/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AccuWeather - &lt;a href="https://developer.accuweather.com/" rel="noopener noreferrer"&gt;https://developer.accuweather.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Correios - &lt;a href="https://cws.correios.com.br/ajuda" rel="noopener noreferrer"&gt;https://cws.correios.com.br/ajuda&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;API de Parceiro (Partner)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este tipo de API é baseado em licença usada para facilitar a comunicação entre aplicativos em nível B2B (&lt;em&gt;business to business&lt;/em&gt;). API de parceiro destina-se ao uso por parceiros de negócios pagantes para facilitar a comunicação entre vários aplicativos corporativos. Como as APIs de parceiros exigem mecanismos de autorização, mecanismos de autenticação e medidas gerais de segurança mais fortes, elas são muito mais seguras do que as APIs públicas.&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;API Privada (Private)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este tipo também pode ser chamado de API interna, pois é hospedada na infraestrutura interna de um negócio/empresa, estando disponível apenas aos desenvolvedores envolvidos na aplicação e uso da mesma, mediante as regras de acesso existentes. O nível de segurança e arquitetura adotada dependerão da postura do negócio.&lt;/p&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;API Composta (Composite)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma API composta combina sequencialmente solicitações de API em uma única chamada de API. As APIs compostas permitem que os clientes usem o encadeamento de chamadas para fazer várias chamadas de API e receber uma resposta em vez de várias respostas. Geralmente útil para velocidade e eficiência ao fazer chamadas de API complexas entre cliente e servidor.&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tipos/Padrões de Arquitetura
&lt;/h3&gt;

&lt;p&gt;Além de se categorizar por tipos, as APIs distinguem-se quanto ao estilo/arquitetura adotado na sua construção. Tal taxonomia geralmente se baseia no protocolo de comunicação adotado. A seguir falarei dos tipos mais populares, quando se trata de web API (API criada para comunicação web)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt;&lt;br&gt;
    1. Segue 6 restrições de arquitetura&lt;br&gt;
    2. Pode usar JSON, XML, HTML ou Plain Text&lt;br&gt;
    3. Flexível, leve e escalável&lt;br&gt;
    4. Formato mais utilizado na web&lt;br&gt;
    5. Utiliza HTTP como protocolo&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%2F14olvcwixpsunlskjyf5.jpeg" 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%2F14olvcwixpsunlskjyf5.jpeg" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;br&gt;
    REST é sem dúvida um dos padrões mais populares no desenvolvimento voltado para web. REST significa &lt;em&gt;Representational State Transfer (Transferência de Estado Representacional).&lt;/em&gt; As Aplicações que utilizam esse padrão de arquitetura são comumente denominadas RESTful. REST é um conjunto de definições arquitetônicas e, não um protocolo ou padrão, podendo ser implementadas de várias maneiras.&lt;br&gt;
    Quando uma solicitação do cliente é feita por meio de uma API RESTful, ela transfere uma representação do estado do recurso para o solicitante ou terminal. Essas informações ou representações são entregues em um dos vários formatos via HTTP: JSON (notação de objeto Javascript), HTML, XLT, Python, PHP ou texto sem formatação. O JSON é o formato de arquivo mais popular para usar, porque, apesar do nome, é um diagnóstico de linguagem e legível por humanos e máquinas.&lt;br&gt;&lt;br&gt;
    Outra coisa a ter em mente: os cabeçalhos e parâmetros também são importantes nos métodos HTTP de uma solicitação HTTP da API RESTful, pois contêm informações importantes sobre o identificador dos metadados da solicitação, autorização, identificador uniforme de recursos (URI), cache, cookies e mais. Existem cabeçalhos de solicitação e cabeçalhos de resposta, cada um com suas próprias informações de conexão HTTP e códigos de status.²&lt;br&gt;
Para que uma API possa ser considerada RESTful, deve seguir os seguintes critérios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uma arquitetura cliente-servidor composta por clientes, servidores e recursos, com solicitações gerenciadas por HTTP;&lt;/li&gt;
&lt;li&gt;Comunicação apátrida cliente-servidor, o que significa que nenhuma informação do cliente é armazenada entre as solicitações de obtenção e cada solicitação é separada e desconectada;&lt;/li&gt;
&lt;li&gt;Dados cacheados, que simplificam as interações cliente-servidor;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uma interface uniforme entre componentes para que as informações sejam transferidas de forma padrão. Isso requer que:&lt;br&gt;
    - os recursos solicitados são identificáveis e separados das representações enviadas ao cliente.&lt;br&gt;
    - os recursos podem ser manipulados pelo cliente através da representação que recebem, porque a representação contém informações suficientes para fazê-lo.&lt;br&gt;
    - as mensagens auto-descritivas retornadas ao cliente têm informações suficientes para descrever como o cliente deve processá-lo.&lt;br&gt;
    - hipertexto / hipermídia está disponível, o que significa que, após acessar um recurso, o cliente deve poder usar hiperlinks para encontrar todas as outras ações disponíveis no momento que possam executar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Um sistema em camadas que organiza cada tipo de servidor (responsável pela segurança, balanceamento de carga etc.).) envolveu a recuperação das informações solicitadas em hierarquias, invisíveis para o cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Código sob demanda (opcional): a capacidade de enviar código executável do servidor para o cliente quando solicitado, estendendo a funcionalidade do cliente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apesar dos diversos critérios uma API RESTful é simples de ser criada, razão pela qual é o modelo arquitetônico mais popular na web, podendo ser adotado nas mais diversas situações existentes no dia a dia.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SOAP&lt;/strong&gt;&lt;br&gt;
    1. Estrutura de mensagem estritamente definida que depende de XML&lt;br&gt;
    2. Protocolo independente&lt;br&gt;
    3. Seguro e extensível&lt;br&gt;
    4. Utilizado em ambiente empresarial seguro&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%2F12yadwxsmpf91i4ug2lo.jpeg" 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%2F12yadwxsmpf91i4ug2lo.jpeg" alt="Image description" width="225" height="225"&gt;&lt;/a&gt;&lt;br&gt;
SOAP é um acrônimo para &lt;em&gt;Simple Object Access Protocol&lt;/em&gt; (Protocolo de Acesso a Objeto Simples), sendo um protocolo padrão que foi projetado pela primeira vez para que aplicativos criados com diferentes idiomas e em diferentes plataformas pudessem se comunicar, fazendo com que seja conhecido por sua extensibilidade e independência de estilos de programação. Além disso, este é um protocolo dito neutro. Isto é, pode operar sob diferentes tipos de protocolos, como HTTP, SMTP, TCP e outros.&lt;br&gt;
Por ser um protocolo, impõe regras internas que aumentam sua complexidade e sobrecarga, o que pode levar a tempos de carregamento mais longos da página. No entanto, esses padrões também oferecem conformidade interna (&lt;em&gt;compliance&lt;/em&gt;) que podem torná-lo preferível para cenários corporativos. Os padrões de conformidade internos incluem segurança, atomicidade, consistência, isolamento e durabilidade (ACID), que é um conjunto de propriedades para garantir transações confiáveis no banco de dados.&lt;br&gt;
A especificações mais comuns desse protocolo são:   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Segurança de serviços da Web (segurança WS): padroniza como as mensagens são protegidas e transferidas por meio de identificadores exclusivos chamados tokens.&lt;/li&gt;
&lt;li&gt;Serviço web de mensagens confiáveis: padroniza o tratamento de erros entre as mensagens transferidas pela infraestrutura de TI não confiável.&lt;/li&gt;
&lt;li&gt;Endereçamento de serviços da Web (endereço WS): empacotar informações de roteamento como metadados nos cabeçalhos SOAP, em vez de manter essas informações mais profundas na rede.&lt;/li&gt;
&lt;li&gt;Linguagem de descrição de serviços da Web (WSDL): descreve o que um serviço da Web faz e onde esse serviço começa e termina.
Quando uma solicitação de dados é enviada para uma API SOAP, ela pode ser tratada através de qualquer um dos protocolos da camada do aplicativo: HTTP (para navegadores da web), SMTP (para email), TCP e outros. 
No entanto, uma vez recebida uma solicitação, as mensagens SOAP de retorno devem ser retornadas como documentos XML - uma linguagem de marcação legível por humanos e máquinas. Uma solicitação concluída para uma API SOAP não pode ser armazenada em cache por um navegador, portanto não pode ser acessada posteriormente sem reenviar para a API³.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;RPC&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Procedimento baseado em ação, ótimo para sistemas baseados em comando&lt;/li&gt;
&lt;li&gt;Usa apenas HTTP GET e POST&lt;/li&gt;
&lt;li&gt;Tem &lt;em&gt;payloads&lt;/em&gt; leves que permitem maior performance&lt;/li&gt;
&lt;li&gt;usados em sistemas distribuídos&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;RPC significa &lt;em&gt;Remote Procedural Call&lt;/em&gt;, em português, Chamada Procedural Remota. Este protcolo permite que uma aplicação chame, remotamente, um procedimento de outra (via internet ou intranet).&lt;/p&gt;

&lt;p&gt;Este tipo de API é o mais antigo e básico, sendo uma arquitetura cliente-servidor para construir aplicações distribuídas, que normalmente exigem que os desenvolvedores executem  blocos  específicos de código em outro sistema.&lt;/p&gt;

&lt;p&gt;O RPC é agnóstico em termos de protocolo, o que significa que tem o potencial de ser compatível com muitos protocolos, mas também perde os benefícios de usar recursos nativos de alguns protocolos como armazenamento em cache.&lt;/p&gt;

&lt;p&gt;Para oferecer suporte a chamadas de API para serviços em redes externas, o RPC depende de uma linguagem de definição de interface (IDL) que atua como um link de comunicação entre servidores localizados em diferentes redes externas criadas usando diferentes linguagens de programação.&lt;/p&gt;

&lt;p&gt;As APIs do tipo RPC podem se comunicar por meio de chamadas com multi parâmetros, que retornam um único resultado nos formatos JSON (&lt;em&gt;JSON-RPC&lt;/em&gt;) ou XML (XML*-RPC*)&lt;/p&gt;

&lt;p&gt;Há ainda as APIs baseadas em eventos/streamings, que também são chamadas de arquiteturas orientadas à eventos, em tempo real (&lt;em&gt;real time&lt;/em&gt;), de streaming, assíncronas ou push. Esse tipo de API não espera que o consumidor chame-a para que possa enviar uma resposta. Em vez disso, uma resposta é disparada pela ocorrência de um evento. Como exemplo, esses serviços expõem eventos nos quais os clientes podem se inscrever para receber atualizações quando os valores no serviço mudam. Há muitas variações para esse estilo, incluindo (entre outros) reativo, publicação e assinatura, notificação de eventos e CQRS.&lt;/p&gt;

&lt;p&gt;Numa próxima oportunidade, trataremos de GraphQL que não é um padrão de arquitetura de API, mais sim um tipo de linguagem de consulta que pode ser adotado. Um outro tema muito empolgante, são os formatos de dados que podem trafegar entre APIs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Spoiler: Não! Não é apenas JSON&lt;/em&gt; 🤭&lt;/p&gt;

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

&lt;p&gt;O tipo e arquitetura de uma API pode variar muito, dependendo do tipo de informação que irá entregar, quantidade de consultas simultâneas, velocidade, acesso, etc. E o time de desenvolvimento que deverá levantar os requisitos para eleger o melhor formato/arquitetura para a aplicação em questão. &lt;/p&gt;

&lt;p&gt;Aqui quis trazer luz sobre os formatos mais comuns no dia a dia do desenvolvimento. Você já os conhecia? Utiliza outro?&lt;/p&gt;

&lt;p&gt;Até a próxima 👋🏾&lt;/p&gt;

&lt;p&gt;Fontes: &lt;/p&gt;

&lt;p&gt;¹ &lt;a href="https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Client-side_web_APIs/Introduction" rel="noopener noreferrer"&gt;https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Client-side_web_APIs/Introduction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;² &lt;a href="https://www.redhat.com/en/topics/api/what-is-a-rest-api" rel="noopener noreferrer"&gt;https://www.redhat.com/en/topics/api/what-is-a-rest-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;³ &lt;a href="https://www.redhat.com/en/topics/integration/whats-the-difference-between-soap-rest#soap" rel="noopener noreferrer"&gt;https://www.redhat.com/en/topics/integration/whats-the-difference-between-soap-rest#soap&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Como você estuda?</title>
      <dc:creator>Manu Coutinho</dc:creator>
      <pubDate>Mon, 18 Apr 2022 14:47:36 +0000</pubDate>
      <link>https://forem.com/manucoutinho/como-voce-estuda-4np5</link>
      <guid>https://forem.com/manucoutinho/como-voce-estuda-4np5</guid>
      <description>&lt;p&gt;Olá Devs!&lt;/p&gt;

&lt;p&gt;O episódio de hoje na minha (nada mole) vida de Dev Sandy é sobre Estudar!&lt;/p&gt;

&lt;p&gt;Sim, sou uma pessoa ávida por estudar e, quando falo estudar, me refiro a qualquer coisa: desde um novo idioma, passando por matérias tradicionais, culturas diferentes, games, enfim, qualquer coisa mesmo.&lt;/p&gt;

&lt;p&gt;Mas, desde que me decidi pela migração de carreira para área Tech, mudei a didática e a intensidade dos estudos ao longo da jornada. &lt;/p&gt;

&lt;p&gt;De início, acompanhava cursos ou tutores do começo ao fim e, a partir das dúvidas que surgiam no percurso, pesquisava tais assuntos.&lt;br&gt;
Ao passar do tempo, quando comecei a implementar meus próprios projetos, percebi que passava bastante tempo pesquisando e estudando para implementar boa parte deles. Logo, aquela fórmula inicial de estudo, não me servia mais.&lt;/p&gt;

&lt;p&gt;Passei então a acompanhar as aulas e ao final de cada tema e/ou módulo, implementar um projeto original utilizando o conhecimento ali adquirido. Nesse momento, passei a mensurar o quanto estava absorvendo das aulas técnicas. &lt;/p&gt;

&lt;p&gt;Fiquei bem frustrada ao perceber que era menos do que eu esperava.&lt;/p&gt;

&lt;p&gt;Como define os dicionários, autodidata é a pessoa que aprende por meio do seu esforço particular em buscar o conhecimento. &lt;/p&gt;

&lt;p&gt;E eu me defino com sendo uma pessoa autodidata, então passei a criar pequenas metas de aprendizado.&lt;/p&gt;

&lt;p&gt;A partir destas pequenas metas, passei a mapear todos os subtemas relacionados que seriam necessários para que eu pudesse compreender aquela meta. &lt;em&gt;*(como no diagrama da imagem)&lt;/em&gt;&lt;br&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%2F093tg3mcwajg7mqh43lj.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%2F093tg3mcwajg7mqh43lj.png" alt="Exemplo de metas intermediárias" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com esse simples passo, já tinha meu primeiro plano de estudos (passo essencial).&lt;/p&gt;

&lt;p&gt;O que percebi? Quando eu crio um plano de estudos personalizado, com uma meta macro (meta de longo prazo), diversas submetas (metas de médio prazo), sendo essas submetas divididas em temas (metas de curto prazo), podendo esses temas compreender outros subtemas, meu plano de estudo passa a ser somente meu, estritamente personalizado e, a partir daí nem o céu é limite para onde posso chegar. Pois o destino quem define, é o autor do projeto, no meu caso, euzinha!&lt;/p&gt;

&lt;p&gt;Hoje, tenho meu plano de estudos que compreende uma gama de assuntos ligados às minhas metas intermediárias. E a cada tema (parte micro do plano de estudo), início a busca por conteúdo escrito, frequentemente em inglês. &lt;/p&gt;

&lt;p&gt;Início pela documentação oficial, caso precise de algum exemplo específico ou de informação adicional, passo a procurar artigos, salvo e categorizo os mais relevantes no meu &lt;em&gt;Notion&lt;/em&gt; (meu caderninho).&lt;/p&gt;

&lt;p&gt;Principais motivos pelos quais eu salvo: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Consultar em outro momento – muito comum você compreender a ideia inicial de um tema. Mas se você ler novamente após ter adquirido outros conhecimentos, irá visualizar camadas que não viu antes 😉.&lt;/li&gt;
&lt;li&gt; Documentar – acredito que como eu, as pessoas que estão estudando assuntos ligados à área tech, têm um aprendizado acelerado, devido a quantidade de informação que consumimos x tempo. Então fica fácil você esquecer o motivo que levou a adotar determinado entendimento. Documentar resolve esse e outros problemas 📃&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ultrapassada esta fase de pesquisa, vou para prática, momento em que tento implementar aquele conhecimento num projeto. Nesse momento vejo os “gargalos”, ou seja, onde ainda não compreendi da forma esperada, volto e consulto o material que separei. Mas se realmente eu não conseguir avançar, vou procurar o conteúdo em vídeo.&lt;/p&gt;

&lt;p&gt;Com relação aos tutoriais em vídeo, é bom ter em mente que nem sempre vamos encontrar algo que se encaixe 100% na sua dúvida. &lt;/p&gt;

&lt;p&gt;Claro que estou falando aqui de temas mais específicos, com uma mensagem de erro ou implementação de determinada feature que está tendo incompatibilidade com outra parte do seu código ou, ainda, algo lançado recentemente. Além de outras coisas que me fazem deixar o vídeo como última opção, isso daria assunto para outro artigo.&lt;/p&gt;

&lt;p&gt;Com isso em mente, vou realizando o ciclo: aulas – pesquisa – implementação.  Claro que nenhuma dúvida deve permanecer ativa em nossa mente por muito tempo, portanto, sempre que necessário recorra aos nossos colegas da Bolha Dev, certamente alguém lhe auxiliará, isso incluí o queridinho Stack Overflow.&lt;/p&gt;

&lt;p&gt;Por fim, ressalto dois pontos, que julgo essenciais para evolução nos estudos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⏲️ Periodicamente revise suas metas, para incluir novos temas que encontrou no caminho e para excluir ou postergar o que descobriu não ser tão relevantes;&lt;/li&gt;
&lt;li&gt;📚Vai chegar um momento na sua jornada em que verá a necessidade de imergir na literatura técnica, não evite! Mergulhe com tudo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;😊 Com essa reflexão, a única coisa que posso afirmar é que não existe receita infalível! O método que venho desenvolvendo, no momento, me serve. Mas, pode ser que daqui a algum tempo tenha que ser mudado.&lt;/p&gt;

&lt;p&gt;Aprendizado é algo contínuo, um ciclo infinito ao longo da nossa vida. Aproveite a jornada!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>career</category>
    </item>
  </channel>
</rss>
