<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: felipe bs</title>
    <description>The latest articles on DEV Community by felipe bs (@felipe_bs07).</description>
    <link>https://dev.to/felipe_bs07</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%2F2226422%2F2a809a10-cd20-4358-8369-367e6cd561da.jpg</url>
      <title>DEV Community: felipe bs</title>
      <link>https://dev.to/felipe_bs07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/felipe_bs07"/>
    <language>en</language>
    <item>
      <title>Programação Orientada a Objetos - Java</title>
      <dc:creator>felipe bs</dc:creator>
      <pubDate>Fri, 25 Oct 2024 02:26:49 +0000</pubDate>
      <link>https://dev.to/felipe_bs07/programacao-orientada-a-objetos-java-1kfa</link>
      <guid>https://dev.to/felipe_bs07/programacao-orientada-a-objetos-java-1kfa</guid>
      <description>&lt;p&gt;A essência da POO está em criar modelos/templates de objetos do mundo real dentro do software. Objetos podem ser coisas concretas, como um carro, ou mais abstratas, como uma transação bancária. Cada objeto tem estados e comportamentos. Os estados são as características que definem o objeto, enquanto os comportamentos são as ações que ele pode realizar.&lt;/p&gt;

&lt;p&gt;Por exemplo, imagine a classe Carro. Um carro possui atributos que descrevem suas características, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cor (estado),&lt;/li&gt;
&lt;li&gt;marca (estado),&lt;/li&gt;
&lt;li&gt;modelo (estado),&lt;/li&gt;
&lt;li&gt;quantidade de portas (estado).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, um carro também pode realizar ações, como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ligar (comportamento),&lt;/li&gt;
&lt;li&gt;andar (comportamento),&lt;/li&gt;
&lt;li&gt;parar (comportamento).&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Aqui, a classe Carro define o que cada carro (objeto) deve ter e o que ele pode fazer. Podemos criar quantos carros quisermos a partir dessa classe, cada um com seus próprios atributos e comportamentos, mas sempre seguindo a "planta" definida pela classe.&lt;/p&gt;

&lt;p&gt;Um exemplo de como seria criar isso no Java seria da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Carro {

    String marca;
    String modelo;
    String cor;
    int quantidade_de_portas;

    // inicializamos a classe Carro sem nenhum valor inicial
    public Carro(Strin) {
    }
}

