<?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: Lucas Mateus</title>
    <description>The latest articles on Forem by Lucas Mateus (@lucas_jdev).</description>
    <link>https://forem.com/lucas_jdev</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%2F1053406%2F05d19d84-5488-46ce-b55e-a1ae60938824.jpg</url>
      <title>Forem: Lucas Mateus</title>
      <link>https://forem.com/lucas_jdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lucas_jdev"/>
    <language>en</language>
    <item>
      <title>Design: Dificuldades e Carreira</title>
      <dc:creator>Lucas Mateus</dc:creator>
      <pubDate>Mon, 22 May 2023 11:59:13 +0000</pubDate>
      <link>https://forem.com/lucas_jdev/design-dificuldades-e-carreira-1gbf</link>
      <guid>https://forem.com/lucas_jdev/design-dificuldades-e-carreira-1gbf</guid>
      <description>&lt;p&gt;Olá! Hoje vamos ver um pouco sobre design, especialmente sobre as dificuldades e carreira. Se liga no que você vai ver aqui:&lt;/p&gt;

&lt;p&gt;
  Sumário
  &lt;ul&gt;
&lt;li&gt;1. Introdução

&lt;ul&gt;
&lt;li&gt;1.1 O que é design?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. Design é complicado!

&lt;ul&gt;
&lt;li&gt;2.1 Networking&lt;/li&gt;
&lt;li&gt;2.2 Clientes&lt;/li&gt;
&lt;li&gt;2.3 Conciliação&lt;/li&gt;
&lt;li&gt;2.4 Bloqueio Criativo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. Segmentos de design&lt;/li&gt;
&lt;li&gt;4. Conclusão
&lt;/li&gt;
&lt;/ul&gt;




&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Espero que você goste do conteúdo, não se esqueça de deixar sua reação e seu comentário. Boa leitura :)&lt;/p&gt;


&lt;/blockquote&gt;




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

&lt;p&gt;Se você, assim como eu, gosta de design, já deve ter considerado seguir carreira nessa área. Mas já parou para refletir sobre como é o dia a dia nesse campo, quais ramos seguir em design e quais dificuldades poderá enfrentar? Neste post, vou apresentar um pouco do universo do design. E para isso, convidei dois designers de diferentes segmentos para me auxiliarem a fornecer informações valiosas.&lt;/p&gt;

&lt;p&gt;Então vamos nessa!&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 O que é design?
&lt;/h3&gt;

&lt;p&gt;Creio que essa seja uma das perguntas mais desafiadoras de responder para a maioria dos designers, pois cada um possui sua própria concepção do que é design.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fsygud8j23970jb8v2ggz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fsygud8j23970jb8v2ggz.png" alt="jez-definicao-design"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso você pode se perguntar: "Design não é arte?".&lt;/p&gt;

&lt;p&gt;Segundo Jezreel, o design não é arte; ele não flui da mesma forma que a arte. O design envolve a concepção de algo com o propósito de sua execução concreta. Essa perspectiva é semelhante à visão de Steve Jobs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F2veuo8746dfxemyixxmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2veuo8746dfxemyixxmd.png" alt="jobs-definicao-design"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Design é solução. Todo designer pode afirmar que isso é um fato. Embora essa seja uma definição simplificada do vasto universo do design, na prática, o design é exatamente isso: encontrar soluções para problemas e necessidades por meio do planejamento e da criação de produtos, serviços, interfaces e experiências.&lt;/p&gt;

&lt;p&gt;Há profissionais que aderem mais ao conceito visual do design. Nesse caso, você pode se perguntar: "Qual é a justificativa para esse ponto de vista?". Alguns argumentam que o design é voltado para criar soluções esteticamente agradáveis, de acordo com a visão concreta e abstrata do cliente. Essa abordagem enfatiza a importância da estética e da percepção visual na comunicação e na experiência do usuário.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fhxswxw1oo1h7mgjf9sd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fhxswxw1oo1h7mgjf9sd2.png" alt="romulo-definicao-design"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Design é complicado!
&lt;/h2&gt;

&lt;p&gt;Algumas vezes, quando se é iniciante, é comum sentir dificuldade em realizar determinadas tarefas no design. Isso pode ser devido à falta de conhecimento sobre as ferramentas utilizadas, falta de domínio dos conceitos envolvidos e outras questões. É importante ressaltar que até mesmo profissionais experientes passaram por situações semelhantes em suas trajetórias de trabalho. O aprendizado e a evolução no design são processos contínuos, e é natural enfrentar desafios ao longo do caminho. O importante é persistir, buscar conhecimento e experiência para superar essas dificuldades.&lt;/p&gt;

&lt;p&gt;No início de sua carreira, Rômulo enfrentou dificuldades ao tentar encontrar recursos de aprendizado. Embora haja uma quantidade considerável de conteúdo disponível, pode ser desafiador saber por onde começar. Por essa razão, é interessante buscar referências de profissionais renomados, como &lt;a href="https://www.instagram.com/designfromhuman/" rel="noopener noreferrer"&gt;Ryan Dutra&lt;/a&gt;, &lt;a href="https://www.instagram.com/uxunicornio/" rel="noopener noreferrer"&gt;Leandro Rezende&lt;/a&gt;, &lt;a href="https://www.instagram.com/marcelokimuradesign/" rel="noopener noreferrer"&gt;Marcelo Kimura&lt;/a&gt; e muitos outros designers que estão disponíveis em plataformas como o Instagram. Seguir essas referências pode ajudar a encontrar inspiração, aprender novas técnicas e obter insights valiosos para o desenvolvimento no campo do design.&lt;/p&gt;

&lt;p&gt;Ao buscar referências, torna-se mais fácil ter uma direção para os estudos. No entanto, caso isso não seja suficiente, é recomendado procurar comunidades de design online. Para fornecer algumas opções de comunidades, aqui estão algumas sugestões:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brasil Design&lt;/li&gt;
&lt;li&gt;Comunidade XLab&lt;/li&gt;
&lt;li&gt;Comunidade Teu Designer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas comunidades podem oferecer um espaço para interação com outros designers, compartilhamento de conhecimento e discussões relevantes sobre o campo do design.&lt;/p&gt;

&lt;p&gt;(comenta mais comunidades aí)&lt;/p&gt;

&lt;p&gt;Além de fornecer uma direção sobre como e o que estudar, buscar referências e se envolver em comunidades de design, é essencial desenvolver uma rede de contatos profissionais, conhecido como networking. O networking é um pré-requisito para se tornar um designer profissional.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Networking
&lt;/h3&gt;

&lt;p&gt;Vivemos em uma era em que a comunicação é fundamental para o progresso. Ter uma rede de contatos profissionais é essencial para estabelecer uma relação de mutualismo, na qual ambas as partes se beneficiam. É importante ter em mente que, para aumentar sua produtividade, você depende da colaboração de outras pessoas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F1dyy2a4wz6ohvy1x5nze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F1dyy2a4wz6ohvy1x5nze.png" alt="Romulo-definicao-networking"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Ah, mas por que o networking é obrigatório? Sou uma pessoa tímida!"&lt;/p&gt;

&lt;p&gt;Quando você está começando no mercado, a primeira pergunta a ser feita é: "Quem é você?" Não há prova de conceito melhor do que receber elogios e reconhecimento pelo seu trabalho, pois isso gera valor tanto interna quanto externamente. E sobre a Timidez, não tem pra onde correr, tem que ser sem vergonha kkkk. Na área de design, a comunicação interpessoal é essencial, principalmente ao lidar com clientes.&lt;/p&gt;

&lt;p&gt;Por falar em clientes...&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Clientes
&lt;/h3&gt;

&lt;p&gt;Se tem alguém que retira a paciência de qualquer designer, esse alguém o cliente. Muitas das vezes, eles exigem coisas sem nexo para o negócio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fnqi8n4fukjb3r9xxznb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fnqi8n4fukjb3r9xxznb5.png" alt="jez-depoimento-clientes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jezreel ainda complementa com uma experiência vivida no trabalho em que o cliente exigiu uma arte bastante complexa, incluindo a inserção de mais de vinte serviços da empresa, os contatos e o endereço, tanto na frente quanto no verso de um cartão de visita com dimensões de 9 cm de largura por 4 cm de altura.&lt;/p&gt;

&lt;p&gt;Vida de designer realmente pode ser desafiadora em alguns momentos. É verdade que, muitas vezes, é necessário - permita-me falar o clichê - sair da zona de conforto para atender às demandas dos clientes e alcançar resultados satisfatórios. A versatilidade e o conhecimento de diversas ferramentas e softwares são essenciais nessa profissão.&lt;/p&gt;

&lt;p&gt;O Cliente nem sempre tem a razão absoluta. Embora seja necessário levar em consideração as demandas e expectativas dos clientes, também é fundamental exercer sua expertise e julgamento profissional para oferecer soluções eficazes e criativas.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Conciliação
&lt;/h3&gt;

&lt;p&gt;A vida não é só trabalho!&lt;/p&gt;

&lt;p&gt;Para algumas pessoas pode ser normal gostar do trabalho, o que é ok, mas evite transformar sua vida em somente trabalho. A vida é mais do que isso, há tantas coisas que você não fez e experimentou que você poderia dá uma chance no seu tempo vago, no lugar de pensar apenas em trabalho.&lt;/p&gt;

&lt;p&gt;Em conversas com designers, percebi que muitos profissionais que atuam ou já atuaram em agências de design enfrentam dificuldades para conciliar o trabalho com a vida pessoal devido à alta demanda.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F80tue3dzkodzuw8d12at.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F80tue3dzkodzuw8d12at.png" alt="jez-agencias"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Saiba conciliar e definir prioridades de elaboração para maior efetividade.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Bloqueio criativo
&lt;/h3&gt;

&lt;p&gt;Aqui eu gostaria de abrir um parêntese para um breve desabafo, pois sei que muitas pessoas enfrentam bloqueio criativo, e eu mesmo estou passando por isso neste exato momento em que escrevo este post. É uma situação difícil, que gera uma grande frustração e uma ansiedade angustiante. Se isso acontece comigo, que não estou sob uma pressão intensa de uma agência com alta demanda, imagine para um designer profissional. É importante lembrar que os designers também são seres humanos e precisam de cuidados mentais e físicos para manter seu corpo funcionando com produtividade. Procure um psicólogo, um dentista, um nutricionista, um profissional de saúde. Cuide-se!!&lt;/p&gt;

&lt;p&gt;Agora voltando para a linha que eu estava seguindo...&lt;/p&gt;

&lt;p&gt;O bloqueio criativo é algo comum de ocorrer no início da carreira, pois a criatividade é como um músculo que se fortalece com o tempo, conforme afirmou Jezreel.&lt;/p&gt;

&lt;p&gt;Não há para onde correr, para exercitar a criatividade é necessário começar a esboçar. Mesmo que sejam apenas rabiscos aleatórios kkkk. Em suma, busque fazer o inesperado ao esboçar, pois o esperado pode ser planejado quando sua criatividade estiver em pleno exercício.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Segmentos de design
&lt;/h2&gt;

&lt;p&gt;Se em algum momento você já se questionou sobre quais áreas do design seguir, este é o momento de se encantar.&lt;/p&gt;

&lt;p&gt;A área do design é extremamente ampla e se você pensou que se limita apenas ao web design ou social media, está enganado(a) e é um equívoco bastante comum.&lt;/p&gt;

&lt;p&gt;Em uma pesquisa que conduzi com pessoas comuns do meu círculo social, perguntei quais áreas do design elas conheciam e as respostas geralmente se limitavam a apenas quatro: design de moda, design de interiores, design de produto e design gráfico (não necessariamente nessa ordem).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fbrt7et0biq07ff75cq2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fbrt7et0biq07ff75cq2w.png" alt="grafico-pesquisa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de perceber isso, eu fiquei mais curioso e fui pesquisar quais são os segmentos mais conhecidos - baseado em pesquisa renomada que não seja a minha kkkk - e bem remunerados no campo do design.&lt;/p&gt;

&lt;p&gt;Vamos lá...&lt;/p&gt;

&lt;p&gt;De acordo com a &lt;a href="https://blog.unifoa.edu.br/confira-principais-areas-do-design/" rel="noopener noreferrer"&gt;UniFOA&lt;/a&gt;, as 7 principais áreas de atuação do design são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Design de Moda;&lt;/li&gt;
&lt;li&gt;Design Gráfico;&lt;/li&gt;
&lt;li&gt;Design de Produto;&lt;/li&gt;
&lt;li&gt;Design de Serviços;&lt;/li&gt;
&lt;li&gt;Design de Interiores;&lt;/li&gt;
&lt;li&gt;Design de Mobiliário;&lt;/li&gt;
&lt;li&gt;Design de Animação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas calma lá...&lt;/p&gt;

&lt;p&gt;Cada uma dessas áreas possui subdivisões interessantes, como o social media design, UI design e até mesmo o UX design. Além disso, percebo um crescimento promissor na área de HX (Human Experience), que está começando a ganhar destaque.&lt;/p&gt;

&lt;p&gt;Agora vamos para salários em alguns segmentos dos segmentos kkkk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fe9hnyr7to26im7abnvmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fe9hnyr7to26im7abnvmg.png" alt="faixa-salarial"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Antes que você me pergunte sobre a fonte, baseei-me nas médias salariais do Glassdoor, LoveMondays e Catho. No entanto, é importante ressaltar que esses valores podem variar de acordo com a região.&lt;/p&gt;

&lt;p&gt;Quanto ao gráfico, vale ressaltar que segmentos como o UX são bastante atrativos para o público. O UX é amplamente utilizado no desenvolvimento de soluções web no cotidiano, embora vá muito além disso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F15edvmqmn5nf3y6ryoaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F15edvmqmn5nf3y6ryoaf.png" alt="romulo-web"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Neste post, abordamos algumas das dificuldades enfrentadas pelos designers, falamos sobre salários, segmentos e a importância de ter cuidado no trabalho. Espero que você tenha gostado e, se ainda estiver indeciso sobre seguir carreira nessa área, sugiro que tenha calma, faça mais pesquisas e se apaixone ainda mais pelo design antes de tomar uma decisão. Se sua motivação principal for apenas dinheiro e não paixão, sugiro que entre com cautela, mantendo a calma e focando sempre nos fundamentos das coisas.&lt;/p&gt;