public static void main(String[] args) {
        Carro carro_exemplo = new Carro("Volkswagen ", "Gol", "prata", 4);
        Carro carro_exemplo2 = new Carro("Fiat", "Uno", "prata", 2);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encapsulamento
&lt;/h2&gt;

&lt;p&gt;O encapsulamento em Java é um dos pilares da Programação Orientada a Objetos (POO) e refere-se ao ato de restringir o acesso direto aos atributos de uma classe, tornando mais claro quais partes de um objeto podem ser acessadas ou modificadas diretamente. Com ele, podemos controlar o uso e a manipulação dos dados, garantindo maior segurança e integridade.&lt;/p&gt;

&lt;p&gt;Em Java, o encapsulamento é implementado através de modificadores de acesso, como &lt;code&gt;private&lt;/code&gt;e &lt;code&gt;public&lt;/code&gt;, e com o uso de métodos especiais, conhecidos como getters e setters, que permitem acessar ou modificar os atributos de uma classe de forma controlada.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo:&lt;/p&gt;

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

&lt;p&gt;A classe ContaBancaria contém dois atributos: titular e saldo. Como ambos estão declarados com o modificador &lt;code&gt;public&lt;/code&gt;, eles podem ser acessados e modificados diretamente de qualquer parte do sistema, sem qualquer controle ou validação. Isso pode ser perigoso, pois dados sensíveis podem ser alterados em momentos inadequados ou de forma incorreta.&lt;/p&gt;

&lt;p&gt;Agora, com o uso de encapsulamento, podemos proteger esses dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class ContaBancaria {
    private String titular;
    private double saldo;

    // Getter
    public String getTitular() {
        return titular;
    }

    public double getSaldo() {
        return saldo;
    }

    // Setter
    public void setTitular(String titular) {
        this.titular = titular;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, os atributos titular e saldo foram modificados para &lt;code&gt;private&lt;/code&gt;, o que significa que não podem ser acessados diretamente de fora da classe ContaBancaria. Em vez disso, criamos métodos &lt;strong&gt;get&lt;/strong&gt; e &lt;strong&gt;set&lt;/strong&gt; para cada um desses atributos, que permitem o acesso controlado. Isso evita, por exemplo, que o saldo seja alterado diretamente por qualquer parte do sistema sem passar por regras de negócio ou validações.&lt;/p&gt;

&lt;p&gt;É importante ressaltar que o getter é utilizado sempre que precisamos controlar como os dados são fornecidos a quem acessa um valor dessa classe de fora. Da mesma forma, o setter é criado para implementar mudanças de forma mais segura e restrita nos atributos, permitindo a aplicação de regras ou validações antes de alterar os valores.&lt;/p&gt;

&lt;p&gt;Agora, para acessar ou modificar os atributos da ContaBancaria, o código deve chamar os métodos adequados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ContaBancaria conta = new ContaBancaria();
conta.setTitular("Felipe");
conta.setSaldo(0.0);

System.out.println(conta.getTitular());

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

&lt;/div&gt;



&lt;p&gt;Com isso, garantimos que a única forma de alterar o titular ou o saldo é através dos métodos específicos, o que protege o sistema contra mudanças indesejadas ou erros, como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;conta.titular = "Bruno";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Herança
&lt;/h2&gt;

&lt;p&gt;Herança é um dos pilares fundamentais da Programação Orientada a Objetos (POO). O conceito de herança permite que uma classe (chamada de subclasse) herde características e comportamentos de outra classe (chamada de superclasse). Com a herança, é possível reutilizar e especializar código existente, o que torna o desenvolvimento de sistemas mais eficiente e organizado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como a herança é útil?
&lt;/h3&gt;

&lt;p&gt;Imagine que você tem uma classe chamada Cartao, que possui atributos e comportamentos comuns a diferentes tipos de cartões, como cartões de débito e crédito. Em vez de repetir esses atributos e comportamentos em cada tipo de cartão, você pode centralizá-los na classe Cartao e, em seguida, herdar essas características nas subclasses &lt;code&gt;CartaoDebito&lt;/code&gt; e &lt;code&gt;CartaoCredito&lt;/code&gt;.&lt;/p&gt;

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

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

&lt;p&gt;No diagrama acima, a classe Cartao possui três atributos comuns: &lt;code&gt;codigo_cartao&lt;/code&gt;, &lt;code&gt;numero_cartao&lt;/code&gt; e &lt;code&gt;digito_cartao.&lt;/code&gt; Esses atributos são marcados como &lt;code&gt;protected&lt;/code&gt;, o que significa que eles podem ser acessados e modificados diretamente pelas subclasses, mas não por outras classes externas.&lt;/p&gt;

&lt;p&gt;Agora, temos duas subclasses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CartaoDebito&lt;/strong&gt;: herda os atributos da classe &lt;code&gt;Cartao&lt;/code&gt; e adiciona comportamentos e atributos específicos, como &lt;code&gt;data_pagamento_deposito&lt;/code&gt; e &lt;code&gt;data_saque&lt;/code&gt;, além de métodos para sacar dinheiro e depositar dinheiro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CartaoCredito&lt;/strong&gt;: também herda os atributos de Cartao, mas adiciona características específicas, como &lt;code&gt;se_pode_aproximacao&lt;/code&gt; e comportamentos para pagar com/sem aproximação e verificar o limite do cartão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse exemplo, as classes &lt;code&gt;CartaoDebito&lt;/code&gt; e &lt;code&gt;CartaoCredito&lt;/code&gt; herdam atributos e métodos da classe &lt;code&gt;Cartao&lt;/code&gt;. Dessa forma, reutilizamos o código base da superclasse, o que simplifica a manutenção e o desenvolvimento. Além disso, cada subclasse pode implementar suas próprias versões de métodos ou adicionar novos comportamentos específicos, garantindo a flexibilidade e a especialização necessárias para cada tipo de cartão.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public abstract class Cartao {
    protected String codigo_cartao;
    protected String numero_cartao;
    protected String digito_cartao;

    // Métodos comuns
    public abstract void sacarDinheiro(double valor);
    public abstract void depositarDinheiro(double valor);
}

// Subclasse Cartão de Débito
public class CartaoDebito extends Cartao {
    private String data_deposito;
    private String data_saque;

    @Override
    public void sacarDinheiro(double valor) {
        System.out.println("Sacando dinheiro do Cartão de Débito");
        // Lógica específica para o saque
        // Adicionar data de saque;
    }

    @Override
    public void depositarDinheiro(double valor) {
        System.out.println("Depositando dinheiro no Cartão de Débito");
        // Lógica específica para o depósito
        // Adicionar data de deposito;
    }
}

// Subclasse Cartão de Crédito
public class CartaoCredito extends Cartao {
    private String data_pagamento;
    private boolean se_pode_aproximacao;

    @Override
    public void sacarDinheiro(double valor) {
        System.out.println("Sacando dinheiro do Cartão de Crédito");
        // Lógica específica para o saque
    }

    @Override
    public void depositarDinheiro(double valor) {
        System.out.println("Depositando dinheiro no Cartão de Crédito");
        // Lógica específica para o depósito
    }

    public void pagar() {
        if (se_pode_aproximacao) {
            System.out.println("Pagamento com aproximação");
        } else {
            System.out.println("Pagamento sem aproximação");
        }
        // Adiciona data de pagamento;
    }

    public void verificarSeTemLimite() {
        // Lógica para verificar o limite do cartão
        System.out.println("Verificando limite do Cartão de Crédito");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, as classes &lt;code&gt;CartaoDebito&lt;/code&gt; e &lt;code&gt;CartaoCredito&lt;/code&gt; herdam atributos e métodos da classe Cartao. Dessa forma, reutilizamos o código base da superclasse, o que simplifica a manutenção e o desenvolvimento. Além disso, cada subclasse pode implementar suas próprias versões de métodos ou adicionar novos comportamentos específicos, garantindo a flexibilidade e a especialização necessárias para cada tipo de cartão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Polimorfismo
&lt;/h2&gt;

&lt;p&gt;Agora que entendemos a herança, vamos falar algo que esta muito ligado a ele, o &lt;strong&gt;polimorfismo&lt;/strong&gt; em termos simples significa “muitas formas” — ou seja, a capacidade de um objeto de assumir diferentes formas. No contexto da POO, o polimorfismo permite que uma mesma ação (como usar um procedimento) se comporte de maneiras diferentes, dependendo do objeto que a executa.&lt;/p&gt;

&lt;p&gt;Isso é extremamente útil porque permite que tratemos diferentes objetos de forma uniforme, mas ainda permitindo que cada objeto tenha seu próprio comportamento específico.&lt;/p&gt;

&lt;p&gt;No exemplo que vimos anteriormente, temos uma classe base chamada Cartao, que é estendida por duas classes: &lt;code&gt;CartaoDebito&lt;/code&gt; e &lt;code&gt;CartaoCredito&lt;/code&gt;. Cada uma dessas subclasses implementa comportamentos específicos para o tipo de cartão, como &lt;code&gt;sacarDinheiro()&lt;/code&gt; e &lt;code&gt;depositarDinheiro()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora, vamos ver como o polimorfismo pode ser utilizado para tratar diferentes tipos de cartões de maneira uniforme, mas permitindo que cada cartão aja de acordo com suas características.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Main {
    public static void processarSaque(Cartao cartao, double valor) {
        cartao.sacarDinheiro(valor);
    }

    public static void processarDeposito(Cartao cartao, double valor) {
        cartao.depositarDinheiro(valor);
    }

    public static void main(String[] args) {
        Cartao cartaoDebito = new CartaoDebito();
        Cartao cartaoCredito = new CartaoCredito();

        // Polimorfismo em ação: o método sacarDinheiro se comporta de maneira diferente para cada tipo de cartão
        processarSaque(cartaoDebito, 100);  // Comportamento específico do Cartão de Débito
        processarSaque(cartaoCredito, 200); // Comportamento específico do Cartão de Crédito

        processarDeposito(cartaoDebito, 500);  // Depósito no Cartão de Débito
        processarDeposito(cartaoCredito, 1000); // Depósito no Cartão de Crédito
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima, temos dois métodos chamados &lt;code&gt;processarSaque&lt;/code&gt; e &lt;code&gt;processarDeposito&lt;/code&gt;. Esses métodos recebem um objeto do tipo &lt;code&gt;Cartao&lt;/code&gt; como argumento, o que significa que eles podem aceitar qualquer subclasse de &lt;code&gt;Cartao&lt;/code&gt;, como &lt;code&gt;CartaoDebito&lt;/code&gt; ou &lt;code&gt;CartaoCredito&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O comportamento polimórfico acontece quando chamamos o método &lt;code&gt;sacarDinheiro()&lt;/code&gt; e &lt;code&gt;depositarDinheiro()&lt;/code&gt; em diferentes tipos de cartões. Mesmo que os métodos sejam chamados da mesma forma, o comportamento muda com base no tipo de objeto (se é um &lt;code&gt;CartaoDebito&lt;/code&gt; ou um &lt;code&gt;CartaoCredito&lt;/code&gt;). Isso é o polimorfismo em ação — o método se comporta de forma diferente dependendo do objeto que o invoca.&lt;/p&gt;

&lt;p&gt;O polimorfismo torna o código mais flexível e escalável. Veja que no exemplo, os métodos processarSaque e processarDeposito não precisaram ser alterados ou duplicados para lidar com diferentes tipos de cartão. Eles aceitam qualquer objeto que seja uma instância da classe &lt;code&gt;Cartao&lt;/code&gt;, e o comportamento apropriado é &lt;strong&gt;decidido dinamicamente&lt;/strong&gt;, com base no tipo específico do cartão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interface
&lt;/h2&gt;

&lt;p&gt;A interface, por último, mas não menos importante, é um dos pilares da Programação Orientada a Objetos (POO) e é amplamente utilizada. Ela tem o efeito oposto da herança: enquanto a herança permite que uma classe filha herde características da classe pai, a interface obriga todas as classes que a implementam a fornecer suas próprias lógicas para os métodos definidos. Isso garante que cada classe atenda a um contrato específico, promovendo consistência e reutilização de código.&lt;/p&gt;

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

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

&lt;p&gt;Nesse exemplo, temos a interface chamada &lt;code&gt;Notificacao&lt;/code&gt;, que possui um método chamado &lt;code&gt;enviarMensagem(mensagem)&lt;/code&gt;. Temos duas classes que a implementam: &lt;code&gt;NotificacaoSMS&lt;/code&gt; e &lt;code&gt;NotificacaoEmail&lt;/code&gt;. Embora a interface seja semelhante à herança, onde estendemos uma classe abstrata, ela se concentra em definir apenas métodos/comportamentos, evitando a criação de regras de negócio. Isso obriga todas as classes que a implementam a fornecer suas próprias implementações desses métodos, permitindo que cada uma crie suas regras de negócio específicas.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public interface Notificacao {
    void enviarMensagem(String mensagem);
}

public class NotificacaoEmail implements Notificacao {

    // compormanento "forçado" pela interface
    @Override
    public void enviarMensagem(String mensagem) {
        System.out.println("E-mail: " + mensagem);
    }
}


public class NotificacaoSMS implements Notificacao {

    // compormanento "forçado" pela interface
    @Override
    public void enviarMensagem(String mensagem) {
        System.out.println("SMS: " + mensagem);
    }
}


public class Main {
    public static void main(String[] args) {
        Notificacao notificacaoEmail = new NotificacaoEmail();
        Notificacao notificacaoSMS = new NotificacaoSMS();

        notificacaoEmail.enviarMensagem("Olá, esta é uma notificação via e-mail!");
        notificacaoSMS.enviarMensagem("Olá, esta é uma notificação via SMS");
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como observado no exemplo acima, ambas as classes precisam enviar notificações ao usuário. Podemos obrigar que todas implementem essa funcionalidade, evitando a duplicação de código e promovendo a reutilização de componentes já criados. Na parte do Main, conseguimos ver as duas classes enviando mensagens de acordo com seus métodos de envio específicos.&lt;/p&gt;

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

&lt;p&gt;A Programação Orientada a Objetos é uma abordagem poderosa para organizar seu código de forma clara e eficiente. Com conceitos como encapsulamento, herança e polimorfismo, agora quando você ouvir falar que uma linguagem é desenvolvida em cima do POO ou tem suporte, já consegue imaginar quais tipos de recursos ela tem a oferece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links auxiliares
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.alura.com.br/apostila-java-orientacao-objetos/classes-abstratas" rel="noopener noreferrer"&gt;Explicação sobre Abstract&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.devmedia.com.br/entendendo-interfaces-em-java/25502" rel="noopener noreferrer"&gt;Explicação sobre Interface&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PARADIGMAS</title>
      <dc:creator>felipe bs</dc:creator>
      <pubDate>Thu, 17 Oct 2024 22:57:48 +0000</pubDate>
      <link>https://dev.to/felipe_bs07/paradigmas-3dc5</link>
      <guid>https://dev.to/felipe_bs07/paradigmas-3dc5</guid>
      <description>&lt;p&gt;Todo estudante de programação, ao começar sua jornada, geralmente entra em contato com várias linguagens como Python, JavaScript, Java, entre outras. Um ponto importante que você provavelmente vai notar é que cada linguagem tem sua própria maneira de ser usada, ou seja, cada uma delas tem suas características e estrutura. &lt;strong&gt;Isso acaba influenciando a forma como você vai programar&lt;/strong&gt;, mesmo antes de ver uma linha de código.&lt;/p&gt;

&lt;p&gt;Primeiro ponto importante: todas as linguagens de programação são ferramentas. E como desenvolvedores, nossa responsabilidade é usar essas ferramentas para criar algo, para contar uma "história". Por exemplo, imagine que você queira construir um sistema de cadastro. Pensando como um usuário, você poderia descrever o que o sistema deveria fazer assim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pegar as informações básicas da pessoa que será cadastrada.&lt;/li&gt;
&lt;li&gt;Verificar se essas informações estão corretas.&lt;/li&gt;
&lt;li&gt;Salvar as informações do cadastro.&lt;/li&gt;
&lt;li&gt;Mostrar todos os usuários cadastrados no sistema.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora, a questão principal é: como transformar essa descrição em código? Isso é o que chamamos de "&lt;strong&gt;paradigmas de programação&lt;/strong&gt;", ou seja, o estilo ou o modelo de como programar. E dois paradigmas que são amplamente usados, mas não são os únicos, são o Paradigma Declarativo e o Paradigma Imperativo.&lt;/p&gt;

&lt;p&gt;Por que esses dois paradigmas são importantes?&lt;br&gt;
Porque eles formam a base para entender dois estilos muito comuns de programação: a Programação Orientada a Objetos (que herda do &lt;strong&gt;Paradigma Imperativo&lt;/strong&gt;) e a Programação Funcional (que segue o &lt;strong&gt;Paradigma Declarativo&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Vamos entender o que cada um significa.&lt;/p&gt;

&lt;h2&gt;Programação Declarativa &lt;/h2&gt;

&lt;p&gt;A programação declarativa se concentra em o &lt;strong&gt;que você quer fazer&lt;/strong&gt;, em vez de como fazer. Em outras palavras, você se preocupa mais com o resultado final do que com os passos necessários para chegar lá.&lt;/p&gt;

&lt;p&gt;Exemplos de linguagens que seguem esse paradigma são: Haskell, Lisp, SQL e HTML. O que todas elas têm em comum? Elas focam em declarar o que você quer, e o sistema faz o resto. Vamos ver exemplos:&lt;/p&gt;

&lt;p&gt;HTML:&lt;br&gt;
&lt;code&gt;&amp;lt;h1&amp;gt;Hello world&amp;lt;/h1&amp;gt;&lt;/code&gt;&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%2Fsh0ry6fag9a68d1lcb5w.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%2Fsh0ry6fag9a68d1lcb5w.png" alt="SELECT in TABLE" width="246" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui, você está dizendo que quer exibir um título "Hello world". Você não se preocupa com os detalhes de como o navegador vai renderizar o título, como o tamanho da fonte ou o estilo exato (isso poderia ser feito com CSS, que também é declarativo).&lt;/p&gt;

&lt;p&gt;SQL:&lt;br&gt;
&lt;code&gt;SELECT * FROM Customers&lt;/code&gt;&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%2Ff9orx6va8ejok789umes.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%2Ff9orx6va8ejok789umes.png" alt="Tag H1 title" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste exemplo, você está dizendo que quer buscar todos os dados da tabela "Customers". O banco de dados sabe como fazer isso, e você não precisa dizer passo a passo como buscar ou ordenar esses dados (a menos que queira).&lt;/p&gt;

&lt;p&gt;O ponto principal é que, com linguagens declarativas, o foco está no que você quer, e não nos detalhes de como chegar lá. Isso facilita seu trabalho, especialmente quando você precisa expressar uma ideia de forma simples.&lt;/p&gt;

&lt;h2&gt;Programação Imperativa&lt;/h2&gt;

&lt;p&gt;Por outro lado, a programação imperativa é o oposto: &lt;strong&gt;você precisa dizer como fazer&lt;/strong&gt;. Aqui, você tem que detalhar o passo a passo que o programa deve seguir para atingir o resultado desejado.&lt;/p&gt;

&lt;p&gt;Veja um exemplo em Java:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Main {
  public static void main(String[] args) {
    ArrayList&amp;lt;String&amp;gt; marca_carros = new ArrayList&amp;lt;String&amp;gt;();
    marca_carros.add("Volvo");
    marca_carros.add("BMW");
    marca_carros.add("Ford");
    marca_carros.add("KIA");

    for (String marca : marca_carros) {
      System.out.println(marca);
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o código está dizendo exatamente como criar uma lista de carros, como adicionar marcas a essa lista, e como mostrar cada marca na tela. Ou seja, você precisa ser explícito sobre o que fazer e como fazer.&lt;/p&gt;

&lt;p&gt;Outro exemplo é o JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function adicionarCarros() {
  var marca_carros = [];
  marca_carros.push("Volvo");
  marca_carros.push("BMW");
  marca_carros.push("Ford");
  marca_carros.push("KIA");

  for (var marca of marca_carros) {
    console.log(marca);
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, o processo é muito parecido: você está detalhando como a lista de marcas deve ser criada, como os itens devem ser adicionados, e como eles serão mostrados.&lt;/p&gt;

&lt;p&gt;Esses exemplos mostram a ideia básica do paradigma imperativo: você precisa controlar o como fazer em cada etapa do processo.&lt;/p&gt;

&lt;h2&gt;Como esses paradigmas se conectam?&lt;/h2&gt;

&lt;p&gt;Voltando ao exemplo do sistema de cadastro:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Você pode usar &lt;strong&gt;JavaScript (imperativo)&lt;/strong&gt; para pegar as informações básicas do usuário.&lt;/li&gt;
&lt;li&gt;Validar os dados usando uma linguagem como &lt;strong&gt;Java (também imperativo)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Salvar as informações no banco de dados com &lt;strong&gt;SQL (declarativo)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Exibir essas informações na tela usando &lt;strong&gt;HTML (também declarativo)&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ao entender como diferentes linguagens funcionam, você pode escolher a melhor ferramenta para cada parte do seu projeto, sem precisar ficar preso a um único estilo ou linguagem. Isso te ajuda a ser mais eficiente e flexível como desenvolvedor.&lt;/p&gt;

&lt;p&gt;E, para finalizar, lembre-se de que um paradigma é apenas uma maneira de classificar como uma linguagem se comporta ou como ela organiza o código. Esse tema é bastante amplo, com diversos paradigmas e subparadigmas. Algumas linguagens, como JavaScript, podem adotar mais de um paradigma ao mesmo tempo — sendo funcionais, orientadas a objetos e até utilizando outros estilos. O mais importante é você entender quando usar cada paradigma para obter o melhor resultado no seu projeto. Com o tempo, você vai aprender a escolher a abordagem certa para resolver cada tipo de problema da melhor forma.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