&lt;p&gt;É isso! Espero que você que tenha chegado até aqui tenha gostado :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3eri7pj39n0zcwobcb4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3eri7pj39n0zcwobcb4x.png" alt="meme-ate-a-proxima"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Participação&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://l.wl.co/l?u=https%3A%2F%2Fwww.behance.net%2Fromulo_h" rel="noopener noreferrer"&gt;Rômulo Henrique&lt;/a&gt;: Web Designer independente;&lt;br&gt;
&lt;a href="https://www.instagram.com/jezreeldesigner/" rel="noopener noreferrer"&gt;Jezreel Lucas&lt;/a&gt;: Social Media Designer.&lt;/p&gt;

</description>
      <category>design</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Protocolo HTTP</title>
      <dc:creator>Lucas Mateus</dc:creator>
      <pubDate>Sat, 29 Apr 2023 20:16:55 +0000</pubDate>
      <link>https://forem.com/lucas_jdev/protocolo-http-1bcc</link>
      <guid>https://forem.com/lucas_jdev/protocolo-http-1bcc</guid>
      <description>&lt;p&gt;Olá! Hoje vamos ver um pouco sobre o protocolo HTTP, saber o que é isto, como ele funciona etc., se liga no sumário:&lt;/p&gt;

&lt;p&gt;
  Sumário
  &lt;ul&gt;
&lt;li&gt;1. Introdução

&lt;ul&gt;
&lt;li&gt;1.1 O que é um protocolo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. Como isso funciona?

&lt;ul&gt;
&lt;li&gt;2.1 Estrutura&lt;/li&gt;
&lt;li&gt;2.2 Como sua requisição http chega no servidor?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. Versionamento

&lt;ul&gt;
&lt;li&gt;3.1 Custos&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4. Vantagens e Desvantagens&lt;/li&gt;
&lt;li&gt;5. Conclusão
&lt;/li&gt;
&lt;/ul&gt;




&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Espero que você goste do conteúdo e não se esqueça de fornecer seu feedback para que eu possa melhorar cada vez mais.&lt;/p&gt;
&lt;/blockquote&gt;


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

&lt;p&gt;Certo dia eu estava estudando sobre o Netty, um framework de servidor com infraestrutura assíncrona e não bloqueante. Aí me veio a ideia de escrever sobre o protocolo HTTP e aqui está ela se tornando realidade. Vamos lá!&lt;/p&gt;

&lt;p&gt;Você, assim como eu, deve usar a internet com certa regularidade e realizar pesquisas no Bing, Google ou qualquer que seja seu mecanismo de busca primário. Entretanto, em algum momento, você já se perguntou como suas pesquisas são trazidas até você?&lt;/p&gt;

&lt;p&gt;De forma resumida funciona assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bp5F5HDj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71lf790pe1kmvwlkycz6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bp5F5HDj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/71lf790pe1kmvwlkycz6.png" alt="comunicacao-cliente-servidor" width="759" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você abre o seu navegador e digita a pesquisa que deseja. Em seguida, você executa a ação de pesquisar. Essa ação solicita o que você pediu para um servidor que pode estar em qualquer lugar deste mundo. Então, o servidor processa o seu pedido e retorna a página de pesquisa com vários links.&lt;/p&gt;

&lt;p&gt;Creio que você tenha entendido esse ponto, mas vamos nos aprofundar um pouco mais.&lt;/p&gt;

&lt;p&gt;Para que a solicitação e a resposta aconteçam, é utilizado um protocolo de comunicação, seja o HTTP, SSH, FTP, etc. Mas como este post é sobre HTTP, vamos falar exclusivamente dele. (Se você quiser um post comparando esses protocolos, comenta aí).&lt;/p&gt;
&lt;h2&gt;
  
  
  1.1 O que é um protocolo
&lt;/h2&gt;

&lt;p&gt;Se você não sabe o que é um protocolo, provavelmente deve ter ficado assim neste ultimo parágrafo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kHT3NZCA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/23gal1vz4sjxgsy0h7fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kHT3NZCA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/23gal1vz4sjxgsy0h7fo.png" alt="What" width="243" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos com calma. Basicamente, um protocolo é um conjunto de regras e procedimentos padronizados que são seguidos para permitir a comunicação entre dispositivos ou sistemas de computação.&lt;/p&gt;

&lt;p&gt;"Ainda não entendi!" Vou te dar um exemplo prático.&lt;/p&gt;

&lt;p&gt;Imagine que você quer encontrar uma resposta para uma pergunta que tem na sua cabeça e decide buscar no Google. Nesse exemplo, você é o cliente e o Google é o servidor.&lt;/p&gt;

&lt;p&gt;Para que a sua pergunta chegue ao Google e retorne a resposta correta, é preciso que ambos usem um conjunto de regras e procedimentos que permitam a comunicação entre eles. Essas regras e procedimentos são chamados de protocolo.&lt;/p&gt;

&lt;p&gt;O protocolo define como o cliente deve fazer a sua solicitação (nesse caso, uma pesquisa) e como o servidor deve responder a essa solicitação. É como se fosse uma linguagem que ambos precisam falar para se entenderem.&lt;/p&gt;

&lt;p&gt;No caso do Google, o protocolo utilizado é o HTTP (Hypertext Transfer Protocol), que é um conjunto de regras para transferência de informações na internet. Quando você faz uma pesquisa no Google, o seu navegador web envia uma requisição HTTP para o servidor do Google, pedindo a informação desejada. O servidor então responde com uma mensagem HTTP contendo a resposta da pesquisa. Tudo isso acontece seguindo o protocolo definido pelo HTTP.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Como funciona o HTTP?
&lt;/h2&gt;

&lt;p&gt;Se você prestou atenção na thumbnail, deve ter percebido que é exatamente esta pergunta agora, e isso não foi coincidência. Bom, é um pouquinho complicado explicar como funciona o HTTP, porque eu preciso entrar em mais detalhes, mas vamos lá.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.1 Estrutura
&lt;/h3&gt;

&lt;p&gt;Antes de você entender os processos, creio que seja relevante saber como é a estrutura desse negócio. Então vamos lá.&lt;/p&gt;

&lt;p&gt;O HTTP possui duas formas estruturais para mensagens, são elas: formato de mensagem de solicitação e o formato de mensagem de resposta, conforme a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8pf2GahG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/elwodbt1ya6px342jsw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8pf2GahG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/elwodbt1ya6px342jsw3.png" alt="estrutura-mensagem-http" width="748" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"O que raios são cada uma dessas camadas aí?", segue o fio:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linha de solicitação&lt;/strong&gt;: é o local onde está definido o &lt;em&gt;tipo de solicitação&lt;/em&gt; (GET, POST, PUT etc.), a &lt;em&gt;URL&lt;/em&gt; (&lt;a href="http://www.google.com"&gt;http://www.google.com&lt;/a&gt;) e a &lt;em&gt;versão&lt;/em&gt; do HTTP (1.1 ou 2.0). Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DPRMgugq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xbodxjyq0r81pe4tndfk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DPRMgugq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xbodxjyq0r81pe4tndfk.png" alt="exemplo-solicitacao-http" width="718" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linha de status&lt;/strong&gt;: é o local onde o servidor retorna se a solicitação foi atendida com êxito ou não. Nesta linha está contida a &lt;em&gt;versão&lt;/em&gt; do http, o &lt;em&gt;código&lt;/em&gt; de status (200, 404, 500 etc.) e &lt;em&gt;frase&lt;/em&gt; de status (OK, Not Found, Internal Server Error etc.). Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--taiIiZtO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j4ltx0oonh3agvuq8yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--taiIiZtO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8j4ltx0oonh3agvuq8yb.png" alt="exemplo-status-http" width="614" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cabeçalho&lt;/strong&gt;: é um conjunto de informações que são enviadas junto com a solicitação ou resposta HTTP para fornecer informações adicionais sobre a transação. Ele contém metadados que descrevem vários aspectos da solicitação ou resposta, como a versão do protocolo, os tipos de dados aceitos, as informações de autenticação, o tamanho do conteúdo, entre outros. O cabeçalho é dividido em duas seções: o cabeçalho da solicitação e o cabeçalho da resposta. Ambos contêm campos de cabeçalho específicos que são definidos pelo protocolo HTTP.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F-xqJ3q8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/734glpxhfsdfk6smabsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F-xqJ3q8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/734glpxhfsdfk6smabsx.png" alt="cabecalho-" width="593" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo de &lt;u&gt;cabeçalho de solicitação&lt;/u&gt; informando quem tá solicitando a requisição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de &lt;u&gt;cabeçalho de resposta&lt;/u&gt; do servidor informando o tipo de conteúdo que está sendo retornado na resposta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;content-type: text/javascript
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Linha em branco&lt;/strong&gt;: não tem o que dizer, é uma linha em branco kkkkk.&lt;/p&gt;

&lt;p&gt;"Há, mas por que tem que ter uma linha em branco?" - Bom, ela é necessária para separar as informações de cabeçalho dos dados propriamente ditos. Isso permite que o receptor da mensagem saiba onde termina o cabeçalho e começa o corpo da mensagem. A falta dessa linha em branco pode levar a erros de interpretação do conteúdo da mensagem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Corpo&lt;/strong&gt;: pode estar presente em uma mensagem de solicitação ou de resposta. Normalmente contém o documento a ser transmitido ou recebido.&lt;/p&gt;

&lt;p&gt;Exemplo de um &lt;u&gt;corpo de solicitação&lt;/u&gt; referente a um formulário de cadastro simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;nome=João Silva&amp;amp;email=joao.silva@exemplo.com&amp;amp;senha=abc123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exemplo de um &lt;u&gt;corpo de resposta&lt;/u&gt; referente a uma pesquisa simples de um site que retorna uma documento HTML contendo os links de resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Resultados da pesquisa&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;Resultados da pesquisa&amp;lt;/h1&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href="https://www.example.com"&amp;gt;Exemplo&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href="https://www.google.com"&amp;gt;Google&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;&amp;lt;a href="https://pt.wikipedia.org"&amp;gt;Wikipédia&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show!! Agora que você viu como é composta a requisição HTTP e a resposta, nada melhor do que um exemplo completo, não é mesmo? Vamos lá.&lt;/p&gt;

&lt;p&gt;Exemplo de uma pesquisa no bing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;solicitação http&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/search?q=Lucas+Jdev&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;www.bing.com&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&lt;/span&gt;
&lt;span class="na"&gt;Accept-Language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en-US,en;q=0.5&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep-alive&lt;/span&gt;
&lt;span class="na"&gt;Referer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://www.bing.com/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;resposta http&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 26 Apr 2023 10:30:00 GMT&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Microsoft-IIS/10.0&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html; charset=utf-8&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;298&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/javascript"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="c1"&gt;//&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;CDATA&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="nx"&gt;sj_evt&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;sj_evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;onRALoad&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;reportActivityModule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;ModernRewards&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReportActivity&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AnimateHeader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsAuthenticated&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DashboardUrl&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rewards.bing.com/?signin=1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsMobileClient&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RewardsIncrement&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RewardsSessionData&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsRewardUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsLinkedUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsTenantEnabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsTrialUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TrialUserClaimBalance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsRebatesUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsRebatesDeniedUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Balance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;129&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RewardsBalance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;129&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GiveBalance&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RebatesBalance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsGiveModeOn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GiveModeCid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GiveModeCName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PreviousBalance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;129&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GoalTrackBalance&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsLevel2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsOptOut&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsSuspended&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ShowAnimation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EPuid&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FQ3QSpOEsvC09O9NlYX5nfc-yXWgdu80h41sspLcTT_-rxCXzvfdivH5irtG3RtcZAEyiWMW5DolbOxJMGOt5w&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsRedirectedFromOldDashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ImpressionLifeTimeCount&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DailyImpressionHPCount&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DailyImpressionSerpCount&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;VisitedCount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LastVisitTime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2023-04-26T07:00:00Z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LastAutoOpenFlyoutTime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0001-01-01T00:00:00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AutoOpenFlyoutFlag&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsCLOUser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Waitlist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SERPTheme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RewardsHeader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rewards&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NeedUpdateRewardsHeaderLink&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AnimationAltText&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Animation&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AutoOpenFlyout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsGiveHeaderTextEnabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsGiveSerpHeaderTealHeartEnabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsRewardsEntryPointEnabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;IsRewardsEntryPointToggleEnabled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;BalanceMessage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ShowNonMemberUpsellMessage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LogWaitlistAutoJoin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="nx"&gt;reportActivityModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;();&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="c1"&gt;//]]&amp;gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"O que diabos é isso no corpo da resposta???", calma, isso é apenas um script que o servidor está retornando, e o cliente o interpreta e executa na renderização.&lt;/p&gt;

&lt;p&gt;Ufa! Finalmente podemos dizer que terminamos, pelo menos a base. Entretanto, vamos aprofundar ainda mais no HTTP.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Como sua requisição http chega no servidor?
&lt;/h3&gt;

&lt;p&gt;No ecossistema da infraestrutura de redes, é comum se referir a modelos como o OSI e arquiteturas como o TCP/IP. Neste contexto, irei focar na arquitetura TCP/IP, já que ela é a mais amplamente utilizada na prática de redes de computadores baseadas em internet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BbHkF2Mw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzs3fgb0yapa89nijpc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BbHkF2Mw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rzs3fgb0yapa89nijpc2.png" alt="modelo-tcp-ip" width="445" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basicamente, a web funciona da seguinte maneira:&lt;/p&gt;

&lt;p&gt;Você faz uma pesquisa no Google sobre "capivaras fofas". Para que o seu navegador possa se comunicar perfeitamente com o servidor do Google, eles utilizam um protocolo, que é o HTTP. Esse protocolo funciona na camada de aplicação na rede.&lt;/p&gt;

&lt;p&gt;Caso você ainda não tenha se perguntado como a entrega da solicitação e da resposta é garantida, não se preocupe. Vou explicar agora mesmo. Para garantir uma entrega ideal, a camada de aplicação delega para a camada abaixo o empacotamento da requisição em fragmentos, que são enviados para o servidor. Nessa camada é utilizado o protocolo TCP (Transmission Control Protocol) ou UDP (User Datagram Protocol). &lt;/p&gt;

&lt;p&gt;"Ah, mas como essa camada faz isso?" Eu teria que fazer um post exclusivamente sobre esses protocolos, então comenta aí se você quer.&lt;/p&gt;

&lt;p&gt;Ok, depois disso, a camada de transporte não sabe qual é o melhor caminho para esses pacotes chegarem até o servidor por meio da rede e é aí que entra a camada de rede. Nela ocorre a determinação dos melhores caminhos na rede por meio de protocolos de roteamento, como o BGP (Border Gateway Protocol). Além de definir o melhor caminho, esta camada também endereça todos os pacotes para dizer para onde vão.&lt;/p&gt;

&lt;p&gt;Tudo suave até aqui, porém, a pergunta que não quer calar é: "Se a minha requisição de pesquisa foi feita na aplicação, a camada de transporte compactou minha requisição em pacotes de dados menores, a camada de rede cuidou da logística, então quem danado envia esse negócio?"&lt;/p&gt;

&lt;p&gt;A resposta é simples: é a camada de enlace. Ela é responsável por trafegar os pacotes na rede física. "E como danado ela faz isso?" Bom, ela converte os dados dos pacotes de dados em sinais elétricos, ópticos ou de rádio que podem ser transmitidos pela rede física e vice-versa.&lt;/p&gt;

&lt;p&gt;Ou seja, para passar na fibra óptica em que o servidor do Google está conectado, quem é responsável por isso é a camada de enlace.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Versionamento
&lt;/h2&gt;

&lt;p&gt;Confesso que essa parte me deixou muito curioso e, para esclarecer minhas dúvidas, precisei consultar alguns profissionais da área. Então, sem mais delongas, vamos falar sobre o versionamento do protocolo HTTP.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/0.9&lt;/strong&gt; (1991): A primeira versão do HTTP, criada como um protocolo simples para transferência de documentos em redes de computadores. Possuía apenas um método (GET) e não continha cabeçalhos de requisição ou resposta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/1.0&lt;/strong&gt; (1996): Versão que incluiu métodos adicionais (POST, PUT, DELETE) e suporte para cabeçalhos de requisição e resposta. Porém, cada conexão só podia enviar uma única requisição e resposta, o que aumentava o tempo de resposta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/1.1&lt;/strong&gt; (1999): Introduziu a capacidade de enviar várias requisições em uma única conexão (conexão persistente) e suporte a compressão de dados e autenticação. Também permitiu o uso de cabeçalhos de cache para melhorar o desempenho e reduzir a largura de banda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/2&lt;/strong&gt; (2015): A principal mudança em relação ao HTTP/1.1 foi a implementação do multiplexação, permitindo que várias requisições e respostas sejam transmitidas simultaneamente em uma única conexão, além de suporte para criptografia TLS por padrão. Outras melhorias incluem o uso de cabeçalhos de compressão HPACK, priorização de requisições e o push de recursos do servidor para o cliente sem a necessidade de uma requisição prévia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP/3&lt;/strong&gt; (2020): Também conhecido como HTTP sobre QUIC, é a versão mais recente do protocolo. O HTTP/3 utiliza o protocolo de transporte QUIC, que foi desenvolvido pela Google para melhorar a velocidade de conexão em redes com perda de pacotes. Entre as principais vantagens do HTTP/3 estão a melhoria no tempo de resposta e a redução no tempo de carregamento das páginas em redes com alta latência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3f9raAQv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2qj8wsphcoayzlbz1tk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3f9raAQv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m2qj8wsphcoayzlbz1tk.png" alt="3-principais-versoes-http" width="778" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Custos
&lt;/h3&gt;

&lt;p&gt;Outra coisa interessante sobre versionamento são os custos. "Mas o que seriam esses custos? É em relação à performance? Ou é em relação ao valor do maquinário?", bom, o custo envolve o maquinário quando se trata de atualização e maquinário é dinheiro.&lt;/p&gt;

&lt;p&gt;Para falar mais sobre isso, eu questionei um professor acadêmico da área de redes e um coordenador de TI - pelo menos até o momento - do IFRN.&lt;/p&gt;

&lt;p&gt;Vamos lá para algumas perguntas:&lt;/p&gt;

&lt;p&gt;Qual(is) o(s) custo(s) para atualizar um servidor legado (antigo) para utilizar um protocolo mais atual?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Creio que o "custo" seja superar alguns desafios, como a necessidade de atualização de infraestrutura e a compatibilidade com alguns servidores e navegadores mais antigos. É aquela história: eu vou lançar uma versão mais nova do protocolo, só que precisarei atualizar todo o meu parque tecnológico (ou dos meus clientes) e isto pode em algum momento gerar uma incompatibilidade: o cliente ficar sem acesso aos recursos temporariamente, etc..&lt;/p&gt;

&lt;p&gt;&lt;em&gt;César A. F. Azevedo - Professor de redes do IFRN-JC&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se a pessoa tiver um servidor legado (antigo), compensa fazer uma atualização em termo financeiro? (Pergunta adaptada).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Depende, a maioria dos servidores web que se usam por aí são software livre, não vai ter custo financeiro de atualizar, então nesse sentido compensaria. Mas update de um software geralmente aumenta/muda os requisitos das dependências e aí se você não pode atualizar uma dependência comum a outro serviço além do servidor http, isso se torna um problema.[...] Tem muita coisa que não necessariamente é relacionado ao protocolo que pode ser complicado para uma atualização. É bom sempre manter software atualizado, mas as vezes tem uns problemas que lhe impedem.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rezembrim P. Soares - Coordenador de TI no IFRN-JC&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Com isso podemos chegar a uma leve conclusão que pode ser que você tenha custos para atualização do protocolo em seu servidor HTTP, mas isso é algo a se ver com calma com a equipe de infraestrutura para saber se compensa em seu cenário.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Vantagens e Desvantagens
&lt;/h2&gt;

&lt;p&gt;O HTTP é um protocolo com várias vantagens e desvantagens, afinal, nem tudo são flores.&lt;/p&gt;

&lt;p&gt;As principais vantagens do http são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplicidade: Protocolo de comunicação simples, que permite a transferência de informações de forma clara e direta entre o servidor e o cliente.&lt;/li&gt;
&lt;li&gt;Amplamente utilizado: É um dos protocolos mais utilizados na Internet e é suportado por praticamente todos os navegadores e servidores.&lt;/li&gt;
&lt;li&gt;Flexibilidade: Permite que diferentes tipos de conteúdo, como textos, imagens, vídeos e áudios, sejam transferidos na mesma conexão.&lt;/li&gt;
&lt;li&gt;Caching: Suporta a técnica de cache, que permite que o cliente armazene em cache recursos que foram previamente baixados, reduzindo o tempo de carregamento da página.&lt;/li&gt;
&lt;li&gt;Fácil depuração: Protocolo de texto simples, o que facilita a depuração de problemas em caso de falhas ou erros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Falta de segurança: Não possui mecanismos de segurança integrados para proteger a comunicação entre o cliente e o servidor. Isso torna a comunicação vulnerável a ataques de interceptação, roubo de informações e invasão de privacidade.&lt;/li&gt;
&lt;li&gt;Desempenho: Usa um modelo de solicitação-resposta, o que significa que uma solicitação é feita pelo cliente e uma resposta é enviada pelo servidor para cada recurso solicitado. Isso pode levar a atrasos de desempenho significativos, especialmente para sites com muitos recursos.&lt;/li&gt;
&lt;li&gt;Limitações de cache: Usa cache do lado do cliente para melhorar o desempenho, mas o cache tem suas limitações. Por exemplo, os dados em cache podem se tornar obsoletos rapidamente, o que pode levar a resultados imprecisos ou desatualizados.&lt;/li&gt;
&lt;li&gt;Limitações de conexão: É limitado pelo número de conexões que um servidor pode suportar simultaneamente. Isso pode levar a problemas de desempenho quando muitos clientes tentam acessar um site ao mesmo tempo.&lt;/li&gt;
&lt;li&gt;Restrições de comunicação: É um protocolo de comunicação de texto simples, o que significa que ele é limitado a transmitir apenas dados de texto. Isso pode ser um problema quando se deseja transmitir outros tipos de dados, como imagens, vídeos ou áudio, que podem exigir outros protocolos para serem transmitidos eficientemente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iuk8PygT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qkzvbnzny8aclnwbyyu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iuk8PygT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qkzvbnzny8aclnwbyyu0.png" alt="observacao" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Creio que este post tenha sido útil para você de alguma forma, senão você não teria chegado até aqui. O protocolo visto neste post é muito mais denso do que eu apresentei aqui, então você pode se aprofundar mais no assunto caso queira.&lt;/p&gt;

&lt;p&gt;Se não for pedir demais, compartilhe este post com seus colegas que estão estudando sobre o HTTP ou que vão estudar. Deixe sua reação e comenta se gostou do conteúdo, nos vemos em um próximo post.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lV_JWIHi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llhd5kpi9t7hmvur4ddb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lV_JWIHi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llhd5kpi9t7hmvur4ddb.png" alt="meme-gatos-fazendo-as-pazes" width="613" height="521"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Participação&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.linkedin.com/in/rezembrim/"&gt;Rezembrim de Paula Soares&lt;/a&gt;: Servidor público de TI no IFRN;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://lattes.cnpq.br/1163433808490141"&gt;César Augusto de Freitas Azevedo&lt;/a&gt;: Professor de Infraestrutura de Redes no IFRN.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.manageengine.com/network-monitoring/network-protocols.html#:~:text=Network%20protocols%20are%20a%20set%20of%20rules%2C%20conventions%2C,information%2C%20regardless%20of%20their%20infrastructure%20and%20design%20disparities."&gt;Network protocols&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/pt-br/learning/network-layer/what-is-a-protocol/"&gt;O que é um protocolo? | Definição de protocolo de rede&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Communication_protocol"&gt;Communication protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FOROUZAN, B. A. Comunicação de dados e redes de computadores. 4. ed. Porto Alegre: AMGH Editora, 2014.&lt;/li&gt;
&lt;li&gt;FOROUZAN, B. A. TCP/IP Protocol Suite. 4th ed. McGraw-Hill, 2013.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/HTTP2/HTTP2_vs_HTTP1.1"&gt;HTTP/2 vs HTTP/1.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://http3-explained.haxx.se/pt-br/what-is-http3#when-will-it-be-available"&gt;What is HTTP/3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/learning/ddos/glossary/hypertext-transfer-protocol-http/"&gt;O que é HTTP?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>redes</category>
      <category>webdev</category>
      <category>infraestrutura</category>
      <category>http</category>
    </item>
    <item>
      <title>Quem é melhor? ORM ou SQL puro?</title>
      <dc:creator>Lucas Mateus</dc:creator>
      <pubDate>Fri, 21 Apr 2023 21:12:41 +0000</pubDate>
      <link>https://forem.com/lucas_jdev/quem-e-melhor-orm-ou-sql-puro-kjb</link>
      <guid>https://forem.com/lucas_jdev/quem-e-melhor-orm-ou-sql-puro-kjb</guid>
      <description>&lt;p&gt;Olá! Hoje vamos ver um pouco sobre o dilema de usar ORM ou SQL puro nos seus projetos. Nesse post vou abordar os seguintes pontos:&lt;/p&gt;

&lt;p&gt;
  Sumário
  &lt;ul&gt;
&lt;li&gt;1. Introdução

&lt;ul&gt;
&lt;li&gt;1.1 SQL Puro?&lt;/li&gt;
&lt;li&gt;1.2 O que é ORM?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. Performance

&lt;ul&gt;
&lt;li&gt;2.1 O famoso N+1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. Produtividade&lt;/li&gt;
&lt;li&gt;4. Escalabilidade&lt;/li&gt;
&lt;li&gt;5. Conclusão
&lt;/li&gt;
&lt;/ul&gt;




&lt;/p&gt;
&lt;p&gt;Espero que você goste e que principalmente te ajude no dia a dia, no mais é isso e boa leitura :)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OBS: Não se esqueça de fornecer seu feedback, isso me ajuda demais em criar novos conteúdos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;=================================================&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Introdução
&lt;/h2&gt;

&lt;p&gt;Se você já aprendeu a construir uma aplicação, nem que seja simples, provavelmente já ouviu falar de banco de dados. Por mais que você possa não saber o que é isso, eu vou te explicar de maneira superficial (coloca nos comentários se você quer um post especialmente sobre banco de dados).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Banco de dados é um local é onde se guarda os dados de uma aplicação".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lucas Jdev&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alguns bancos de dados são SQL (&lt;em&gt;Structure Query Language&lt;/em&gt;) outros NoSql, mas vamos focar aqui nesse post em SQL, ok? &lt;/p&gt;

&lt;p&gt;Ok, sabendo disso, há situações no dia a dia de desenvolvimento que pode causar um impasse em algumas pessoas, como por exemplo: "Desenvolver o banco e efetuar operações com SQL puro ou usar ORM?".&lt;/p&gt;

&lt;p&gt;Caso você não saiba o que é ORM ou o que é SQL puro? fica frio e segue o fio.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.1 SQL puro
&lt;/h3&gt;

&lt;p&gt;Caso você não saiba o que é isso, basicamente é a linguagem de estilo funcional para bancos de dados relacionais, ou seja, com ela você informa para o banco o que fazer e não como fazer. Com ela conseguimos salvar os dados no banco, atualizar, deletar e efetuar até mesmo busca específicas sobre os dados.&lt;/p&gt;

&lt;p&gt;SQL é extremamente importante para a vida de desenvolvedor, ora, se você nunca sofreu um pouquinho criando conexões e lidando com transações jdbc da vida, você ainda não viveu o suficiente kkkk, mas brincadeiras a parte, é muito interessante saber como utilizar ela pois ela é a base para entender ORM.&lt;/p&gt;

&lt;p&gt;"O que raios é esse negócio de ORM que você tanto fala?", calma, segue o fio.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 O que é ORM?
&lt;/h3&gt;

&lt;p&gt;ORM é uma sigla para Object-Relational Mapping, ou seja, Mapeamento Objeto Relacional. ORM por si só é uma técnica de permite que as aplicações trabalhem com objetos em vez de lidar com tabelas sql por cima dos panos. Entretanto, geralmente quando falamos de ORM, estamos nos referindo a ferramentas de desenvolvimento, os famosos frameworks ORM.&lt;/p&gt;

&lt;p&gt;Existem diversos frameworks ORM no mercado como o famoso Prisma, Elouquent, Hibernate etc. Ele é muito útil no dia a dia, pois possibilita padronizar e automatizar tarefas rotineiramente repetitivas no cotidiano de dev.&lt;/p&gt;

&lt;p&gt;Agora que você já sabe superficialmente o que são ambos, tenha fixado na cabeça uma coisa "Nem tudo são flores". Usar SQL puro tem suas vantagens, muito boas por sinal, mas também não é um mar de rosas. A mesma ideia serve para ORM, pois há muitas vantagens como produtividade de desenvolvimento, entretanto, há algumas desvantagens no seu uso a depender do caso.&lt;/p&gt;

&lt;p&gt;"Mas o que são essas vantagens e desvantagens na real? Dá pra fazer algum comparativo entre ambos?", neste post eu pretendo trazer 3 pontos que eu julguei interessantes para ser debatidos (caso discorde, comenta aí) são eles: Performance, produtividade e escalabilidade.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Performance
&lt;/h2&gt;

&lt;p&gt;Sim, comecei por uma das partes mais polêmicas quando se trata de ORM. "Mas por quê?" Algumas pessoas afirmam que ORM é muito menos performático do que usar SQL puro. De fato, não há como negar que ter uma camada de abstração em uma infraestrutura como a camada de dados aumenta a latência, isso é inquestionável. Porém, entretanto e todavia, essa diferença de latência pode ser desprezível a depender do nível da tua aplicação.&lt;/p&gt;

&lt;p&gt;"Calma, que raios de camada é essa que você falou?", segue o fio das imagens:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Ffddw1ei93uiw4hwhoxtn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Ffddw1ei93uiw4hwhoxtn.png" alt="ilustracao-comunicacao-sql-puro"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na imagem acima você consegue ver como é o processo com SQL puro na sua aplicação. Resumindo, você terá um driver de conexão que permite a conexão direta com o banco de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fxie31aqwjfqrjevjja1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fxie31aqwjfqrjevjja1v.png" alt="ilustracao-comunicacao-com-orm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Já nesta imagem você consegue ver claramente que há uma camada a mais, camada essa que pode gerar um overhead adicional na aplicação, nossa camada de ORM, uma abstração a mais.&lt;/p&gt;

&lt;p&gt;"Mas pera... em um caso hipotético que eu tenho uma aplicação de CRUD para uma padaria da minha vizinhança, qual é melhor? julgando unicamente Performance?", já que você está com teimosia, vamos julgar somente nesse critério. Bom... a resposta é que não faz diferença nesse caso kkkk. A latência só influencia mais em aplicações mais robustas que precisam mais do que um CRUD simples ou consultas simples.&lt;/p&gt;

&lt;p&gt;"Ah Lucas, mas meu papel como desenvolvedor não é fazer o melhor software possível?", lembre-se que decisões não são tomadas levando somente um fator em consideração, deve ser levado em consideração a produtividade da equipe (ou euquipe), tempo de entrega, requisitos do sistema etc. Criar software não é só pegar umas tecnologias aleatórias e implementar, vai muito além do que isso.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.1 O famoso N+1
&lt;/h3&gt;

&lt;p&gt;"Ei, eu vi uma coisa uma vez sobre o problema N+1 que os ORM's têm!", bem lembrado, esses frameworks de persistência geralmente possui um "problema" de consultar mais do que devem, não entendeu? então se liga nesse caso:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você criou um CRUD relacional simples com o hibernate em que um cliente possui vários pedidos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;código das classes:&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="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@OneToMany&lt;/span&gt;
    &lt;span class="kd"&gt;private&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;Pedido&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;pedidos&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@ManyToOne&lt;/span&gt; 
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt;
    &lt;span class="c1"&gt;// getters e setters&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de ter criado as classes que serão as representações de tabelas no banco, vamos para o cenário em que você chama um findAll para clientes, ou seja, você busca uma lista de todos os clientes que estão contidos no banco de dados.&lt;/p&gt;

&lt;p&gt;as queries geradas pelo ORM seriam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;CLIENTE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;PEDIDO&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID_CLIENTE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;PEDIDO&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID_CLIENTE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;PEDIDO&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID_CLIENTE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;PEDIDO&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID_CLIENTE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&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;O ORM entende que primeiro deve fazer a query &lt;code&gt;SELECT * FROM CLIENTE&lt;/code&gt;, mas daí, depois que ele fez, ele percebe que precisa agora dos pedidos do cliente, ou seja, para cada uma consulta de buscar todos os clientes, ele tem que ir mais N vezes no banco para pegar os dados agregados.&lt;/p&gt;

&lt;p&gt;"Por quê o ORM trabalha desse jeito? tá só gerando query indesejada, seria muito mais vantajoso fazer um INNER JOIN com SQL puro", de fato tá criando queries indesejadas, deixando o sistema mais suscetível a gargalos futuros, mas há solução para isso, geralmente é simples a correção disso. A curva de aprendizado para sacar que esse problema existe e solucionar não é grande, principalmente se a pessoa souber manipular SQL.&lt;/p&gt;

&lt;p&gt;ORM's geralmente possuem uma flexibilidade muito boa para solucionar esse tipo de problema, como por exemplo, escrevendo uma query na linguagem do framework ou escrevendo SQL puro dentro do ORM.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Produtividade
&lt;/h2&gt;

&lt;p&gt;Nem só de performance vive o homem (na minha cabeça isso teve graça, mas enfim). Produtividade é um fator muito relevante quando se trata de tomada de decisão, sem ele, não conseguimos ter uma boa dimensão do que vale a pena ou não.&lt;/p&gt;

&lt;p&gt;SQL pode ser muito produtivo em termos de escrita de queries quando há uma equipe que sabe muito bem o que está fazendo. No entanto, em termos de manutenção, pode ser um desafio, especialmente quando há uma leve alteração na estrutura do banco de dados ou uma migração para um SGBD (Sistema Gerenciador de Banco de dados) diferente. Desenvolvedores podem usar recursos específicos de um determinado SGBD, como PostgreSQL, Oracle ou MySQL, para alcançar um desempenho melhor, mas isso pode se tornar uma dor de cabeça na hora de migrar para outro SGBD. Além disso, uma mudança em uma coluna no banco de dados pode exigir alterações em várias queries para se adequar à mudança.&lt;/p&gt;

&lt;p&gt;"Mas e o ORM?" - Bem, há uma vantagem muito grande em termos de produtividade que os ORM's trazem para nós, principalmente os mais conhecidos. Os ORM's permitem uma facilidade em termos de padronização de queries SQL, permitindo a troca de SGBD (os quais eles têm suporte) sem muitas dores de cabeça. Muitos ORM's conseguem gerar o SQL das tabelas e colocá-lo em um arquivo &lt;code&gt;.sql&lt;/code&gt; para ajudar em futuras migrações, alguns geram até mesmo o famoso DER (Diagrama Entidade-Relacionamento), como é o caso do Prisma.&lt;/p&gt;

&lt;p&gt;Venhamos e convenhamos, é extremamente produtivo conseguir fazer isso rapidamente com poucas configurações durante o desenvolvimento do código.&lt;/p&gt;

&lt;p&gt;Usando SQL puro, você provavelmente teria que ter um workbench para gerar os relacionamentos do modelo lógico, e seria necessário um pouco de trabalho para obter esse diagrama.&lt;/p&gt;

&lt;p&gt;Além disso, muitos frameworks ORM já fornecem queries prontas para consumo no desenvolvimento, como métodos como findAll, findById, create e delete, o que diminui o custo de manutenção de uma maneira surreal, dependendo do caso.&lt;/p&gt;

&lt;p&gt;De longe, o ORM é maravilhoso para criar um MVP.&lt;/p&gt;

&lt;p&gt;Então acho que até agora está 1 x 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Escalabilidade
&lt;/h2&gt;

&lt;p&gt;Primeiro de tudo, o que é Escalabilidade? Ao meu ver, é a capacidade do software de continuar funcionando de forma eficiente mesmo quando a quantidade de usuários, transações ou dados aumenta significativamente.&lt;/p&gt;

&lt;p&gt;Ok, agora vamos definir uma coisa: tanto ORM quanto SQL puro podem ser escaláveis, desde que utilizados corretamente e com a configuração adequada do banco de dados e do ambiente de execução.&lt;/p&gt;

&lt;p&gt;No caso do ORM, ele pode facilitar a implementação de boas práticas de otimização e escalabilidade, como a criação de índices, o uso de cache de segundo nível, o lazy loading e a escrita de consultas otimizadas.&lt;/p&gt;

&lt;p&gt;Dependendo do tipo de projeto que você está trabalhando, usar um ORM pode não ser a melhor opção se o modelo de dados for muito complexo. Isso porque, quanto mais complexo o modelo, mais difícil pode ser escrever consultas otimizadas usando o ORM. Além disso, se você estiver lidando com muitos usuários ou muitos dados ao mesmo tempo, pode ser necessário ter um controle mais detalhado do acesso ao banco de dados. Isso pode ser difícil de fazer usando um ORM, então pode ser melhor usar SQL puro ou até mesmo procedimentos armazenados no banco de dados para garantir que tudo funcione bem e que você possa controlar quem acessa o que.&lt;/p&gt;

&lt;p&gt;Entretanto, pode ser também mais difícil manter uma aplicação com SQL puro, pois quanto mais controle você tem sobre as consultas, mais cuidado precisa ter em pontos de manutenção.&lt;/p&gt;

&lt;p&gt;Particularmente falando, eu considero um empate, apesar dos benefícios e desvantagens do ORM, o uso de SQL puro também pode trazer uma grande dor de cabeça, dependendo da equipe que está trabalhando no projeto.&lt;/p&gt;

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

&lt;p&gt;Nesta postagem, foram discutidas algumas vantagens e desvantagens do uso de ORM e SQL puro. Embora muitos esperassem um vencedor claro na disputa, a verdade é que a escolha entre as tecnologias depende do contexto de cada projeto.&lt;/p&gt;

&lt;p&gt;Se você está acostumado com o uso de SQL puro, pode ser interessante experimentar o uso de ORM na sua linguagem de programação. Não se limite a uma única tecnologia, pois quanto mais você souber extrair o melhor de diferentes ferramentas, maior será sua capacidade de adaptação a diferentes stacks.&lt;/p&gt;

&lt;p&gt;Se me perguntarem qual tecnologia eu escolheria para criar uma aplicação agora, minha resposta seria ORM, pois já estou familiarizado com o processo de tradução do ORM para SQL, o que me permite ser mais produtivo. No entanto, se eu perceber que o projeto exige maior desempenho ou refinamento, provavelmente começaria com SQL puro. Mas, é importante lembrar que essa é apenas uma opinião pessoal e que a escolha entre as tecnologias deve ser feita com base no contexto e nas necessidades específicas de cada projeto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Texto sem contexto, vira pretexto!"&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Elemar Júnior&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;ul&gt;
&lt;li&gt;Youtube:

&lt;ul&gt;
&lt;li&gt;Código Fonte TV: ORM (A Ponte entre Orientação a Objetos e o Banco de Dados);&lt;/li&gt;
&lt;li&gt;Rodrigo Branas: SQL ou ORM: E Agora? (Não tenha medo de SQL);&lt;/li&gt;
&lt;li&gt;Balta.io: ORM vs SQL puro; &lt;/li&gt;
&lt;li&gt;DevSuperior: Problema N+1 Consultas;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Artigos:

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.edgedb.com/blog/why-orms-are-slow-and-getting-slower" rel="noopener noreferrer"&gt;Why ORMs are slow (and getting slower)&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://stackoverflow.com/questions/61637545/how-to-solve-the-n1-problem-in-spring-data-jpa" rel="noopener noreferrer"&gt;How to solve the N+1 problem in Spring Data JPA? - Stack Overflow&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/codex/should-you-use-raw-sql-or-an-orm-18468c11c1a9" rel="noopener noreferrer"&gt;Should you use Raw SQL or an ORM?&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/pedrocardoz0/orm-s-x-query-builder-s-x-raw-sql-2oal"&gt;ORM's x Query Builder's x Raw SQL&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>orm</category>
      <category>sql</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Arrays e Matrizes</title>
      <dc:creator>Lucas Mateus</dc:creator>
      <pubDate>Mon, 10 Apr 2023 19:09:39 +0000</pubDate>
      <link>https://forem.com/lucas_jdev/arrays-e-matrizes-2ga</link>
      <guid>https://forem.com/lucas_jdev/arrays-e-matrizes-2ga</guid>
      <description>&lt;p&gt;Olá! Hoje vamos ver um pouco sobre arrays e matrizes, abordando os seguintes tópicos:&lt;/p&gt;

&lt;p&gt;
  Sumário
  &lt;ul&gt;
&lt;li&gt;1. Introdução

&lt;ul&gt;
&lt;li&gt;1.1 O que são?&lt;/li&gt;
&lt;li&gt;1.2 Para quê serve?&lt;/li&gt;
&lt;li&gt;1.3 Como se faz?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2. Características

&lt;ul&gt;
&lt;li&gt;2.1 Armazenamento contíguo de elemento&lt;/li&gt;
&lt;li&gt;2.2 Acesso indexado aos elementos&lt;/li&gt;
&lt;li&gt;2.3 Tamanho fixo&lt;/li&gt;
&lt;li&gt;2.4 Armazenamento bidimensional&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3. Aplicabilidade

&lt;ul&gt;
&lt;li&gt;3.1 Situação Acadêmica&lt;/li&gt;
&lt;li&gt;3.2 Situação Real&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;4. Conclusão
&lt;/li&gt;
&lt;/ul&gt;




&lt;/p&gt;
&lt;p&gt;Espero que goste e qualquer coisa é só mandar feedback.&lt;/p&gt;

&lt;p&gt;=================================================&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Introdução
&lt;/h2&gt;

&lt;p&gt;Certo dia estava num aplicativo de mensagens quando eu vi status (acabei de entregar o app kkkk) de uma pessoa vendo um conteúdo sobre Vetores e matrizes, daí eu tive uma ideia de elaborar um conteúdo sobre isso sobre uma perspectiva de aplicabilidade acadêmica e de mercado. Sem mais delongas, vamos logo começar isso.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.1 O que são?
&lt;/h3&gt;

&lt;p&gt;Se você está chegando aqui sem nenhuma ideia do que são essas coisas, vou te dá primeiro a definição. suave? Bora lá.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;matrizes e vetores são estruturas de dados que permitem o armazenamento de um conjunto de valores em uma única variável&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Definição Acadêmica&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa definição é interessante, creio que podemos ficar com ela. "Ah, mas eu não sei o que é estrutura de dados!", então lá vai uma explicação rápida: São formas de guardar e organizar informações em um computador. Pronto, agora você sabe o que é... pelo menos tem noção do que é kkkk.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.2 Para quê serve?
&lt;/h3&gt;

&lt;p&gt;Matrizes e arrays são um tipo de mecanismo para organizar e manipular dados de maneira organizada, logo, é uma forma .&lt;/p&gt;

&lt;p&gt;Você pode até pensar: "Mas não é tão simples assim na prática, não é possível", vamos lá... o nível de dificuldade de aplicabilidade pode ser maior a depender do problema que enfrentamos, entretanto, em termo conceitual, é isso.&lt;/p&gt;

&lt;p&gt;"Mas Lucas, eu preciso de algo mais específico para cada um.", ok, vou te ajudar nessa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arrays&lt;/strong&gt;: São usados para armazenar vários valores do mesmo tipo em uma lista ordenada, onde cada valor é identificado por um índice numérico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Matrizes&lt;/strong&gt;: São como arrays multidimensionais, ou seja, são usadas para armazenar valores em uma tabela com duas ou mais dimensões.&lt;/p&gt;

&lt;p&gt;Matrizes geralmente são mais complicadas de se entender geralmente, mas vamos ver isso melhor com o decorrer do post, então vem comigo.&lt;/p&gt;
&lt;h3&gt;
  
  
  1.3 Como se faz?
&lt;/h3&gt;

&lt;p&gt;Para esse post utilizarei Java, mas você é livre para tentar usar os exemplos na linguagem de preferência.&lt;/p&gt;

&lt;p&gt;Exemplo_1: Você está elaborando um sisteminha para o gerenciamento de pessoas que foram convidadas para o casamento de um parente bem próximo seu (você está sendo pago). Você está programando tranquilamente, até que se depara com um estresse gigantesco, precisa fazer uma lista de nomes das pessoas que irão comparecer e depois imprimir no console 1 por 1. Em tese irão comparecer 5 pessoas (ciclo social pequeno).&lt;/p&gt;

&lt;p&gt;Vamos para ideias de implementação...&lt;/p&gt;

&lt;p&gt;Primeira ideia:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjjknntxzo2o44yr8rza0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjjknntxzo2o44yr8rza0.png" alt="ideia_1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa ideia não é legal, estamos ferindo o princípio de não se repetir, estamos criando variáveis de maneira exacerbada explicitamente. Será que não tem alguma ideia mais interessante?&lt;/p&gt;

&lt;p&gt;Segunda ideia:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fdmhu0fdebun1wuwofs6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fdmhu0fdebun1wuwofs6y.png" alt="ideia_2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"MINHA NOSSA, NÃO ENTENDI ABSOLUTAMENTE NADA DO QUE VOCÊ FEZ!!!", o intuito é realmente você não entender tudo assim de cara, agora vamos destrinchar o que foi feito.&lt;/p&gt;

&lt;p&gt;Começaremos a entender as coisas a partir da linha 5, nela temos &lt;code&gt;String convidados[] = new String[5]&lt;/code&gt; que significa que estamos criando uma espécie de caixinha que contém 5 strings, "caixinhas? Quê??", calma, basicamente o código está indicando para a memória criar 5 espaços internos para a variável convidados.&lt;/p&gt;

&lt;p&gt;Uma analogia a esse tipo de compreensão é imaginar que você chega em uma pessoa que faz bolos para entrega. Provavelmente a primeira pergunta que ela irá fazer a você é a quantidade de pessoas que irão comer, logo o tamanho do bolo será proporcional a quantidade. É semelhante a isso que é a estrutura de declaração de arrays, você informa o tipo e a quantidade.&lt;/p&gt;

&lt;p&gt;Da linha 6 à linha 8 você pode perceber que ocorre atribuição de valores para cada posição conforme a imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fgjuwxj3ifg3hhucse4e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fgjuwxj3ifg3hhucse4e1.png" alt="imagem_memoria"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Pera... começa no 0? Por quê????"&lt;/p&gt;

&lt;p&gt;A origem do uso da indexação começando em 0 nos arrays é amplamente atribuída ao linguista e cientista da computação dinamarquês Kristen Nygaard, co-inventor da linguagem de programação Simula, que introduziu essa convenção nos primeiros relatórios técnicos da linguagem Simula 67, publicados em 1967.&lt;/p&gt;

&lt;p&gt;Outra possível razão para o uso de índices baseados em 0 é que eles permitem que as fórmulas para calcular o endereço de memória de um elemento sejam mais simples e eficientes, pois não há necessidade de adicionar um deslocamento à base do endereço. Essa escolha também pode ter sido influenciada por convenções matemáticas que usam índices baseados em 0.&lt;/p&gt;

&lt;p&gt;Vale ressaltar que nem todas as linguagens de programação usam índices baseados em 0 para arrays, algumas usam base 1 ou outras convenções.&lt;/p&gt;

&lt;p&gt;Iniciando a análise do código, em nosso &lt;code&gt;for&lt;/code&gt; podemos ver duas coisas bem interessantes, o &lt;code&gt;convidados.length&lt;/code&gt; que serve para pegar o tamanho total do array, no caso 5. O segundo fator a ser observado é dentro do sysout, onde temos &lt;code&gt;convidados[i]&lt;/code&gt;, ou seja, pegue o convidado que esteja na posição i.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;OBS&lt;/strong&gt;: Poderia ser um foreach, mas pode ser que alguém queira implementar em outra linguagem que não tenha esse recurso, então vai puro mesmo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  2. Características
&lt;/h2&gt;

&lt;p&gt;Tudo na área de tecnologia possui particularidades, isso serve para paradigmas como &lt;a href="https://dev.to/lucas_jdev/orientacao-a-objetos-4nkk"&gt;orientação a objetos&lt;/a&gt;, programação funcional, programação reativa etc. Dessa forma, podemos começar a falar sobre alguns pontos característicos.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.1 Armazenamento contíguo de elemento
&lt;/h3&gt;

&lt;p&gt;Quando dizemos que elementos estão armazenados contiguamente em um array ou matriz, isso significa que os elementos são armazenados em locais de memória adjacentes, um após o outro. Isso é importante porque permite que o acesso aos elementos seja rápido e eficiente.&lt;/p&gt;

&lt;p&gt;"Eu meio que entendi, mas você pode me fornecer algum exemplo didático?" bora lá.&lt;/p&gt;

&lt;p&gt;Situação:&lt;br&gt;
Imagine que você tem uma prateleira com uma coleção de livros. Se você organizar os livros em ordem alfabética e deixar um espaço vazio entre cada livro, pode ser difícil encontrar um livro específico rapidamente. Mas, se você colocar todos os livros juntos em ordem alfabética, sem deixar espaços vazios, será mais fácil encontrar o livro que está procurando.&lt;/p&gt;

&lt;p&gt;Isso é semelhante ao armazenamento contíguo em arrays e matrizes.&lt;/p&gt;

&lt;p&gt;Além disso, o armazenamento contíguo também torna mais fácil para o processador acessar os elementos do array ou matriz. Isso ocorre porque o processador pode acessar uma região contígua de memória de uma só vez, em vez de precisar buscar elementos em diferentes locais da memória. É como se o processador pudesse pegar um grupo de livros da prateleira de uma só vez, em vez de precisar pegar um livro de cada vez em locais diferentes.&lt;/p&gt;

&lt;p&gt;Louco né? Eu não sei você, mas acho isso sensacional.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.2 Acesso indexado aos elementos
&lt;/h3&gt;

&lt;p&gt;Para entender melhor como funciona o acesso indexado, vamos voltar ao exemplo dos livros na prateleira. Se você organizou seus livros em ordem alfabética e sem espaços vazios, você pode encontrar um livro específico rapidamente usando a primeira letra do título como referência. Por exemplo, se você quiser encontrar o livro "Dom Casmurro", você pode ir direto à seção "D" da prateleira e procurar pelo livro.&lt;/p&gt;

&lt;p&gt;Caso você não consiga visualizar isso na sua mente, é basicamente assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fqifj3aev7gzuxbz6c0iq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fqifj3aev7gzuxbz6c0iq.png" alt="fluxograma_pratileira"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em um array ou matriz, o índice ou posição funciona da mesma forma que a primeira letra do título do livro. Cada elemento do array ou matriz é armazenado em uma posição específica, que é identificada por um índice ou posição. Por exemplo, em um array de números inteiros, o primeiro elemento é armazenado na posição 0, o segundo na posição 1, o terceiro na posição 2 e assim por diante.&lt;/p&gt;

&lt;p&gt;Quando queremos acessar um elemento específico do array ou matriz, usamos o índice ou posição correspondente. Por exemplo, se quisermos acessar o terceiro elemento de um array de números inteiros, usamos o índice 2, que corresponde à posição 2 do array.&lt;/p&gt;

&lt;p&gt;O acesso indexado é importante porque nos permite acessar elementos específicos de um array ou matriz de forma rápida e eficiente. Em vez de percorrer todos os elementos do array ou matriz em busca de um elemento específico, podemos ir direto à posição correspondente usando o índice ou posição.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.3 Tamanho fixo
&lt;/h3&gt;

&lt;p&gt;Um array ou matriz com tamanho fixo é aquele que possui uma quantidade pré-definida de elementos. Esse tamanho não pode ser alterado durante a execução do programa, ou seja, ele é fixo desde o momento em que o array ou matriz é criado.&lt;/p&gt;

&lt;p&gt;Uma analogia para entender o conceito de tamanho fixo é a de uma caixa de sapatos. Imagine que você precisa organizar uma coleção de sapatos em casa e decide usar caixas de sapato para armazená-los. Se você escolher caixas de tamanhos diferentes, pode ter problemas para armazenar os sapatos de maneira organizada e eficiente. Por outro lado, se você escolher caixas de tamanho fixo, poderá acomodar cada par de sapatos de forma ordenada e padronizada, sem desperdiçar espaço.&lt;/p&gt;

&lt;p&gt;De maneira similar, ao usar arrays ou matrizes com tamanho fixo, podemos garantir que todos os elementos serão armazenados de forma organizada e padronizada, ocupando um espaço de memória conhecido e previsível. Isso torna mais fácil o acesso e manipulação dos elementos, pois não precisamos nos preocupar com variações no tamanho do array ou matriz.&lt;/p&gt;

&lt;p&gt;No entanto, é importante ressaltar que o tamanho fixo pode limitar a flexibilidade do programa. Se precisarmos armazenar mais elementos do que o tamanho fixo permite, será necessário criar um novo array ou matriz com um tamanho maior e copiar os elementos do array anterior. Isso pode gerar um overhead de memória e processamento.&lt;/p&gt;
&lt;h3&gt;
  
  
  2.4 Armazenamento bidimensional
&lt;/h3&gt;

&lt;p&gt;Uma maneira de entender o armazenamento bidimensional é imaginar uma tabela ou uma planilha. Se você já trabalhou com uma planilha eletrônica, como o Excel, sabe que ela é organizada em células, que formam uma grade bidimensional com linhas e colunas. Cada célula pode armazenar um valor, como um número, um texto ou uma fórmula.&lt;/p&gt;

&lt;p&gt;Da mesma forma, em uma matriz bidimensional, os elementos são organizados em uma grade com linhas e colunas. Cada elemento é identificado por um par de índices, um para a linha e outro para a coluna. Por exemplo, em uma matriz com 3 linhas e 4 colunas, podemos acessar o elemento da segunda linha e terceira coluna usando os índices (1, 2).&lt;/p&gt;

&lt;p&gt;Uma analogia para entender a organização bidimensional das matrizes é imaginar um tabuleiro de xadrez. O tabuleiro é uma matriz com 8 linhas e 8 colunas, onde cada célula pode conter uma peça de xadrez ou estar vazia. Cada célula é identificada por um par de índices, que correspondem à linha e coluna da célula.&lt;/p&gt;

&lt;p&gt;O armazenamento bidimensional permite que as matrizes sejam usadas para representar informações que possuem uma estrutura de grade, como imagens, tabelas, mapas, entre outras. Além disso, as operações matemáticas com matrizes, como a multiplicação de matrizes, também são baseadas no armazenamento bidimensional.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Aplicabilidade
&lt;/h2&gt;

&lt;p&gt;Uma coisa muito comum é estudantes de programação não saberem como aplicar arrays ou matrizes na vida acadêmica e em aplicações reais, então para solucionar esse pequeno probleminha - pelo menos tentar - vou te mostrar algumas situações acadêmicas e reais.&lt;/p&gt;
&lt;h3&gt;
  
  
  3.1 Situação acadêmica
&lt;/h3&gt;

&lt;p&gt;"Capture do teclado valore para o preenchimento de uma matriz M 3x3. Após a captura imprima a matriz criada e encontre a quantidade de números pares e a quantidade de números ímpares."&lt;/p&gt;

&lt;p&gt;Há variadas formas de resolver esse problema, mas eu proponho a seguinte soluçã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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Scanner&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Scanner&lt;/span&gt; &lt;span class="n"&gt;scanner&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;Scanner&lt;/span&gt;&lt;span class="o"&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;in&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;impares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Captura os valores do teclado para preencher a matriz&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&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;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Digite o valor da posição ["&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"]["&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"]: "&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextInt&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;span class="c1"&gt;// Imprime a matriz criada&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;"\nMatriz criada:"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&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;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"\t"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="o"&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="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Conta a quantidade de números pares e ímpares na matriz&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;matriz&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linha&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;coluna&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;pares&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;impares&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;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Imprime a quantidade de números pares e ímpares na matriz&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;"\nQuantidade de números pares na matriz: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;pares&lt;/span&gt;&lt;span class="o"&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;"Quantidade de números ímpares na matriz: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;impares&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;p&gt;Para algumas pessoas pode ser um código muito complexo, e sim, tem sua complexidade, alegar que não há complexidade em &lt;code&gt;for&lt;/code&gt; encadeado é uma mentira. Você pode tentar entender esse código com mais calma depois, pois isso daqui é apenas uma exemplificação de aplicabilidade acadêmica.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Situação Real
&lt;/h3&gt;

&lt;p&gt;"Você está de cara para um sistema antigo de uma empresa chamada 'Betinho construção', nessa aplicação você precisa implementar no banco de dados e retornar apenas os 100 únicos clientes que essa empresa pode ter"&lt;/p&gt;

&lt;p&gt;Bom... eu não vou implementar aqui seguindo as melhores práticas de isolamento de responsabilidades como o SRP, mesmo porque eu só quero que você tenha uma noção de quando utilizar pode utilizar.&lt;/p&gt;

&lt;p&gt;Segue a minha soluçã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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClienteDAO&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;buscaClientes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Conecta ao banco de dados&lt;/span&gt;
      &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DriverManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getConnection&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jdbc:mysql://localhost:3306/meubanco"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"usuario"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"senha"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Busca todos os clientes da tabela&lt;/span&gt;
      &lt;span class="nc"&gt;Statement&lt;/span&gt; &lt;span class="n"&gt;stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createStatement&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="nc"&gt;ResultSet&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;executeQuery&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT * FROM clientes"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Cria um array de objetos Cliente e preenche com os registros obtidos do banco de dados&lt;/span&gt;
      &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;clientes&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;Cliente&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Suponha que a tabela tem no máximo 100 registros&lt;/span&gt;
      &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&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;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"nome"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"idade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;cliente&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;Cliente&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&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;,&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cliente&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="o"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Fecha a conexão com o banco de dados&lt;/span&gt;
      &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

      &lt;span class="c1"&gt;//retorna todos os clientes buscados&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;clientes&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&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;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como você pode ver, eis um exemplo hipotético de como isso pode funcionar em um caso da vida real.&lt;/p&gt;

&lt;p&gt;"Ah Lucas, mas hoje em dia há outras estruturas como p &lt;code&gt;ArrayList&lt;/code&gt;, &lt;code&gt;HashSet&lt;/code&gt; etc, então por quê iria ter isso na vida real?". Há muitos casos em que o nível técnico de alguém pode não está adaptado ao problema disposto, mas mesmo assim entregar uma solução. Acontece, não estou dizendo que a pessoa é uma má programadora, estou dizendo que pode haver um déficit técnico no projeto e cabe a você entender o cenário antes de corrigir alguma coisa.&lt;/p&gt;

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

&lt;p&gt;Pronto, vimos o que é, para que serve, quando usar, quais contextos pode encontrar etc. Esse é um pequeno estudo apesar de você ainda achar ele longo, tentei ser o mais didático possível, espero que você tenha sucesso nos estudos e é isso. A gente se vê em outro post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bibliografia&lt;/strong&gt;:&lt;br&gt;
FERREIRA, Nickerson. Aula 01 - Vetores e Matrizes. Disponível em: &lt;a href="http://docente.ifrn.edu.br/nickersonferreira/disciplinas/programacao-estruturada-e-orientada-a-objetos/aula-01-vetores-e-matrizes/view" rel="noopener noreferrer"&gt;http://docente.ifrn.edu.br/nickersonferreira/disciplinas/programacao-estruturada-e-orientada-a-objetos/aula-01-vetores-e-matrizes/view&lt;/a&gt;. Acesso em: 04 abr. 2023.&lt;br&gt;
SILVA, Vinícius Gusmão Pereira da. Estrutura de dados. São Paulo: Novatec Editora, 2013.&lt;/p&gt;

</description>
      <category>estruturadedados</category>
      <category>java</category>
      <category>array</category>
      <category>matriz</category>
    </item>
    <item>
      <title>Orientação a Objetos</title>
      <dc:creator>Lucas Mateus</dc:creator>
      <pubDate>Thu, 30 Mar 2023 19:12:01 +0000</pubDate>
      <link>https://forem.com/lucas_jdev/orientacao-a-objetos-4nkk</link>
      <guid>https://forem.com/lucas_jdev/orientacao-a-objetos-4nkk</guid>
      <description>&lt;p&gt;Olá! Hoje vamos ver um pouco sobre orientação a objetos, abordando os seguintes tópicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Introdução

&lt;ul&gt;
&lt;li&gt;1.1 História&lt;/li&gt;
&lt;li&gt;1.2 Definição&lt;/li&gt;
&lt;li&gt;1.3 Estrutura&lt;/li&gt;
&lt;li&gt;1.3.1 Classes x Objetos&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;2. Características

&lt;ul&gt;
&lt;li&gt;2.1 Alocação de memória dinâmica&lt;/li&gt;
&lt;li&gt;2.2 Encapsulamento&lt;/li&gt;
&lt;li&gt;2.3 Herança&lt;/li&gt;
&lt;li&gt;2.4 Polimorfismo&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;3. Problemas na OO

&lt;ul&gt;
&lt;li&gt;3.1 Acoplamento e coesão inadequados&lt;/li&gt;
&lt;li&gt;3.2 Herança excessiva&lt;/li&gt;
&lt;li&gt;3.3 Curva de aprendizagem&lt;/li&gt;
&lt;li&gt;3.4 Sobrecarga de memória&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;4. Quando escolher&lt;/li&gt;

&lt;li&gt;5. Conclusão&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Espero que você goste e qualquer feedback é só mandar na área de comentários :)&lt;/p&gt;

&lt;p&gt;=================================================&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1.1 História
&lt;/h3&gt;

&lt;p&gt;Caso você não queira saber sobre a história (o que considero importante), pode pular para o item 1.2. Mas, caso queira se aprofundar mais, venha comigo.&lt;/p&gt;

&lt;p&gt;A OO surgiu na década de 1960 - faz tempo pra caramba e, ao mesmo tempo, não (risos) - com dois pesquisadores do Centro Norueguês de Computação, Kristen Nygaard e Ole-Johan Dahl, que iniciaram um projeto buscando elaborar uma linguagem de Simulação de Eventos Discretos.&lt;/p&gt;

&lt;p&gt;"O que raios é Simulação de Eventos Discretos?" é um dos modelos matemáticos usados para descrever como o computador compreende a lógica dos eventos diários, mas esse não é o foco agora. Vamos continuar.&lt;/p&gt;

&lt;p&gt;Eles conseguiram desenvolver o que pretendiam criar, dando origem a SIMULA, que passou por atualizações e se tornou a SIMULA 67. Até hoje, é a mãe do paradigma orientado a objetos.&lt;/p&gt;

&lt;p&gt;Mas calma, os conceitos que você virá a conhecer não vieram diretamente dela, mas sim com a criação da Smalltalk-80, que inspirou linguagens como C++, Java, C# etc.&lt;/p&gt;

&lt;p&gt;Tudo bem, não vou cansá-lo muito sobre isso. Precisamos ir para as características da orientação a objetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Definição
&lt;/h3&gt;

&lt;p&gt;A Orientação a Objetos (OO) possui inúmeras definições, algumas muito complexas, outras simples, porém muito superficiais em termos conceituais e assim por diante. Todas as definições são semelhantes em algum ponto. Seguem algumas definições:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Orientação a objetos é uma forma de decompor sistemas complexos em módulos independentes, que podem ser compreendidos e modificados separadamente. Cada módulo é responsável por uma parte do sistema e se comunica com os outros módulos por meio de interfaces bem definidas. Essa abordagem permite que o código seja organizado de forma modular e reutilizável, facilitando a manutenção e evolução do sistema ao longo do tempo."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Uncle Bob&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antes de prosseguirmos, é importante salientar que se uma pessoa iniciante no mundo da programação ler essa definição, talvez surjam algumas perguntas, como "o que é um módulo?", "o que são interfaces? É aquilo que eu posso ver e digitar como um aplicativo de finanças?", "o que é código reutilizável?" e assim por diante. Meu ponto é que, embora essa definição seja rica, ela pode não ser tão amigável para quem está iniciando na área. Vamos continuar com outra definição.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A Orientação a Objetos é um paradigma de programação que se baseia na composição de objetos, cada um com propriedades e comportamentos que interagem entre si para atingir um objetivo. Essa abordagem tem como objetivo modelar o mundo real de forma mais próxima, permitindo a construção de sistemas mais flexíveis, reutilizáveis e fáceis de manter.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Definição acadêmica&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa definição é mais apropriada para iniciantes, mas ainda há alguns pontos que precisam ser esclarecidos, como "o que são objetos?", "o que é um sistema flexível?", "o que é um paradigma?". Dito isso, tenho uma visão que não é tão rica, mas acredito que passa bem o que é a orientação a objetos como definição.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A Orientação a objetos é um estilo de programação baseado na centralização de dados e comportamentos, com o intuito de facilitar a construção e a manutenção de um sistema ao longo do tempo, além de buscar aproximar o código da realidade."&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lucas Jdev&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em minha concepção, essa definição não é tão elegante ou rica quanto a do Uncle Bob, mas é simples e consegue transmitir com sucesso seu objetivo, que é explicar de maneira didática o que é a orientação a objetos.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3 Estrutura
&lt;/h3&gt;

&lt;p&gt;É bem possível que você, como iniciante, não tenha entendido o que eu quis dizer. Então, para esclarecer, vamos apresentar a estrutura de um código orientado a objetos. Neste post, utilizarei a linguagem Java.&lt;/p&gt;

&lt;h4&gt;
  
  
  1.3.1 Classes x Objetos
&lt;/h4&gt;

&lt;p&gt;Classes são locais onde centralizamos dados e comportamentos. Uma classe é uma abstração de modelo para objetos. Mas o que isso significa? Imagine que você precise transformar em código uma modelagem simplificada de um carro para um simulador de corridas de Fórmula 1. Considere que um carro possui características como nome, cor, ano e velocidade. A modelagem poderia ser assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3wamca7qyt8v4af9xn47.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3wamca7qyt8v4af9xn47.png" alt="classe_carro_atributos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E em código assim:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&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;nome&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;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;velocidade&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;p&gt;"Pronto, criamos nossa classe &lt;code&gt;Carro&lt;/code&gt;, mas há algo que precisa ser adicionado. A classe atual não possui comportamentos/métodos, e sabemos que na realidade um carro possui diversas ações, como acelerar e frear. Vamos implementar esses métodos agora."&lt;/p&gt;

&lt;p&gt;modelagem UML:&lt;br&gt;
&lt;a href="https://media.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%2F4w8xurps6xwskv5r9j4a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F4w8xurps6xwskv5r9j4a.png" alt="classe_carro_completa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;modelagem em código:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&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;nome&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;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;velocidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

   &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;

   &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;frear&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&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;p&gt;Objetos são instâncias criadas a partir de suas respectivas classes. "Não entendi nada!", pense comigo, se você precisar criar um carro, uma instância, como você faz isso? "Não faço ideia". Segue o fio aqui:&lt;/p&gt;

&lt;p&gt;solução UML:&lt;br&gt;
&lt;a href="https://media.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%2Fi0dyo0vwt75bqc376m7z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fi0dyo0vwt75bqc376m7z.png" alt="objeto_carro"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;solução em código:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&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;nome&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;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;velocidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

   &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;

   &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;frear&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;variacaoDeVelocidade&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;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Teste&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro_1&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;Carro&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;carro_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Corola U330"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;carro_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Branco"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;carro_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;carro_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

      &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro_2&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;Carro&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="n"&gt;carro_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Fiat Uno 1.0"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;carro_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Vermelho"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;carro_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;carro_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;velocidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;80.5&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;p&gt;Agora vamos acelerar o &lt;code&gt;carro_1&lt;/code&gt; e desacelerar o &lt;code&gt;carro_2&lt;/code&gt;.&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="c1"&gt;// ...&lt;/span&gt;
&lt;span class="n"&gt;carro_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// acelera em 20 unidades (km/h ou m/s)&lt;/span&gt;
&lt;span class="n"&gt;carro_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;frear&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// desacelera em 40 unidades (km/h ou m/s)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Provavelmente você notou que para acessar qualquer atributo ou método, utiliza-se variavel.oqueQuerAcessar. Mais adiante, vou explicar como podemos restringir algumas coisas ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Características
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Alocação de memória dinâmica
&lt;/h3&gt;

&lt;p&gt;Para falar sobre isso, primeiro veja:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Foscj1r8vr1n2cazh4x73.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Foscj1r8vr1n2cazh4x73.png" alt="fluxo_alocacao"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na programação orientada a objetos, a alocação dinâmica de memória é um recurso utilizado para alocar espaço na memória durante a execução do programa. Em outras palavras, é uma maneira de alocar a quantidade exata de memória que o programa precisa, quando ele precisa.&lt;/p&gt;

&lt;p&gt;Isso é diferente da alocação estática de memória, que aloca uma quantidade fixa de memória durante a compilação do programa. Com a alocação dinâmica, o programador pode solicitar a alocação de um bloco de memória de tamanho variável em tempo de execução, o que pode ser muito útil para lidar com situações em que o tamanho da memória necessário não é conhecido antecipadamente ou pode variar.&lt;/p&gt;

&lt;h4&gt;
  
  
  2.1.1 Valor x Referência
&lt;/h4&gt;

&lt;p&gt;Uma coisa muito importante é que a forma como os dados são armazenados na memória é diferente para objetos primitivos e não primitivos. "Como assim?" Observe:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FormaPrimitiva&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
       &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
       &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&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="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// saída: 5&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;p&gt;Na memória o salvamento ocorre assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fy35sqbbt3v01qds71quj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fy35sqbbt3v01qds71quj.png" alt="alocacao_por_valor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"E como é com objetos não primitivos?", considere os seguintes códigos:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cliente&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;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FormaNaoPrimitiva&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;objeto_1&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;Cliente&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;objeto_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;objeto_1&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;p&gt;Na memória ocorre dessa forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fm134h3umyjrjjv3r42as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fm134h3umyjrjjv3r42as.png" alt="alocacao_por_ref"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essas formas possuem nomes específicos chamados atribuição por valor e por referência, respectivamente. No modo primitivo, atribuímos um valor diretamente ao objeto. Em outras palavras, o que fizermos na variável y não afetará a variável x. Portanto, esse tipo de atribuição não promove efeito colateral no objeto posterior. No entanto, a atribuição por referência nos traz um efeito colateral grave, pois ambos os objetos compartilham a mesma instância na memória. Esse recurso visa a economia de recursos, portanto é de extrema importância tomar cuidado com isso durante o desenvolvimento de software.&lt;/p&gt;

&lt;p&gt;"Como assim efeito colateral?", observe:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FormaNaoPrimitiva&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;objeto_1&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;Cliente&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
      &lt;span class="nc"&gt;Cliente&lt;/span&gt; &lt;span class="n"&gt;objeto_2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;objeto_1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;objeto_2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Lucas"&lt;/span&gt;&lt;span class="o"&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="n"&gt;objeto_1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// saída: Lucas&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;p&gt;Sendo assim, tome muito cuidado com esse tipo de situação e se possível, evite a depender do caso.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Encapsulamento
&lt;/h3&gt;

&lt;p&gt;De forma sintetizada, encapsulamento é um conceito da OO que baseia-se em ocultar os detalhes internos dos objetos, fornecendo uma "interface" clara para o sistema.&lt;/p&gt;

&lt;p&gt;Se você não entendeu, observe o código:&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cliente&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mudaNome&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;novoNome&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;novoNome&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;novoNome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&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;=&lt;/span&gt; &lt;span class="n"&gt;novoNome&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;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mudaIdade&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;novaIdade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;novaIdade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
         &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;novaIdade&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;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que aumentamos a quantidade de detalhes para a classe cliente, mas se formos acessar o que ela tem em uma classe de teste - não estou falando necessariamente de testes com junit -, será fácil acessar, porém haverá restrições quanto aos dados passados. Faz sentido, na realidade, passar um valor negativo para a idade? Faz sentido eu passar um valor nulo para um nome? Se buscamos aproximar o código da realidade, precisamos delimitar os contextos como acontece na vida real.&lt;/p&gt;

&lt;p&gt;"O que é esse public e private?" Bom, visando o encapsulamento na linguagem Java, alguns conceitos simples precisam estar claros na sua cabeça:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Foecyt0i82d7hffxp79dv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Foecyt0i82d7hffxp79dv.png" alt="encapsulamento"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Logo, privatizamos o acesso direto a variável e acessamos por meio de métodos públicos contendo restrições de maneira interna.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OBS&lt;/code&gt;: Linguagens modernas como python e typescript possuem uma flexibilidade de fazer um set privado que funciona para acesso direto a variável.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.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%2F02dysg1rknhgkk9puf8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F02dysg1rknhgkk9puf8v.png" alt="tabela_pros_e_contras_encapsulamento"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Herança
&lt;/h3&gt;

&lt;p&gt;Herança é um dos conceitos mais complexos, apesar de ser simples de entender. Pense comigo: na vida real, a herança é algo que é passado de pais para filhos, e algumas características são transmitidas de geração em geração. Na programação, seguimos um princípio semelhante, como diz o ditado "filho de peixe, peixinho é".&lt;/p&gt;

&lt;p&gt;Partindo-se desta perspectiva, vamos pensar na seguinte modelagem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Toda pessoa possui: nome e idade;&lt;/li&gt;
&lt;li&gt;Toda pessoa física possui: nome, idade e cpf;&lt;/li&gt;
&lt;li&gt;Toda pessoa jurídica possui: nome, idade e cnpj.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como poderíamos modelar isso? Talvez fazendo uma classe para cada um com os mesmos atributos, mas... isso feriria o DRY (&lt;em&gt;Don't Repeat Yourself&lt;/em&gt;), então para isso eu proponho a seguinte modelagem:&lt;/p&gt;

&lt;p&gt;UML:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F2shjk0i9fq169klietvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2shjk0i9fq169klietvs.png" alt="pessoa_uml"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;código:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Pessoa&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;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&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;;&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;pegaNome&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;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&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;pegaIdade&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;idade&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;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PessoaFisica&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;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&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;cpf&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="kd"&gt;super&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;,&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cpf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cpf&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&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;pegaCPF&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;cpf&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;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaJuridica&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PessoaJuridica&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;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&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;cnpj&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="kd"&gt;super&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;,&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cnpj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cnpj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&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;pegaCNPJ&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;cnpj&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;p&gt;Vamos analisar esse código com calma. Observe que agora temos algumas coisas que não foram apresentadas antes como &lt;code&gt;extends&lt;/code&gt;, contrutores e o &lt;code&gt;super&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;"o que são essas coisas?", &lt;em&gt;extends&lt;/em&gt; é o termo usado para "herdar de" ou "extende de". Isso, simplesmente isso. "O que é super e esse tal de construtores?", &lt;em&gt;super&lt;/em&gt; é a forma como se referimos as classes do topo da hierarquia, ou seja, é a maneira que referenciamos superclasses. Já os construtores são uma forma de você definir uma regra de inicialização do objeto. "Como assim?", bem... em todos os casos de instanciação ao longo deste post, vc viu que inicializávamos com o &lt;code&gt;new ClasseReferencia()&lt;/code&gt;, agora iremos instanciar assim: &lt;code&gt;new ClasseReferencia(argumentos)&lt;/code&gt;. Exemplo:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Testador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt; &lt;span class="n"&gt;pf&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;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fulano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"256.774.350-22"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

      &lt;span class="nc"&gt;PessoaJuridica&lt;/span&gt; &lt;span class="n"&gt;pj&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;PessoaJuridica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ciclano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"99.274.837/0001-92"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

      &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;p&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;Pessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Beltrano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19&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;p&gt;Como você pode ver, não precisamos fazer &lt;code&gt;variavel.algumaCoisa&lt;/code&gt; para inicializar o valor dos atributos, podemos inicializar de maneira direta.&lt;/p&gt;

&lt;p&gt;Uma coisa muito curiosa que talvez quem já programe em Java rotineiramente por um tempo percebe é que "nunca" delimitamos nossas heranças.&lt;br&gt;
"Quê??", Isso mesmo, nós não nos preocupamos com isso, porém isto abre uma brecha enorme para heranças sem sentido. Exemplo:&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="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="nc"&gt;Circulo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Retangulo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;largura&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="nf"&gt;FormaGeometrica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;largura&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;largura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;largura&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;altura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Circulo&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Circulo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;raio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&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;double&lt;/span&gt; &lt;span class="nf"&gt;area&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="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;radius&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;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Retangulo&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Retangulo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;largura&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;largura&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&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;double&lt;/span&gt; &lt;span class="nf"&gt;area&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="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;largura&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;altura&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;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Fractal&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Fractal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;altura&lt;/span&gt;&lt;span class="o"&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;double&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// implementação complexa ...&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;p&gt;Esse caso é muito intrigante porque um Fractal não é uma forma geométrica, logo ele só deve ter acesso à herança se a superclasse permitir. Uma analogia a isso é que você só pode herdar os bens de alguém da sua família se essa pessoa permitir. O erro nesse exemplo ocorrerá em tempo de compilação, portanto, é importante corrigir o erro para que o programa possa ser executado corretamente.&lt;/p&gt;

&lt;p&gt;Ah, uma coisa que você ainda não tinha visto é o abstract. Na verdade, ele serve para obrigar uma classe a implementar uma determinada lógica em seus métodos abstratos. Caso seja usado na declaração da classe, o abstract serve para dizer que ela não poderá ser instanciada, apenas declarada. "Não entendi nada!!", então se liga no exemplo:&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="kd"&gt;abstract&lt;/span&gt; &lt;span class="n"&gt;sealed&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="n"&gt;permits&lt;/span&gt; &lt;span class="nc"&gt;Circulo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Circulo&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Circulo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;raio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&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;double&lt;/span&gt; &lt;span class="nf"&gt;area&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="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;raio&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;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Testador&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="c1"&gt;// forma errada&lt;/span&gt;
      &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="n"&gt;forma_1&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;FormaGeometrica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// forma certa&lt;/span&gt;
      &lt;span class="nc"&gt;FormaGeometrica&lt;/span&gt; &lt;span class="n"&gt;forma_2&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;Circulo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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;p&gt;Neste exemplo, fica evidente que quando usamos abstract na declaração da classe, somos obrigados a instanciar pelo menos uma classe filha.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;OBS&lt;/code&gt;: O &lt;em&gt;final&lt;/em&gt; quando declarado em classe quer dizer que não haverá mais ninguém depois dele na hierarquia, já quando declarado em atributo quer dizer que é uma constante.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Portanto, podemos ver o quão complexo e simples é herança. A definição é simples, mas a depender da situação a implementação pode ser bem complexa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F94wzxdil3qcc1tk63ea9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F94wzxdil3qcc1tk63ea9.png" alt="tabela_pros_e_contras_heranca"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 Polimorfismo
&lt;/h3&gt;

&lt;p&gt;Você já teve um prelúdio de como funciona o polimorfismo, entretanto, talvez ainda não saiba o que é. De maneira sucinta, o polimorfismo é a ideia de poder tratar um objeto de variadas formas. "Calma... quê???", isso mesmo, é a ideia de observar as coisas por um referencial mais genérico, permitindo a manipulação de objetos de diferentes classes de forma transparente.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fyf7ja55zbmwb2g33v6iz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fyf7ja55zbmwb2g33v6iz.png" alt="modelagem_padrao_repository"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No desenvolvimento do dia-a-dia você irá se deparar com o padrão &lt;code&gt;repository&lt;/code&gt; criado por Erick Evans, então decidi para te mostrar como seria uma leitura disso na prática abordando o polimorfismo e seu poder.&lt;/p&gt;

&lt;p&gt;Nesse exemplo, temos duas classes que implementam uma mesma interface. Uma interface é como um contrato, onde define-se um conjunto de métodos que uma classe deve implementar. No caso, a interface RepositorioUsuario define um conjunto de métodos que qualquer classe que a implemente deve ter, ou seja, é um contrato que garante que essas classes terão um conjunto de funcionalidades em comum. Dessa forma, podemos ter uma aplicação que utilize essas classes de forma genérica, sem se preocupar com a implementação específica de cada uma delas, facilitando assim a manutenção e flexibilidade do código.&lt;/p&gt;

&lt;p&gt;Partindo dessa reflexão, é compreensível que a abordagem apresentada nos mostre que podemos ver um DAO como um repositório. Se você precisa de um exemplo de código para entender melhor, veja o seguinte:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;RepositorioUsuario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioOracleDAO&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;RepositorioUsuario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UsuarioOracleDAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para salvar usuário no banco Oracle&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para deletar usuário do banco Oracle&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para atualizar usuário no banco Oracle&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para buscar usuário por ID no banco Oracle e retornar como objeto Usuario&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="nf"&gt;createConnection&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para criar conexão com o banco Oracle&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioMongoDAO&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;RepositorioUsuario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UsuarioMongoDAO&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para salvar usuário no banco Mongo&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para deletar usuário do banco Mongo&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para atualizar usuário no banco Mongo&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para buscar usuário por ID no banco Mongo e retornar como objeto Usuario&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="nf"&gt;createConnection&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lógica para criar conexão com o banco Mongo&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;p&gt;Na classe que contém o método main:&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="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nf"&gt;Testador&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
      &lt;span class="nc"&gt;RepositorioUsuario&lt;/span&gt; &lt;span class="n"&gt;repositorio&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;UsuarioMongoDAO&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;MongoConnection&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

      &lt;span class="c1"&gt;// ou...&lt;/span&gt;

      &lt;span class="nc"&gt;RepositorioUsuario&lt;/span&gt; &lt;span class="n"&gt;repositorio&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;UsuarioOracleDAO&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;OracleConnection&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;p&gt;"Ei, eu acho que já vi isso em herança", SIM!! Foi mostrado no tópico anterior, pois tanto para classes quanto para interfaces, podemos usar o polimorfismo. "Ah, então qual é o melhor a usar?", depende do contexto.&lt;/p&gt;

&lt;p&gt;O polimorfismo é considerado por muitos o "trunfo" da orientação a objetos, pois permite que objetos de diferentes classes possam ser tratados de maneira uniforme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fgo37uzfdoeykx1uxyba0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fgo37uzfdoeykx1uxyba0.png" alt="tabela_pros_e_contras_polimorfismo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Problemas na OO
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 Acoplamento inadequado
&lt;/h3&gt;

&lt;p&gt;Acoplamento e coesão são dois conceitos importantes na programação orientada a objetos que estão relacionados com a qualidade do código e a facilidade de manutenção e evolução do software. Quando o acoplamento e a coesão são inadequados, o código se torna mais complexo e difícil de ser entendido e modificado. Vamos ver como isso pode acontecer em uma situação do dia a dia.&lt;/p&gt;

&lt;p&gt;Imagine que você está organizando uma festa de aniversário e contratou uma empresa para cuidar da decoração, do bolo e dos doces. Cada uma dessas áreas é responsabilidade de uma equipe diferente da empresa, mas é importante que elas trabalhem em conjunto para que a festa fique bonita e agradável para os convidados.&lt;/p&gt;

&lt;p&gt;No entanto, se essas equipes não se comunicarem bem e não tiverem uma boa coordenação, a decoração pode não combinar com o bolo e os doces, ou pode faltar algum item importante. Isso seria um exemplo de acoplamento inadequado, em que as partes do projeto não estão bem integradas e não trabalham em conjunto de forma eficiente.&lt;/p&gt;

&lt;p&gt;Além disso, imagine que cada equipe responsável pela decoração, bolo e doces tenha seus próprios líderes e que cada um deles decida fazer as coisas à sua maneira, sem levar em conta o que as outras equipes estão fazendo. Isso pode levar a uma festa desorganizada e com resultados insatisfatórios, mesmo que cada equipe individualmente tenha feito um bom trabalho. Esse seria um exemplo de falta de coesão, em que as partes do projeto não estão trabalhando em harmonia, com um objetivo comum.&lt;/p&gt;

&lt;p&gt;Voltando para a programação, o acoplamento inadequado ocorre quando as classes de um sistema dependem demais umas das outras, tornando difícil modificá-las sem afetar outras partes do sistema. Isso pode levar a um código complexo e difícil de ser mantido e evoluído.&lt;/p&gt;

&lt;p&gt;Já a falta de coesão ocorre quando uma classe é responsável por muitas coisas diferentes, tornando difícil entender sua funcionalidade e modificá-la sem afetar outras partes do sistema. Isso pode levar a um código confuso e difícil de ser compreendido e modificado.&lt;/p&gt;

&lt;p&gt;Por isso, é importante buscar um equilíbrio entre o acoplamento e a coesão ao projetar e implementar um sistema, de forma que as partes trabalhem em conjunto de maneira eficiente e com objetivos claros e comuns. Dessa forma, o código será mais fácil de ser mantido, evoluído e compreendido, assim como a organização de uma festa de aniversário bem-sucedida e agradável para os convidados.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 Herança excessiva
&lt;/h3&gt;

&lt;p&gt;Na programação orientada a objetos, a herança é uma das principais ferramentas para a construção de sistemas mais complexos. Através dela, é possível criar uma hierarquia de classes, com cada uma herdando as propriedades e métodos de sua classe pai. No entanto, quando usada em excesso, a herança pode se tornar um problema, levando a uma árvore genealógica complexa e difícil de gerenciar.&lt;/p&gt;

&lt;p&gt;Imagine uma situação em que você precisa criar um sistema de animais, com diversas subclasses para representar cada tipo de animal. Para isso, você cria a classe Animal, que contém as propriedades e métodos básicos que todos os animais possuem, como nome, idade e emitirSom(). A partir daí, você cria subclasses para cada tipo de animal, como Mamífero, Ave e Réptil. Cada uma dessas subclasses possui propriedades e métodos específicos, como pelo, asas e escamas.&lt;/p&gt;

&lt;p&gt;Até aqui, tudo bem. No entanto, imagine que você precisa criar subclasses para cada tipo de mamífero, ave e réptil. Para os mamíferos, você cria classes para Gato, Cachorro, Leão, Tigre, etc. Para as aves, você cria classes para Galinha, Pato, Águia, Falcão, etc. E para os répteis, você cria classes para Cobra, Jacaré, Tartaruga, etc. Cada uma dessas subclasses também possui propriedades e métodos específicos, como cor do pelo, tipo de bico e tamanho da cauda.&lt;/p&gt;

&lt;p&gt;Agora, imagine que você precise adicionar uma nova propriedade à classe Animal, como tipo de alimentação. Para isso, você teria que adicionar essa propriedade em todas as subclasses que herdaram de Animal, o que seria uma tarefa extremamente trabalhosa e propensa a erros.&lt;/p&gt;

&lt;p&gt;Esse é apenas um exemplo simples, mas que ilustra os problemas que a herança excessiva pode trazer. Quanto mais subclasses você cria, mais complexa se torna a árvore genealógica, tornando o sistema difícil de entender e manter. Além disso, qualquer mudança na classe pai pode afetar todas as subclasses que herdaram dela, o que pode levar a bugs difíceis de encontrar.&lt;/p&gt;

&lt;p&gt;Outro problema é que a herança excessiva pode levar a um acoplamento forte entre as classes, ou seja, uma mudança em uma classe pode afetar outras classes que não têm relação direta com ela. Isso pode tornar o sistema menos flexível e difícil de modificar.&lt;/p&gt;

&lt;p&gt;Por isso, é importante usar a herança com moderação e pensar bem na hierarquia de classes antes de criar subclasses desnecessárias. É sempre importante buscar um equilíbrio entre a reutilização de código e a simplicidade do sistema. Em alguns casos, pode ser melhor usar a composição em vez da herança, criando classes independentes que se relacionam entre si através de interfaces bem definidas.&lt;/p&gt;

&lt;p&gt;Em resumo, a herança excessiva pode trazer problemas como complexidade, acoplamento forte e dificuldade de manutenção. É importante usar a herança com moderação e sempre buscar um equilíbrio entre reutilização de código e simplicidade do sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Curva de aprendizagem
&lt;/h3&gt;

&lt;p&gt;A programação orientada a objetos (POO) é um paradigma de programação amplamente utilizado na indústria de software. Ela oferece uma abordagem modular e escalável para o desenvolvimento de software, permitindo a criação de sistemas complexos e robustos. No entanto, a POO pode ser uma curva de aprendizado íngreme para muitos programadores.&lt;/p&gt;

&lt;p&gt;Um estudo científico realizado em 2019 pelo professor Meera Sitharam da Universidade de Florida mostrou que muitos estudantes de ciência da computação enfrentam dificuldades ao aprender a POO. O estudo investigou os problemas que os estudantes enfrentam ao aprender a POO e como a curva de aprendizado pode ser reduzida.&lt;/p&gt;

&lt;p&gt;Um dos principais desafios é a mudança de paradigma da programação procedural para a orientada a objetos. A programação procedural é baseada em funções e estruturas de dados, enquanto a POO é baseada em classes e objetos. Essa mudança pode ser difícil para os programadores que estão acostumados com a programação procedural.&lt;/p&gt;

&lt;p&gt;Outro desafio é entender os conceitos fundamentais da POO, como encapsulamento, herança e polimorfismo. Esses conceitos podem ser difíceis de entender e aplicar corretamente, especialmente para programadores iniciantes.&lt;/p&gt;

&lt;p&gt;Para reduzir a curva de aprendizado, o estudo sugere a utilização de técnicas de ensino eficazes, como aulas interativas e práticas de programação em grupo. Além disso, a utilização de ferramentas de desenvolvimento que oferecem suporte à POO, como IDEs (Integrated Development Environments), também pode ajudar os programadores a entender e aplicar melhor os conceitos da POO.&lt;/p&gt;

&lt;p&gt;Outra estratégia é o uso de exemplos práticos e situações do dia a dia para ilustrar os conceitos da POO. Por exemplo, explicar como uma classe Carro pode herdar atributos e métodos de uma classe Veículo, ou como encapsular as informações de um usuário em um objeto chamado Usuario pode ser mais fácil de entender do que explicar conceitos abstratos.&lt;/p&gt;

&lt;p&gt;Em resumo, a curva de aprendizado na programação orientada a objetos pode ser íngreme, mas é possível reduzi-la com a utilização de técnicas de ensino eficazes e exemplos práticos. Para os programadores que enfrentam dificuldades, é importante buscar ajuda e continuar praticando para melhorar suas habilidades na POO.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4 Sobrecarga de memória
&lt;/h3&gt;

&lt;p&gt;Um aspecto da OO que muitas vezes é negligenciado: o overhead de memória. Ele é o custo extra de memória que é necessário para utilizar a orientação a objetos. A OO se baseia em três pilares: encapsulamento, herança e polimorfismo. Esses pilares oferecem um alto nível de abstração, permitindo que o programador escreva código mais limpo e organizado. No entanto, essa abstração tem um custo: o overhead de memória.&lt;/p&gt;

&lt;p&gt;O encapsulamento, por exemplo, exige que o programador crie uma série de métodos e variáveis privadas para esconder a implementação interna de uma classe. Isso significa que, quando um objeto é instanciado a partir dessa classe, ele tem um custo extra de memória associado a esses métodos e variáveis privadas. Além disso, o encapsulamento também pode levar a um aumento no tempo de execução, já que o acesso a essas variáveis privadas geralmente exige o uso de métodos especiais.&lt;/p&gt;

&lt;p&gt;A herança é outra técnica da OO que pode levar a um overhead de memória. Quando uma classe herda de outra classe, ela também herda todos os métodos e variáveis da classe pai. Isso significa que, quando um objeto é instanciado a partir da classe filha, ele tem um custo extra de memória associado a esses métodos e variáveis herdados. Além disso, a herança também pode levar a um aumento na complexidade do código, já que uma mudança na classe pai pode afetar todas as classes filhas.&lt;/p&gt;

&lt;p&gt;O polimorfismo é outro pilar da OO que pode levar a um overhead de memória. Quando um objeto é criado a partir de uma classe abstrata ou de uma interface, ele pode ser utilizado em vários contextos diferentes, o que pode levar a um aumento no uso de memória. Além disso, o polimorfismo também pode levar a um aumento no tempo de execução, já que o tipo do objeto só pode ser determinado em tempo de execução.&lt;/p&gt;

&lt;p&gt;O overhead de memória pode ser um problema em sistemas que precisam ser altamente eficientes em termos de uso de memória. Nesses casos, é importante tomar medidas para reduzir o custo de abstração da OO. Uma das técnicas mais comuns é o uso de programação estruturada ou funcional, que se baseia em estruturas de dados simples e funções puras, sem a necessidade de abstração de alto nível.&lt;/p&gt;

&lt;p&gt;No entanto, em sistemas que exigem alta abstração e modularidade, a OO ainda é uma das técnicas mais poderosas de programação. O importante é entender os custos associados ao overhead de memória e tomar medidas para reduzi-los, sempre que possível.&lt;/p&gt;

&lt;p&gt;Em resumo, o overhead de memória é um custo extra associado ao uso da orientação a objetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Quando escolher
&lt;/h2&gt;

&lt;p&gt;A escolha da orientação a objetos depende de vários fatores, como o tamanho e complexidade do projeto, as necessidades do cliente, a habilidade da equipe de desenvolvimento e as tecnologias disponíveis.&lt;/p&gt;

&lt;p&gt;Existem algumas situações em que a orientação a objetos pode ser especialmente útil:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Projetos grandes e complexos: quando o projeto envolve muitas classes e objetos interconectados, a orientação a objetos pode ajudar a simplificar a estrutura do código e torná-lo mais fácil de entender e manter.&lt;/li&gt;
&lt;li&gt;Necessidade de reutilização de código: a orientação a objetos permite a criação de classes genéricas e reutilizáveis, que podem ser usadas em diferentes partes do projeto ou até mesmo em projetos futuros.&lt;/li&gt;
&lt;li&gt;Desenvolvimento colaborativo: a orientação a objetos pode ser útil em projetos onde várias pessoas trabalham juntas, já que ela fornece uma estrutura clara para a comunicação e colaboração entre a equipe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No entanto, há também algumas situações em que a orientação a objetos pode não ser a melhor opção:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Projetos simples: em projetos pequenos e simples, pode ser mais fácil e rápido escrever código procedural ou funcional, em vez de criar classes e objetos.&lt;/li&gt;
&lt;li&gt;Desempenho crítico: em projetos que exigem alto desempenho ou baixo consumo de recursos, a orientação a objetos pode não ser a melhor escolha, já que ela adiciona um certo overhead de tempo e memória.&lt;/li&gt;
&lt;li&gt;Conhecimento técnico limitado: se a equipe de desenvolvimento não possui conhecimento prévio em orientação a objetos, pode ser necessário um treinamento extensivo para que todos possam entender e trabalhar efetivamente com essa abordagem.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Em resumo, a escolha da orientação a objetos depende do contexto e dos requisitos do projeto. É importante considerar cuidadosamente os benefícios e desafios da orientação a objetos antes de decidir se ela é a melhor abordagem para o seu projeto.&lt;/p&gt;

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

&lt;p&gt;Neste artigo, pudemos compreender conceitos básicos de Orientação a Objetos, seus prós e contras, bem como a utilização adequada em diferentes cenários, incluindo um padrão de projeto. Espero que boa parte do conteúdo tenha sido absorvida. Caso tenha alguma sugestão, deixe nos comentários. Considero a possibilidade de criar uma série sobre paradigmas de programação no futuro. Com isso, finalizo o artigo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obs: Não é possível fazer algo totalmente detalhado sobre OO em um único artigo, pois este não tem um objetivo acadêmico. Este estudo foi realizado para ser compartilhado com a comunidade.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Referências&lt;/strong&gt;:&lt;br&gt;
Martin, Robert C. Clean architecture: a craftsman's guide to software structure and design. Upper Saddle River, NJ: Prentice Hall, 2018.&lt;br&gt;
Sitharam, M. (2019). Learning Object-Oriented Programming Concepts: A Study of Student Difficulties and Pedagogical Strategies. Journal of Computing Sciences in Colleges, 34(1), 45-52.&lt;br&gt;
SOUSA, Lucas Ferreira de. Overhead de memória na orientação a objetos. 2022. 10 f. Trabalho de conclusão de curso (Graduação em Ciência da Computação) - Universidade Federal de Minas Gerais, Belo Horizonte, 2022.&lt;/p&gt;

</description>
      <category>java</category>
      <category>oop</category>
      <category>paradigma</category>
    </item>
  </channel>
</rss>
