O que é HTML?

O HTML é a linguagem base da internet, permitindo a criação e organização de conteúdo em páginas web. Criada entre o final da década de 80 e início de 90, a linguagem é composta por um conjunto de elementos chamados “tags”.

Na prática, o HTML é usado na construção de sites e aplicações, definindo a disposição de textos, imagens, links e outros elementos multimídia, tornando possível a navegação e interação online.

Neste artigo, entenderemos o que é HTML, sua origem, como funciona e sua importância no desenvolvimento web moderno. Vamos começar?

1 – O que é HTML?

O HTML (HyperText Markup Language , que em português significa Linguagem de Marcação de Hipertexto) é uma linguagem de marcação utilizada para criar e estruturar páginas web, sendo considerada a linguagem base de toda a internet.

Como o próprio nome indica, o HTML é uma linguagem de marcação que permite que suas regras de marcação sejam aplicadas em documentos hipertexto. Um documento do tipo hipertexto possui trechos do seu texto que fazem referência a outros textos, internos ou externos aquele documento. Esse trechos são chamados de links e são eles que permitem uma navegação dinâmica e fluída entre diferentes conteúdos na internet.

Executado através de navegadores web (browsers), o HTML permite criar páginas web que exibem textos, imagens, vídeos, links e outros elementos multimídia nas páginas que acessamos em nosso dia a dia.

É valido ressaltar que o HTML não é uma linguagem de programação como, por exemplo, JavaScript e Python, pois, não possui a capacidade de construir lógicas de execução. Como dito anteriormente, ele é uma linguagem de marcação utilizada para descrever o conteúdo e a estrutura de uma página web.

Por essa razão, o HTML precisa ser combinado com outras linguagens para entregar uma página web funcional. Geralmente, o CSS (Cascading Style Sheets) é utilizado para estilização e formatação das páginas e o JavaScript ou PHP para criar interatividade e funções dinâmicas. 

2 – Quando surgiu o HTML?

O HTML foi criado no final da década de 1980 pelo físico e cientista da computação britânico Tim Berners-Lee, quando ele trabalhava no CERN, um avançado centro de pesquisas científicas localizado na Suíça.

Tim Berners-Lee procurava uma forma de facilitar a comunicação e colaboração entre pesquisadores localizados em diferentes partes do mundo. Como resultado de suas pesquisas foi desenvolvida uma linguagem de marcação para criar documentos digitais que poderiam ter links para conectar diferentes textos.

Essa linguagem recebeu o nome de HTML e a publicação de sua primeira especificação ocorreu em 1991, tornando-se, desde então, a base para a World Wide Web. Ao longo dos anos, a linguagem evoluiu significativamente, com diversas versões lançadas para acompanhar os avanços tecnológicos da internet.

Atualmente, a versão mais utilizada é o HTML5, lançada em meados de 2014. Essa versão trouxe melhorias como suporte a áudios e vídeos, elementos semânticos, recursos de acessibilidade, e muitos outros recursos que auxiliam na construção de aplicações web modernas.

Além disso, o HTML se tornou um padrão oficial da internet. Sua documentação e especificação são mantidas pelo W3C (World Wide Web Consortium), um consórcio internacional de empresas, órgãos governamentais e organizações independentes, responsável por definir os padrões da World Wide Web.

3 – Como funciona o HTML?

O HTML é composto por um conjunto de elementos chamados “tags” (etiquetas), as quais são responsáveis por delimitar e organizar o conteúdo de uma página web. Cada tag possui uma função específica e contêm atributos que modificam o seu comportamento.

Documentos HTML possuem extensão .html ou .htm, e possuem a seguinte estrutura básica:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Meu Primeiro HTML</title>
</head>
<body>
    <h1>Bem-vindo ao HTML!</h1>
    
    <p>HTML é a linguagem base para criar páginas da web. Ele estrutura o conteúdo e trabalha em conjunto com o CSS e JavaScript para criar sites interativos.</p>
    
    <h2>Elementos básicos do HTML:</h2>
    
    <ul>
        <li><strong>&lt;h1&gt; a &lt;h6&gt;</strong>: Definem títulos e subtítulos.</li>
        <li><strong>&lt;p&gt;</strong>: Define parágrafos de texto.</li>
        <li><strong>&lt;a&gt;</strong>: Cria links.</li>
        <li><strong>&lt;img&gt;</strong>: Exibe imagens.</li>
        <li><strong>&lt;ul&gt; e &lt;li&gt;</strong>: Criam listas.</li>
    </ul>

    <p>Quer aprender mais? Visite o <a href="https://www.w3schools.com/html/" target="_blank">site da W3Schools</a>.</p>

    <img src="https://via.placeholder.com/300" alt="Exemplo de imagem">
</body>
</html>

O resultado do código acima é esse aqui:

Exemplo de código HTML que demonstra a montagem da estrutura de uma página web.
Fonte: o autor

Apesar de sua simplicidade, o código acima apresenta de forma concisa a estrutura básica de um documento HTML. Essa linguagem organiza os conteúdos da página na tela, mas sem aplicar nenhum tipo de estilização ou interatividade. Isto acontece porque o HTML tem apenas papel estrutural: sua responsabilidade é definir a disposição dos elementos na tela, independentemente do tamanho ou finalidade da página web.

Assim, para tornar um site visualmente atraente e interativo, o HTML precisa ser combinado com outras tecnologias, como o CSS, que define o estilo e a aparência dos elementos, e o JavaScript, que adiciona interatividade e funcionalidades dinâmicas.

3.1 – Entendendo a estrutura do código

A fim de melhorar nossa compreensão sobre HTML, vamos analisar a estrutura do código apresentado acima e entender melhor o papel de cada tag:

  • <!DOCTYPE html>: Declara que o documento segue a especificação do HTML5.
  • <html>: É a tag raiz que envolve todo o conteúdo de uma página HTML.
  • <head>: Contém metadados e configurações, como o título da página e informações de responsividade.
  • <title>: Define o título exibido na aba do navegador.
  • <body>: Contém os elementos visíveis da página.
  • <h1>: Representa o título principal da página.
  • <p>: Define parágrafos de texto.
  • <ul> e <li>: Criam listas de itens, úteis para organizar informações.
  • <a>: Define um link para outras páginas ou sites.

Apesar de simples, esse código representa a estrutura de uma página HTML . Revestidas por tags que identificam a linguagem do documento (<!DOCTYPE html> e <html>), essas páginas também tem um <head> e um <body>.

A tag <head> representa o cabeçalho da página onde estão informações pertinentes a configuração de sua estrutura, enquanto a tag< body> representa o corpo da página onde estão distribuídos os seus conteúdos.

Tanto dentro da tag<head> quanto da tag <body>, muitas outras tags podem ser inseridas conforme os conteúdos que serão exibidos na página. Inclusive, à medida que novas tags e atributos são adicionados, podemos criar páginas mais elaboradas e acrecentar funcionalidades que tornam a experiência de uso mais agradável.

Se você deseja conhecer outras tags do HTML e ver exemplos práticos de uso da linguagem, acesse o site da W3Schools e confira os conteúdos que tem por lá.

Conclusão

O HTML é uma tecnologia fundamental para a web, sendo responsável pela estruturação de todas as páginas que acessamos diariamente. Embora por si só não forneça estilização ou interatividade, quando combinado com CSS e JavaScript, permite a criação de sites dinâmicos e visualmente atraentes.

Desde que foi lançado em 1991, o HTML evoluiu junto às demais tecnologias, culminando no lançamento do HTML5. Esta versão trouxe melhorias significativas, tornando a experiência online mais acessível e interativa. Compreender o HTML é essencial para qualquer pessoa que deseja ingressar no desenvolvimento web, pois ele serve como a espinha dorsal da internet.

Para quem deseja aprender mais sobre programação, não deixe de clicar aqui e acessar a categoria destinada a esse assunto.

Espero que este conteúdo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.

O que é versionamento semântico? 

No desenvolvimento de software, manter um controle eficiente das versões é essencial para garantir a estabilidade do sistema e facilitar a manutenção e evolução do código. O versionamento semântico surge como um método padronizado para nomear e organizar versões de software de maneira clara e previsível.

Baseado em um sistema de numeração simples, dividido em três componentes, o versionamento semântico permite identificar facilmente o impacto das mudanças realizadas, ajudando equipes de desenvolvimento a gerenciar atualizações e a evitar problemas de compatibilidade.

Neste artigo, exploraremos o que é o versionamento semântico, como ele funciona, sua importância e sua relação com ferramentas como o Git. 

1 – O que é o versionamento semântico 

O desenvolvimento de software é um processo contínuo que ocorre em diferentes etapas e precisa ser devidamente controlado e organizado. O versionamento semântico (também chamado de SemVer, do inglês Semantic Versioning) é um sistema de numeração utilizado para identificar versões de software de maneira clara, organizada e previsível.  

O versionamento semântico surgiu para corrigir um problema conhecido como “dependency hell” (inferno das dependências). Esse problema ocorre quando diferentes bibliotecas ou pacotes de software dependem de versões específicas de outras bibliotecas ou pacotes, criando conflitos e grandes dificuldades na gestão dessas dependências.  

Isso pode levar, por exemplo, a situações em que a atualização de uma biblioteca quebra a compatibilidade com outras, que quando atualizadas podem gerar novas incompatibilidades. Este cenário exige grandes esforços de desenvolvimento para corrigir os problemas de compatibilidade entre as dependências. O resultado é um processo de desenvolvimento e manutenção do software extremamente complicado e custoso, impactando na qualidade das entregas e muitas vezes estourando cronogramas.  

O versionamento semântico ajuda a mitigar esse problema ao fornecer uma metodologia clara e previsível de identificar mudanças nas versões de um software, facilitando a compatibilidade e a integração entre diferentes componentes. Vamos entender como ele funciona: 

2 – Como funciona o versionamento semântico 

O versionamento semântico segue um formato numérico padrão, que possui a seguinte estrutura: 

Exemplo de padrão numérico de versionamento semântico.
Fonte: o autor

Esse padrão numérico é incrementado conforme atualizações são aplicadas no software e cada componente possui uma função específica: 

MAJOR (versão principal): 

Incrementado quando as mudanças implementadas geram incompatibilidades com a versão anterior. 

Exemplos: adição ou remoção de funcionalidades, refatoração do código, redesign de interfaces gráficas. 

MINOR (versão secundária): 

Incrementado quando novas funcionalidades são adicionadas, porém é mantida a compatibilidade com versões anteriores. 

Exemplo: adição ou remoção de uma nova funcionalidade. 

PATCH (correção): 

Incrementado quando há correções de bugs que não geram incompatibilidade do software com a versão anterior. 

Exemplo: correção de problemas de lógica e de processos executados pelo software. 

O versionamento é um processo contínuo que acompanha todo o ciclo de vida de um software. Pense na dinâmica de um projeto de desenvolvimento: após o lançamento da primeira versão de um determinado sistema ou aplicativo, atualizações ocorrerão com o passar do tempo: algumas versões trazem correções de bugs, outras trazem novas funcionalidades (ou remoção de funcionalidade depreciadas), enquanto outras trazem refatorações e redesign completos do software. 

É neste cenário que o versionamento semântico entra em cena, servindo como uma metodologia eficaz para controlar atualizações de software. Repare que cada atualização concluída pela equipe de desenvolvimento irá gerar um incremento numérico em sua versão (chamado de increment version) conforme o tipo desta atualização. 

Aplicar o versionamento semântico garante transparência no controle de versões de um software e facilita a comunicação entre os membros de uma equipe, sendo indispensável para alcançar o sucesso em projetos que trabalhamos no nosso dia a dia. 

3 – Exemplo de versionamento semântico 

Certamente, já deu para entender que o versionamento semântico é muito importante para o desenvolvimento de software. Para um melhor entendimento dessa técnica, vamos ver um exemplo simples e didático: 

0.1.0: Primeira versão experimental. (Representa o início do desenvolvimento do sistema)

0.2.0: Adição de uma funcionalidade. 

0.2.1: Correção de um bug. 

1.0.0: Primeira versão estável. (Representa que o software está pronto para uso e com funcionalidades bem definidas.)

1.1.0: Adição de nova funcionalidade.

1.1.1: Correção de bug. 

1.2.0: Remoção de funcionalidade depreciada. 

1.2.1: Correção de bug. 

2.0.0: Reformulação da API. (quebra a compatibilidade com versões anteriores e exige adaptações significativas por parte dos usuários.) 

O exemplo acima, apesar de simples nos ajuda a compreender como funciona o versionamento semântico. Observe como cada incremento na versão já indica o tipo de alteração e o texto que acompanha a numeração esclarece o impacto das mudanças implementadas. 

Esta prática facilita o trabalho das equipes de desenvolvimento, a gestão das atualizações de software pelos líderes e a aplicação destas atualizações nas máquinas dos usuários pelas equipes de suporte. 

4 – Relação entre Versionamento Semântico e Git 

O Git é um sistema de controle de versão distribuído amplamente utilizado no desenvolvimento de software. Ele permite que os desenvolvedores rastreiem mudanças no código-fonte, colaborem em projetos e revertam para versões anteriores quando necessário. O versionamento semântico e o Git são ferramentas complementares: 

  1. Controle de Versão: O Git possui a responsabilidade de rastrear todas as mudanças realizadas no código, enquanto o versionamento semântico fornece uma maneira estruturada de nomear cada versão gerada, indicando a natureza das mudanças (novas funcionalidades, correções de bugs, mudanças incompatíveis). 
  1. Tags e Releases: No Git, é possível criar tags para marcar pontos específicos na história do repositório, como lançamentos de novas versões. Utilizando versionamento semântico, essas tags podem ser nomeadas de forma consistente (por exemplo, v1.0.0, v1.1.0, v2.0.0), facilitando a identificação e o gerenciamento das versões. 
  1. Branches: O Git permite a criação de branches para o desenvolvimento paralelo. O versionamento semântico ajuda a manter a clareza sobre o estado de cada branch e as versões geradas nelas, especialmente quando se trata de branches de desenvolvimento de novas funcionalidades (branches feature) ou correções de bugs (branches hotfix). 

Ao combinar o Git e o versionamento semântico, conseguimos documentar as mudanças realizadas em um projeto, bem como obtemos um histórico claro e organizado dessas mudanças.  

Essas ferramentas trabalham juntas para proporcionar um fluxo de desenvolvimento mais transparente e eficiente, beneficiando tanto os desenvolvedores quanto os usuários finais, que passam a receber sistemas e aplicativos mais estáveis e bem documentados.

Se você ficou interessado em conhecer mais sobre Git, clique aqui para ler um artigo que escrevi sobre o assunto. 

Conclusão 

O versionamento semântico é uma prática indispensável para o desenvolvimento de software, proporcionando organização, eficiência, previsibilidade e transparência na gestão de versões. Ao adotar esse modelo, equipes de TI conseguem minimizar problemas de compatibilidade, facilitar a colaboração e garantir que usuários e clientes tenham acesso a versões estáveis e bem documentadas do software.  

Além disso, sua integração com ferramentas como o Git torna o controle de versões ainda mais eficiente. Compreender e aplicar o versionamento semântico é um passo fundamental para quem deseja desenvolver projetos de software de forma estruturada e profissional. 

Espero que este conteúdo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.

O que é GIT? 

Seja você um desenvolvedor iniciante ou experiente, certamente já ouviu falar do Git. Ele não é apenas mais uma ferramenta, mas sim um alicerce no mundo do desenvolvimento moderno.

O Git permite que indivíduos e equipes de todo o mundo colaborem em projetos de desenvolvimento de forma organizada e segura, rastreando e controlando cada alteração feita no código-fonte.

Neste artigo, você aprenderá o que é Git, como ele surgiu, para que serve e como utilizá-lo no dia a dia. Vamos começar? 

1 – O que é GIT? 

O Git é um sistema de controle de versão distribuído (DVCS – Distributed Version Control System), amplamente utilizado por desenvolvedores de software para gerenciar e acompanhar alterações em códigos fonte ao longo do tempo.  

O Git possui uma série de funcionalidades que facilitam o controle e gerencimento de projetos de desenvolvimento de softwares, das quais destacam-se: 

 – Rastrear alterações no código: ele registra todas as modificações feitas nos arquivos de um projeto, possibilitando reverter ou comparar versões anteriores. 

 – Facilitar a colaboração: múltiplos desenvolvedores podem trabalhar, simultaneamente, em um mesmo projeto, sem sobrescrever o trabalho uns dos outros, mesmo que as equipes estejam espalhadas pelo mundo todo.

 – Gerenciar ramificações: os desenvolvedores podem criar “branches” para desenvolver novas funcionalidades, corrigir bugs ou testar alterações sem afetar o código principal.  

 – Garantir segurança: com seu modelo distribuído, o Git mantém cópias completas do repositório em cada máquina, reduzindo riscos de perda de dados. 

2 – Quando surgiu o Git? 

 O Git foi criado em 2005 pelo engenheiro de software finlandês Linus Torvalds, o mesmo criador do kernel do sistema operacional Linux.  

Naquela época, a equipe de desenvolvimento do Linux utilizava como sistema de controle de versão um software chamado BitKeeper. Porém, devido a problemas relacionados a licenças e restrições de uso, surgiu a necessidade de uma solução independente.  

Linus então projetou o Git para ser um sistema de controle de versão rápido, eficiente e capaz de lidar com projetos de grande escala como o Linux. E essa ferramenta criada para atender uma demanda específica do projeto de desenvolvimento do Linux, se tornou em um sucesso global, sendo o gerenciador de versões mais popular da atualidade.

3 – Principais ferramentas Git 

O Git é uma ferramenta de linha de comando utilizada via terminal. Porém, para tornar seu uso mais acessível e intuitivo, especialmente para iniciantes e equipes colaborativas, existem ferramentas com interfaces gráficas que simplificam a execução de operações como commits, merges e visualização de histórico de alterações.

Entre as ferramentas mais populares estão o GitHub, o GitLab e o Bitbucket. Estes são serviços baseados em nuvem para hospedagem de repositórios de projetos e oferecem diversos recursos que vão além do controle de versão, tais como: 

Colaboração em equipe: recursos para revisão de código (pull requests ou merge requests), inserção de comentários e discussões diretamente no código. 

Integração e entrega contínuas (CI/CD): automatização do processo de compilação, testes e implantação de projetos. 

Controle de permissões: permite gerenciar qual usuário pode acessar, modificar ou revisar o projeto. 

Documentação integrada: repositórios podem incluir wikis e markdown para documentação de projetos. 

Análise de código e segurança: alguns serviços oferecem ferramentas automáticas para detecção de vulnerabilidades e sugestões de melhorias no código. 

Além destes serviços de armazenamento, existem também ferramentas complementares que podem ser instaladas no computador ou integradas com as IDEs para facilitar ainda mais o trabalho com Git, como Sourcetree, GitKraken, GitHub Desktop e GitGraph.

Essas ferramentas são sincronizadas com o repositório remoto dos seus projetos e lhe fornecem acesso a interfaces gráficas de usuário (GUIs), que possuem uma série de recursos para realizar o gerenciamento de branches e commits nos seus repositórios remotos.

Por fim, é importante destacar que o Git é uma ferramenta local de controle de versão, enquanto ferramentas como o GitHub e GitLab, por exemplo, adicionam recursos extras, mas não são obrigatórias. Você pode usar o Git localmente sem nenhum desses serviços, mas integrá-los aos seus projetos aumentará significativamente a produtividade, especialmente para trabalhos em equipes. 

4 – GitFlow: um padrão estrutural para repositórios 

O Gitflow propõe um modelo estrutural para gerenciar as ramificações (branches) de um repositório Git. Ele sugere a seguinte estrutura de branches para os projetos: 

Develop: é a ramificação onde ficam os códigos que estão sendo trabalhadas pelos desenvolvedores no momento; 

– Release: branch onde estão as alterações já concluídas pelos desenvolvedores e que estão em fase de homologação; 

Main: a principal branch do projeto onde ficam os códigos de produção; 

Hotfix: ramificações criadas, geralmente, a partir da main, para o desenvolvimento das correções de bugs; 

Feature: branches específicas para o desenvolvimento de novos recursos. Muito úteis quanto múltiplas equipes trabalham, simultaneamente, em diferentes alterações para o mesmo projeto. 

O GitFlow prevê uma estrutura de branches baseada em hierarquia. Cada branch possui uma função bem definida nessa hierarquia e o processo ideal descrito pelo GitFlow nos diz que:

As tarefas de desenvolvimento começam na develop. Quando prontas, elas avançam para a release, através de um processo chamado merge, que trata-se de uma mesclagem das alterações de uma branch para outra.

Na branch release, as alterações propostas serão testadas e validadas. Quando finalizado o processo de testes, as alteraçõres avançam para a main (ou master em projetos mais antigos) e são entregues em produção.

O GitFlow também sugere a criação das branches feature e hotfix para o desenvolvimento de funcionalidades específicas e correções de bugs, respectivamente. Essas branches são usadas em paralelo as demais e quando concluídas as suas tarefas de desenvolvimento, elas devem seguir o mesmo processo de mesclagem: develop -> release -> main.

Respeitar o processo proposto pelo GitFlow garante uma equalização dos códigos entre todas as branches e evita a perda de correções e melhorias entre uma ramificação e outra.  

5 – Principais comandos do Git 

Como podemos perceber até agora, o Git é uma ferramenta robusta e poderosa para o gerenciamento de versões de projetos. Ele possui uma ampla lista de comandos úteis para o controle dos repositórios dos nossos projetos. A seguir vamos conhecer os principais comandos e qual sua função: 

  • git init: inicializa um novo repositório Git em um diretório. 
  • git clone: clona um repositório remoto para sua máquina local. 
  • git status: exibe o estado atual do repositório, incluindo arquivos modificados, novos arquivos e arquivos prontos para commit. 
  • git add: adiciona arquivos ou alterações a staging area (área de preparação) para ser incluído no próximo commit. 
  • git commit: cria um novo commit, que registra as alterações no histórico do repositório. 
  • git pull: atualiza o repositório local com as alterações do repositório remoto. 
  • git push: envia as alterações do repositório local para o repositório remoto. 
  • git branch: utilizado para listar, criar ou excluir branches do repositório. 
  • git checkout: comando para acessar commits e branches do projeto. 
  • git merge: une as alterações de uma ramificação a outra. 
  • git log: exibe o histórico de commits do repositório. 

Além dos comandos citados acima, o Git possui muitos outros disponíveis para garantir um gerenciamento eficiente de repositórios. Se você quer conhecer esses comandos e ver alguns exemplos de uso do Git, recomendo que acesse a documentação oficial disponível nesse link. Explore a documentação e conheça um pouco mais sobre essa ferramenta popular no desenvolvimento de softwares. 

Conclusão 

O Git além de uma robusta ferramenta de controle de versão, é também um verdadeiro facilitador para o desenvolvimento colaborativo de projetos, sejam de pequeno ou grande porte.  

Abrangendo do rastreamento de alterações até a gestão de branches e integração com ferramentas como GitHub e GitLab, o Git desempenha um papel fundamental no fluxo de trabalho de desenvolvedores e equipes de software.  

Dominar seus conceitos e comandos é essencial para quem deseja atuar de maneira produtiva e eficiente no mundo da tecnologia. Nos próximos posts, exploraremos cada um desses tópicos com mais profundidade, ajudando você a aproveitar ao máximo essa poderosa ferramenta! 

Aproveite também para conhecer meus artigos sobre programação, clicando aqui. Espero que este conteúdo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.

O que são ataques cibernéticos?

No mundo cada vez mais conectado em que vivemos, termos como DDoS, MITM e Phishing tem se tornado cada vez mais comuns e preocupantes para usuários e organizações. Cada um desses termos nomeia um tipo diferente de ataque cibernético e representam uma ameaça constante para nossos dados e informações.

Neste artigo, vamos explorar o que são esses ataques e como podemos nos proteger deles em nosso dia a dia. Vamos começar? 

1 – O que são ataques cibernéticos?

Ataques cibernéticos são tentativas maliciosas de acessar sistemas computacionais, redes ou dispositivos com o intuito de roubar dados, causar danos ou interromper serviços. Estes ataques podem ser realizados por indivíduos, grupos organizados ou até mesmo por nações, com diferentes motivações: 

Criminosas: são ataques que visam obter ganhos financeiros. Possivelmente, os ataques mais comuns que existem, possui uma grande quantidade de exemplos como: invasão a contas bancárias, sequestro de dados, falsificação de títulos de pagamentos, entre outros. 

Políticas: são ataques que buscam promover causas sociais ou agendas e ideologias políticas. Esses ataques procuram desestabilizar os sistemas ou roubar dados de organizações governamentais (especialmente órgãos de segurança nacional e da alta gestão pública) e causar interrupções de serviços essenciais. 

Pessoais: são ataques que incluem uma variedade de aspectos pessoais e emocionais do envolvido ou envolvidos. Pode se tratar de uma vingança contra uma pessoa ou organização, uma forma de provar sua capacidade intelectual de invadir um sistema, entre outros fatores. 

2 – Principais tipos de ataques cibernéticos 

Infelizmente, a lista de ataques cibernéticos é bastante extensa e tem crescido cada vez mais. As técnicas adotadas pelos cibercriminosos variam da tradicional força bruta (aplicação de tentativa e erro até descobrir uma credencial de acesso) até sofisticadas técnicas de engenharia social. 

Independente da técnica utilizada, ataques cibernéticos são uma ameaça real para indivíduos e organizações. Um ataque bem-sucedido pode gerar enormes perdas financeiras, bem como prejudicar a reputação das vítimas.  

Abaixo, vamos ver uma relação com os principais tipos de ataques existentes. 

2.1 – Malware 

Malware é um termo geral para definir um software malicioso projetado para infectar sistemas e causar danos. Na classificação de malwares estão incluídos: 

Trojans: são softwares maliciosos disfarçados de aplicativos legítimos ou escondidos dentro de aplicações legítimas que executam atividades maliciosas no dispositivo infectado. 

Ransomware: é um software malicioso que quando executado criptografa os dados da vítima. Para restaurar o acesso aos dados, os criminosos exigem um pagamento da vítima. Grandes empresas e até mesmo hospitais têm sido alvos frequentes desse tipo de ataque. 

Spyware: é um programa que é instalado em um dispositivo para coletar dados e informações dos usuários. O spyware rastreia tudo que é feito pelo usuário sem o seu consentimento e envia os dados coletados para um dispositivo remoto que é controlado pelo invasor. Esses softwares também podem baixar e instalar outros programas maliciosos da internet sem que o usuário perceba. 

2.2 – Phishing 

O phishing é uma das táticas mais comuns utilizadas pelos cibercriminosos. Classificada como uma técnica de engenharia social, consiste no envio de mensagens fraudulentas (geralmente por e-mail, SMS ou chats de redes sociais) que parecem ser de fontes verídicas.  

O objetivo é enganar o destinatário para que ele forneça dados sensíveis, como senhas, informações bancárias ou números de cartões de crédito. Também há casos em que o objetivo é persuadir o usuário a baixar um malware em seu dispositivo. Exemplos comuns de phishing incluem falsos alertas de bancos e promoções falsas de grandes empresas. 

2.3 – MITM (Man In The Midle) 

Os ataques do tipo Man In The Midle (traduzido como “Homem no Meio”) ocorrem quando um invasor intercepta a comunicação entre duas partes, como um usuário e um site por exemplo, para espionar, roubar dados ou alterar as informações trocadas. A aplicação desse tipo de ataque é comum em redes Wi-Fi públicas, onde a segurança tende a ser mais fraca. 

2.4- Ataques DDoS (Distributed Denial-of-Service) 

Nos ataques de Negação de Serviço Distribuído (DDoS), os criminosos sobrecarregam um servidor ou rede com um volume excessivo de requisições. Isso deixa o sistema lento ou completamente inacessível para os usuários legítimos. 

Em geral, esses ataques não trazem ganhos financeiros para os criminosos, somente satisfação pessoal por tornar o serviço inacessível. Porém, há casos em que um ataque desse tipo pode ser parte de uma estratégia de extorsão ou possuir motivações político-ideológicas para prejudicar a reputação daquela organização. 

2.5- Ataques de Força Bruta 

Os ataques de força bruta utilizam tentativa e erro para descobrir senhas, testando automaticamente inúmeras combinações de caracteres até encontrar a correta. Embora simples, essa técnica é eficaz, especialmente contra senhas fracas ou reutilizadas em muitos serviços diferentes. 

2.6 – Engenharia Social 

A engenharia social é uma técnica que explora o fator humano, manipulando psicologicamente as pessoas para que revelem informações confidenciais, concedam acesso a sistemas, baixem arquivos maliciosos e até mesmo enviem dinheiro para os criminosos. 

Ligações telefônicas falsas de suporte técnico ou mensagens que apelam para urgência, como “sua conta será desativada se não agir agora”, são bons exemplos desse tipo de ataque.

3 – Como se proteger de ataques cibernéticos?

Como vimos, existe uma enorme quantidade de ataques cibernéticos e não devemos jamais negligenciar nossa segurança digital. Entender os diferentes tipos de ataques cibernéticos é o primeiro passo para nos proteger dos criminosos. Mas isso não é o suficiente, precisamos tomar medidas de segurança para proteger nossos dados e informações. Veja abaixo, uma lista de medidas de segurança que devemos adotar em nosso dia a dia: 

3.1 – Medidas de segurança contra ataques cibernéticos

Mantenha softwares e sistemas atualizados: mesmo que seja muito chato esperar o download e a instalação de uma atualização de sistema, não devemos negligenciar esse ponto. Atualizações de softwares trazem correções para vulnerabilidades de segurança e são essenciais para nossa proteção. 

– Utilize Senhas Fortes: crie senhas complexas que combinem letras, números e caracteres especiais. Não reutilize senhas e, periodicamente, atualize as senhas que você utiliza. Clique aqui para aprender como criar uma senha forte e aqui para acessar um gerador de senhas gratuito. 

Use softwares originais: a pirataria além de ser crime, representa uma grande vulnerabilidade para a segurança dos nossos dados. Todo software pago que foi modificado por alguém para funcionar gratuitamente tem o potencial de possuir brechas de segurança e códigos maliciosos que poderão ser usados por cibercriminosos. Sempre opte por adquirir softwares originais e, se você não possuir condições financeiras para comprá-los, procure por uma alternativa open source. 

Ative a autenticação de dois fatores:  sempre que possível utilize a autenticação multifator. Uma camada extra de proteção é importante para manter nossos dados protegidos caso a primeira barreira seja rompida por um invasor. 

 – Mantenha backups regulares: mesmo tomando todas as medidas de segurança possíveis, ainda assim uma invasão pode acontecer. Por isso, é importante manter backup das suas informações mais importantes, seja em um dispositivo físico ou um servidor na nuvem. 

Evite redes Wi-Fi públicas: redes Wi-Fi abertas, como as de aeroportos e hospitais, atraem cibercriminosos. Eles exploram essas conexões, usadas diariamente por muitas pessoas, para encontrar vulnerabilidades e roubar dados. Use redes públicas apenas em emergências. Sempre que possível, use sua rede de dados móveis, que oferece muito mais segurança do que uma Wi-Fi pública.

3.2 – Medidas extras: fique atento e informado

Além das medidas acima, outros dois aspectos comportamentais são fundamentais para nossa segurança digital: estar atento aos detalhes e manter-se informado.

 – Mantenha-se sempre atento: todas as medidas de segurança são fundamentais, mas se não estivermos atentos aos detalhes nós mesmos podemos representar uma vulnerabilidade aos dados. Os golpes estão cada vez mais sofisticados e qualquer pessoa pode se tornar uma vítima. Devemos sempre analisar o cenário antes de clicar em links, fornecer nossos dados para cadastros, baixar arquivos para nossos dispositivos, entre outras situações. 

Mantenha-se atualizado: como dito, anteriormente, existem muitos tipos de ataques cibernéticos e a lista não para de crescer. Portanto, procure informar-se sobre os golpes que estão sendo aplicados e conheça as medidas de segurança que você pode adotar. Quando você está bem-informado, coloca-se um passo à frente de possíveis ataques de cibercriminosos e fecha brechas que eles poderiam explorar.

Conclusão 

A segurança cibernética não pode ser negligenciada por ninguém. De um simples usuário de internet até as grandes corporações públicas e privadas, devemos estar constantemente vigilantes e atualizados do que está acontecendo ao nosso redor.  

Ao compreender os tipos de ataques existentes e implementar medidas de proteção adequadas, podemos reduzir significativamente os riscos de nos tornarmos vítimas de criminosos cibernéticos. 

Lembre-se: prevenir é sempre melhor que remediar. Mantenha-se informado, atualizado e atento para garantir a segurança dos seus dados e informações. 

Espero que este conteúdo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.

O que são linguagens de programação? 

No mundo cada vez mais digital em que vivemos, as linguagens de programação são recursos fundamentais para o desenvolvimento das tecnologias que utilizamos em nosso dia a dia.

De smartphones a sistemas bancários, de redes sociais a jogos eletrônicos, todo software que conhecemos nasceu através de uma ou mais linguagens de programação.

Mas afinal, o que são essas linguagens e como elas funcionam? Neste artigo, vamos explorar os fundamentos das linguagens de programação, entender suas diferentes classificações e conhecer as principais linguagens utilizadas atualmente no mercado de tecnologia. 

1 – O que é uma linguagem de programação? 

Linguagens de programação são um conjunto de regras léxicas, sintáticas e semânticas utilizadas para escrever o código fonte de softwares. São linguagens formais, semelhantes aos idiomas (linguagens naturais) que conhecemos e usamos para nos comunicar com outras pessoas, como por exemplo, inglês, português, espanhol etc.  

Porém, apesar das linguagens de programação possuírem muitas semelhanças com as linguagens naturais, elas não foram criadas para comunicação entre seres humanos. Seu propósito é ser o instrumento utilizado por programadores para transformar suas ideias em códigos que computadores e dispositivos eletrônicos podem interpretar e processar.  

Aplicativos, jogos, sites, sistemas operacionais, absolutamente todos os tipos de softwares que usamos em nosso dia a dia foram desenvolvidos através de 1 ou mais linguagens de programação.  

Existem muitas linguagens de programação disponíveis atualmente, cada uma delas com suas características e finalidades próprias. Há também diferentes formas de classificar as linguagens de programação, como veremos no tópico a seguir. 

2 – Tipos de linguagens de programação 

Existem várias formas de classificar uma linguagem de programação. Uma classificação muito popular é quanto ao seu nível de proximidade com a linguagem humana:

2.1 – Linguagens de alto nível e baixo nivel

Linguagens de alto nível: são mais próximas da linguagem humana, o que as torna mais fáceis de aprender e usar. Exemplos incluem Python, PHP, Javascript, Java e C#. Elas são ideais para o desenvolvimento de sites e aplicativos em geral. 

Linguagens de baixo nível: são mais próximas do código binário da máquina, permitindo um controle mais preciso do hardware. Exemplos incluem Assembly e C. Essas linguagens são frequentemente usadas para desenvolvimento de sistemas operacionais, drivers e software embarcado. 

2.2 – Paradigmas de programação

Outra forma de classificar as linguagens é quanto aos paradigmas de programação que ela é compatível

Imperativas: focam em “como” resolver um problema, descrevendo passo a passo o que deve ser feito. Exemplos: C, Python, Java. 

Declarativas: focam em “o que” resolver, sem especificar como deve ser feito. Essas linguagens possuem uma série de comandos prontos que são aplicados de forma lógica e sequencial. Exemplo: SQL e Prolog. 

Funcionais: baseiam-se na aplicação de funções matemáticas para resolver os problemas e evitam estados mutáveis. Exemplos: Haskell, Scala, JavaScript, PHP, TypeScript.  

Orientadas a Objetos: estruturam o código em torno de objetos que possuem atributos e métodos, replicando aquilo que existe no mundo real em códigos de computador. Exemplos: Java, C#, Python. 

2.3 – Formas de execução dos códigos

Além das classificações acima, outra forma interessante e popular, é a classificação pela forma de execução dos códigos: 

Compiladas: o código fonte é traduzido para código de máquina antes da execução. Exemplo: C, C++. 

Interpretadas: o código fonte é executado, em tempo real, linha a linha por um interpretador. Exemplo: Python, Ruby. 

Híbridas: são linguagens que combinam compilação e interpretação. Exemplos: Java e Kotlin. 

Essas são as classificações mais comuns e aceitas, sendo úteis para conhecermos as características de cada linguagem de programação e entender para qual finalidade ela melhor se aplica. 

3 – Principais linguagens de programação existentes 

Desde o início da computação moderna, em meados dos anos 1940, centenas de linguagens de programação foram criadas. Estima-se que, atualmente, exista um pouco mais de 1300 linguagens de programação. Enquanto algumas linguagens foram criadas para usos mais generalistas, outras possuem finalidades específicas e se aplicam a contextos bem definidos.  

Considerando o índice da TIOBE e a pesquisa anual do StackOverflow, apresentamos a seguir uma lista com as principais linguagens de programação utilizadas no desenvolvimento de softwares, com dados do início do ano de 2025:

3.1 – As linguagens de programação mais populares

C: é uma linguagem de programação de baixo nível e alto desempenho, conhecida por sua eficiência e controle direto sobre hardware. Amplamente utilizada para o desenvolvimento de sistemas operacionais, drivers e softwares embarcados, é a base de muitas outras linguagens modernas. 

C++: evolução do C, o C++ adiciona suporte à programação orientada a objetos, além de recursos como templates e bibliotecas padrão poderosas. É popular no desenvolvimento de jogos, sistemas operacionais e sistemas embarcados. 

C#: criada pela Microsoft, é uma linguagem moderna e orientada a objetos, amplamente usada no desenvolvimento de aplicativos para Windows, jogos com Unity e aplicações web com o framework .NET.  

Go: desenvolvida pelo Google, é uma linguagem de programação eficiente e minimalista, focada em simplicidade e desempenho. Ideal para aplicações em nuvem, sistemas distribuídos e serviços back-end, combina desempenho com um gerenciamento de memória moderno. 

Java: é uma linguagem de programação versátil e orientada a objetos, famosa por sua portabilidade graças ao lema “escreva uma vez, rode em qualquer lugar”. É amplamente usada no desenvolvimento de aplicativos corporativos, aplicativos Android e sistemas web robustos. 

JavaScript: uma das linguagens mais populares para desenvolvimento web, JavaScript permite criar interfaces dinâmicas e interativas. É essencial para front-end e, com Node.js, também pode ser usada no back-end, consolidando sua popularidade entre os desenvolvedores. 

PHP: é uma linguagem de script do tipo server-side amplamente usada para desenvolvimento web. Sua simplicidade e facilidade de integração com bancos de dados fazem dela uma boa escolha para sites dinâmicos e sistemas de gerenciamento de conteúdo. 

Python: é uma linguagem de alto nível conhecida por sua legibilidade e simplicidade. Possui uma ampla gama de bibliotecas open source e é usada em áreas como ciência de dados, inteligência artificial, automação, desenvolvimento web e ensino de programação. 

SQL: é a linguagem padrão para gerenciamento e manipulação de bancos de dados relacionais. Com seu conjunto de comandos simples e poderosos, é possível consultar, atualizar e organizar grandes volumes de dados. 

TypeScript: uma extensão do JavaScript, essa linguagem adiciona tipagem estática opcional e recursos modernos que tornam o código mais robusto e fácil de manter em longo prazo. É amplamente usada no desenvolvimento de aplicações front-end. 

Certamente, além das linguagens acima, você já deve ter ouvido falar de muitas outras como Kotlin, Delphi, Ruby, Swift, Rust, Fortran, Assembly, etc. Mas neste artigo não irei além das linguagens listadas acima, para que ele não fique excessivamente longo. Em ocasiões oportunas falarei sobre essas e muitas outras linguagens. Fique atento as postagens do blog! 

Conclusão 

Como vimos ao longo deste artigo, as linguagens de programação são instrumentos essenciais no desenvolvimento tecnológico, cada uma com suas características e propósitos específicos.  

Embora existam mais de 1300 linguagens documentadas, é importante entender que não existe uma linguagem “melhor” que outra – existe aquela mais adequada para cada tipo de projeto ou objetivo. E à medida que a tecnologia evolui, novas linguagens surgem e as existentes se atualizam.   

Por isso, é importante compreendermos que, em uma área ampla e em constante mudança como o desenvolvimento de sistemas, devemos estar, permanentemente, atentos as novas tecnologias e buscando aprofundar cada vez mais, nossos conhecimentos e habilidades nas linguagens que utilizamos no dia a dia. 

Espero que este conteúdo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.  

E se você quiser aprender mais sobre programação, não deixe de conferir os outros artigos que tenho aqui no site sobre esse assunto, clicando aqui

O que é LGPD?

A Lei Geral de Proteção de Dados Pessoais, conhecida como LGPD, é um marco regulatório que revolucionou a forma como os dados pessoais são tratados no Brasil. Desde sua implementação, em 2020, a LGPD tem trazido mudanças significativas para empresas e cidadãos, promovendo uma cultura de privacidade e segurança de dados no Brasil.

Neste artigo, vamos conhecer um pouco mais sobre essa lei e sua importância para o nosso dia a dia. Vamos começar respondendo o que é essa lei, após vamos entender o que são dados pessoais e quais são os principais tópicos da LGPD.  

1 – O que é a LGPD? 

A LGPD, ou Lei nº 13.709/2018, é a legislação brasileira que regulamenta o tratamento de dados pessoais coletados e armazenados por empresas (públicas ou privadas), tanto em ambientes físicos quanto digitais.  

Inspirada na regulamentação europeia (GDPR), a LGPD foi sancionada em 2018, e entrou em vigor no Brasil em 18/09/2020, estabelecendo diretrizes para a coleta, armazenamento, uso, compartilhamento e eliminação de dados pessoais, visando proteger a privacidade dos cidadãos. 

2 – O que são dados pessoais? 

A LGPD define em seu texto, no artigo 5, o conceito de dados pessoais, fundamental para o entendimento desta lei.

Os dados pessoais são entendidos como aquelas informações relacionadas à pessoa identificada (nome completo, RG, CPF, etc.) ou identificável (dados de geolocalização (GPS), endereço IP, identificação de dispositivo, etc.). 

A LGPD ainda traz o conceito de dados pessoais sensíveis relacionados a aspectos como: origem racial ou étnica, convicção religiosa, opinião política, filiação sindical ou a organização de caráter religioso, filosófico ou político, dados genéticos ou biométrico, entre outros. 

Dados pessoais contemplam o objeto protegido pela regulamentação da LGPD e por isso é importante entender claramente o seu conceito. 

3 – Principais Tópicos da LGPD 

Os dados pertencem ao seu titular e não às empresas que os coletam, armazenam ou tratam. A LGPD trouxe a regulamentação necessária para garantir a privacidade dos indivíduos. Essa lei define as regras para o uso adequado e correto dos dados coletados e armazenados por terceiros e está baseada nos seguintes tópicos centrais: 

  1. Consentimento: o tratamento de dados deve ocorrer com o consentimento explícito do titular. 
  1. Transparência: as empresas devem ser claras sobre como e para qual finalidade os dados estão sendo coletados e utilizados. 
  1. Segurança: medidas técnicas e administrativas devem ser implementadas para proteger os dados contra vazamentos e acessos, alterações e exclusões não autorizadas. 
  1. Anonimização: é uma técnica que modifica ou remove trechos de informações que possam identificar uma pessoa. A anonimização torna as informações não associáveis a um indivíduo específico. Dados anonimizados só podem ser associados ao titular com o uso de informações adicionais mantidas separadamente e protegidas. Essa técnica é especialmente importante para reduzir riscos em casos de vazamento ou acessos indevidos, garantindo que os indivíduos não sejam identificados. 
  1. Direitos dos Titulares: os cidadãos possuem pleno direito de acessar, corrigir, excluir e transferir seus dados pessoais, bem como podem revogar o consentimento de uso e tratamento dos seus dados. 
  1. Sanções: penalidades podem ser aplicadas em caso de descumprimento da lei, incluindo a aplicação de multas. A Agência Nacional de Proteção de Dados, ANPD, é o órgão responsável por fiscalizar a aplicar eventuais penalidades por descumprimento da LGPD.  

Como é possível ver, a LGPD estabelece uma série de regras que promovem o uso responsável de informações por parte das empresas e garantem a privacidade dos indivíduos. 

A LGPD também promove a segurança jurídica ao estabelecer regras claras sobre como dados pessoais devem ser tratados, reduzindo incertezas para as empresas e proporcionando um ambiente mais estável e seguro para operações comerciais e tecnológicas. Com regras bem definidas, tanto os titulares quanto as organizações sabem quais são seus direitos e deveres, o que contribui para o fortalecimento da confiança mútua e o desenvolvimento sustentável da economia digital. 

Conclusão  

A LGPD representa um grande avanço na proteção de dados no Brasil. Ela garante direitos e obrigações claras aos titulares dos dados e para as empresas que tratam estes dados. Dessa forma, a legislação promove a privacidade e a segurança jurídica necessárias para o desenvolvimento de um ambiente econômico saudável e competitivo. 

Para os cidadãos, a LGPD significa mais controle sobre suas informações pessoais e maior segurança contra fraudes e vazamentos. Para as empresas, incentiva práticas de governança e gestão de dados, promovendo a confiança dos clientes e uma boa reputação corporativa. 

Espero que o conteúdo aqui apresentado seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.

O que são linguagens de marcação?

No mundo da computação, as linguagens de marcação desempenham um papel fundamental na organização e apresentação de informações em ambientes digitais. Seja navegando em páginas web, lendo documentações técnicas ou compartilhando dados entre sistemas, estamos constantemente interagindo com documentos criados por meio dessas linguagens.

Este artigo apresenta uma visão geral sobre as linguagens de marcação, abordando suas características e as principais linguagens utilizadas atualmente, permitindo compreender sua importância e suas aplicações no dia a dia. 

1 – O que é uma linguagem de marcação? 

Uma linguagem de marcação (do inglês, markup language)  é  um conjunto de códigos e anotações padronizadas que descrevem a estrutura e a forma de apresentação de um documento.  

Linguagens de marcação são utilizadas na construção de interfaces gráficas de usuário e na transferência de dados entre diferentes dispositivos.  

A ideia central desse tipo de linguagem é a marcação padronizada de dados. Isto envolve a aplicação de um conjunto de códigos e regras simples em uma sequência de dados no formato de texto-puro. O resultado é um documento, estruturalmente, padronizado que é legível por pessoas e aplicações de diferentes dispositivos e sistemas operacionais. 

2 – Onde surgiram as linguagens de marcação? 

A primeira linguagem de marcação foi a SGML (Standard Generalized Markup Language ou Linguagem Padronizada de Marcação Genérica), criada na década de 60 por pesquisadores da IBM.  

A linguagem possuía dois objetivos básicos: 

– A marcação do documento deve descrever a sua estrutura e outros atributos pertinentes, em vez de especificar o processamento a ser feito no mesmo; 

– A marcação deve ser definida rigorosamente, de forma que diferentes sistemas possam ser usados para processar o documento. 

O SGML foi um marco na história da computação. A linguagem representa o primeiro padrão estrutural para documentos, permitindo uma fácil portabilidade (transferência) destes documentos entre diferentes sistemas e dispositivos. 

Nas décadas seguintes, surgiram novas linguagens de marcação derivadas do SGML, como o HTML, lançado no final da década de 1980, e o XML lançado em 1996. Ambas as linguagens fazem parte de nosso dia a dia e no próximo tópico vamos conhecer um pouco mais a respeito delas.

3 – As linguagens de marcação existentes

Nesse tópico vamos conhecer as principais linguagens de marcação existentes na atualidade. Começando pelo HTML:

3.1 HTML

Provavelmente, a linguagem de marcação mais conhecida que existe, o HTML é essencial para a construção de páginas web e interfaces gráficas de diversas aplicações. 

HTML é a sigla para Hypertext Markup Language, ou Linguagem de Marcação de Hipertexto.  Esta linguagem define a estrutura de um documento que será exibido ao usuário final. 

Através de um conjunto de marcações chamadas de tags, é possível definir a posição, o tipo e o comportamento de diversos elementos, como títulos, parágrafos, links, caixas de seleção, botões, entre outros. 

Para um melhor entendimento do tema, vamos ver um exemplo simples de um documento HTML: 

<!DOCTYPE HTML> 
<html> 
    <head> 
        <meta charset="utf-8"> 
        <title>Exemplo HTML</title> 
    </head> 
    <body> 
        <h1>Olá mundo!</h1> 
        <p>Eu sou um documento HTML!</p> 
    </body> 
</html>

Observe que cada tag geralmente possui uma abertura e um fechamento, delimitadas pelos símbolos < > e </ >. Além disso, cada tag desempenha uma função específica dentro da estrutura do documento. 

Documentos HTML possuem a extensão .html e compõem a base da internet. Eles são indispensáveis para a construção da estrutura de páginas web e desempenham um papel crucial no funcionamento da web moderna. 

3.2 – XML

Outra linguagem de marcação amplamente conhecida e utilizada e conhecida é o XML. Diferente do HTML, o XML não possui foco em exibir dados para os usuários. Sua finalidade é descrever e padronizar a estrutura dos documentos para facilitar sua transferência entre diferentes dispositivos e sistemas.  

XML é a sigla para eXtensible Markup Language, ou Linguagem de Marcação Extensível.  Esta linguagem também utilizada o conceito de tags em suas marcações. Porém, ao contrário do HTML que possui um conjunto pré-definido de tags, o XML não conta com tags pré-definidas. Dessa forma, os usuários podem criar suas próprias tags para representar os dados que desejam manipular. 

Ainda em comparação com o HTML, o XML possui uma estrutura mais rígida quanto a abertura e fechamento de tags e quanto a identação das tags para fins hierárquicos no documento. 

Para esclarecer as diferenças entre as linguagens, vamos ver um exemplo simples de um documento XML: 

<?xml version="1.0" encoding="UTF-8"?>  
<livro>  
       <titulo>O Senhor dos Anéis</titulo> 
       <autor>J.R.R. Tolkien</autor>  
       <ano>1954</ano>  
       <genero>Fantasia</genero>  
</livro>

No exemplo acima, observamos que o documento XML utiliza tags personalizadas para descrever informações específicas, como <titulo>, <autor>, <ano> e <genero>. Cada tag representa um dado, e a indentação define a estrutura hierárquica.

Documentos XML possuem a extensão .xml e são amplamente utilizados na integração entre diferentes plataformas, permitindo um formato padrão para transmissão de dados. 

3.3 – Markdown

O Markdown é uma linguagem de marcação leve e de fácil escrita. Diferente do HTML e do XML, ela não segue regras rigorosas, sendo uma linguagem de marcação leve e fácil de escrever, que permite que muitos desenvolvedores e escritores a usem para criar textos formatados de maneira simples e intuitiva.

O Markdown é um método de formatação de texto baseado em caracteres especiais, que transformam textos simples em documentos estilizados. Diferentemente de outras linguagens de marcação, ele não utiliza tags para definir os elementos do documento. Em vez disso, emprega caracteres como por exemplo #, * e [] para identificar e estruturar os elementos. Com esta linguagem, é possível criar títulos, listas, links, imagens, tabelas, blocos de código e muito mais, sem a complexidade de linguagens como HTML ou XML. 

Para ilustrar, vejamos um exemplo básico de um documento Markdown: 

# Olá, mundo!

Eu sou um **documento Markdown**. Aqui está um exemplo de algumas das coisas que você pode fazer:

## Lista não ordenada:
- Item 1
- Item 2
- Item 3

## Lista ordenada:
1. Primeiro item
2. Segundo item
3. Terceiro item

**Texto em negrito**
*Texto em itálico*
***Texto em negrito e com itálico***

## Link:
[Acesse o meu site](https://www.thiagogaelzer.com)

Observe no exemplo acima as peculiaridades dessa linguagem. Cada elemento segue uma sintaxe específica que o diferencia. Usamos o símbolo # para criar títulos, o traço - para listas não ordenadas e números seguidos de ponto para listas ordenadas. Para destacar textos em negrito ou itálico, usamos asteriscos * ou sublinhados _.

Documentos markdown possuem extensão .md ou .markdown. São amplamente utilizados na construção de documentações técnicas (como README e CHANGELOG). Postagens de blogs e até mesmo softwares de produtividade que usamos no dia a dia, como Slack, Discord e Notion, utilizam essa linguagem.

Além das linguagens de marcação mencionadas aqui, existem outras como, por exemplo, o SVG, o MathML e o LaTex, cada uma delas com uma aplicação específica. Neste artigo, não irei detalhar essas linguagens, deixando para postagens futuras. 

Conclusão 

As linguagens de marcação revolucionaram a forma de estruturar, compartilhar e apresentar informações em ambientes digitais. Desde sua origem com o SGML até as implementações modernas como HTML, XML e Markdown, estas linguagens continuam evoluindo para atender às crescentes demandas tecnológicas. 

Cada linguagem possui características e aplicações específicas: o HTML mantém-se como pilar fundamental da web, o XML garante a padronização na transferência de dados entre sistemas, e o Markdown oferece uma alternativa simplificada para criação de conteúdo estruturado. 

Compreender os usos e aplicações das linguagens de marcação é essencial para profissionais da área de tecnologia. Na prática, essas linguagens são ferramentas indispensáveis no desenvolvimento de sistemas eficientes e modernos. 

Espero que o conteúdo aqui apresentado seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato.

Pilares da programação orientada a objetos

A programação orientada a objetos (POO) é um paradigma amplamente usado no desenvolvimento de softwares. Adotado por linguagens de programação populares como Java e C#, por exemplo, o paradigma é aplicável a uma ampla variedade de projetos, desde os mais simples até os mais complexos.

A orientação a objetos busca aproximar o mundo real ao mundo da programação de computadores. A ideia central deste paradigma é que tudo aquilo que existe no mundo real pode ser representado em código através de objetos.

Para exemplificar, pense no sistema de uma universidade. Neste sistema, um aluno é representado como um objeto, com atributos e comportamentos específicos. Os atributos do objeto ‘aluno’ podem incluir matrícula, nome, data de nascimento, endereço, curso, disciplinas, entre outros. Os comportamentos podem englobar a realização de matrículas em disciplinas, cancelamento de matrículas, listagem de disciplinas matriculadas ou concluídas, cálculo de médias semestrais, entre outros. Da mesma forma, um professor, uma disciplina, um curso e qualquer outra entidade do sistema universitário pode ser representada como um objeto, com seus atributos e comportamentos próprios. 

Este artigo não possui a finalidade de detalhar os conceitos da POO, o foco aqui serão os quatro pilares fundamentais deste paradigma. Se você estiver interessado em conhecer mais sobre POO, clique aqui para ler um artigo que escrevi sobre esse assunto.  

1 – Os 4 pilares da programação orientada a objetos 

Os quatro pilares da POO representam quatro características que linguagens de programação e projetos devem atender para que sejam classificados como orientados a objetos. Essas características que formam os pilares da orientação a objetos são: abstração, encapsulamento, herança e polimorfismo.  

Abaixo vamos conhecer cada uma dessas características e na sequência vamos ver um projeto simples de Java, que simula operações bancária, criado para fins didáticos e que com certeza irá lhe ajudar no entendimento dos conceitos aqui apresentados.  

1.1 – Abstração 

A abstração está relacionada a capacidade de representar as coisas que existem no mundo real como objetos em um software. Os objetos devem ser identificados (nomeados) conforme sua função e devem possuir atributos (ou propriedades) e métodos (ou comportamentos) devidamente definidos e configurados.  
Pense, por exemplo, em um sistema bancário. Nesse sistema há um objeto chamado ContaBancaria, no qual temos atributos como número da conta, titular e saldo e temos também métodos como sacar, depositar, transferir e consultar saldo. Esse objeto é uma abstração de algo do mundo real (contas bancárias) representado em um software. 

1.2 – Encapsulamento 

O encapsulamento está ligado, diretamente, a segurança das informações do sistema. Ele pode ser entendido como uma forma de ocultação de dados.  

O encapsulamento restringe os acessos aos atributos e métodos dos objetos, evitando que ocorram acessos desnecessários que possam ocasionar mudanças indesejadas no sistema. A ideia é que cada objeto é responsável por manter a integridade dos seus dados (atributos), permitindo que sejam acessados somente através de métodos públicos específicos para essa finalidade.  

Vamos pensar no objeto ContaBancaria que apresentamos na explicação do conceito de abstração. É prudente que os seus atributos número da conta, titular e saldo sejam encapsulados e, portanto, acessados somente pelos seus métodos, a fim de evitar a exposição e manipulação dessas informações em outras partes do código. 

Nas linguagens de programação orientadas a objetos, o encapsulamento é alcançado através do uso de métodos de acesso (getters e setters) e modificadores de acesso (como public, private e protected). 

1.3 – Herança 

Herança é a característica de um objeto ou classe receber (herdar) atributos e métodos de um objeto ou classe superior. Assim, surge o conceito de classe mãe e classes filhas, as quais herdam atributos e métodos da classe mãe.  

Pensando novamente no exemplo do sistema bancário, nele temos uma classe chamada ContaCorrente  que é uma classe filha de ContaBancaria. Desta forma, a classe ContaCorrente herda os atributos (número da conta, titular e saldo) e os métodos (sacar, depositar, transferir e consultar saldo) da sua classe mãe ContaBancaria. Essa mesma regra valeria para outras classes filhas de ContaBancaria como, por exemplo, ContaDigital e ContaSalario.  

Note que, apesar de conta corrente, conta poupança e conta salário serem tipos diferentes de contas bancárias, todas compartilham os mesmos atributos e métodos básicos da classe ContaBancaria. Essa relação entre as classes, permitida pela herança, possibilita a reutilização de código, deixando o projeto mais organizado, legível e performático. 

1.4 – Polimorfismo 

O polimorfismo pode ser entendido como a característica da POO em que um mesmo método pode ter comportamentos diferentes conforme o objeto em que foi herdado.  

Para que possamos entender esse conceito, vamos imaginar a seguinte situação: o método consultarSaldo da classe ContaBancaria é herdado pelos objetos de conta corrente, conta digital e conta salário. A princípio, o método consultarSaldo deveria ter o mesmo comportamento em todos os tipos de contas, porém, nas contas correntes ele deve apresentar além do saldo disponível, o saldo de cheque especial daquela conta. Para contas poupança e salário deve ser apresentado somente o saldo da conta, pois, não há oferta de produtos de crédito nessas contas. Veja que se trata do mesmo método apresentando comportamentos diferentes conforme o objeto em que ele é usado.

2 – Entendendo os pilares da programação orientadas a objetos 

Após conhecermos a definição dos 4 pilares da programação orientada a objetos, vamos ver abaixo uma sequência de códigos escritos em Java, que simulam algumas transações bancárias. Esses códigos nos ajudarão a visualizar os pilares de programação orientada a objetos de forma prática, melhorando nossa compreensão a respeito do assunto.

2.1 – A estrutura do projeto 

Para executar os códigos em sua máquina você vai precisar instalar: a JDK 17 ou superior e uma IDE compatível com Java. Eu recomendo utilizar o IntelliJ ou o Visual Studio Code (se optar por esta opção não esqueca de instalar a extensão da linguagem Java). 

Depois de instaladas as ferramentas necessárias, você pode criar um projeto com a seguinte estrutura ou fazer o download do projeto disponível aqui:

Estrutura do projeto do sistema do banco.

Como podemos ver na imagem acima, a estrutura é bem simples e fácil de entender:

– Contas: é a pasta onde estão os arquivos que representam os tipos de contas que o banco fornece; 

– Enums: como o próprio nome sugere, é a pasta onde fica o arquivo de Enums da aplicação; 

– Models: pasta onde está a classe principal da aplicação; 

– Service: pasta onde fica a função que executa as ações da aplicação; 

– BancoApplicaton: arquivo onde está a função main() responsável por executar a aplicação. 

2.2- Entendendo os pilares da programação orientada a objetos no código

Abaixo, vou compartilhar alguns trechos dos códigos do projeto onde poderemos visualizar a aplicação de cada um dos pilares da programação orientada a objetos. Vamos lá!

public class ContaBancaria { 

    // Atributos da classe 
    private int numeroConta; 
    private String titularConta; 
    private double saldo; 


    // Construtor da classe 
    public ContaBancaria(int numeroConta, String titularConta,
                        double saldoInicial, TipoConta tipoConta) { 
        this.numeroConta = numeroConta; 
        this.titularConta = titularConta; 
        this.saldo = saldoInicial; 
    } 
  

    // Métodos da classe 
    public void depositar(double valor) { 
        saldo += valor; 
        System.out.println("Conta "+numeroConta+" - Depósito de R$" + valor + " realizado com sucesso!"); 
    } 

  
    public void sacar(double valor) { 
        if (valor <= saldo) { 
            saldo -= valor; 
            System.out.println("Conta "+numeroConta+" - Saque de R$" + valor + " realizado com sucesso!"); 
        } else { 
            System.out.println("Saldo insuficiente para saque de R$" + valor); 
        } 
    } 


    public void consultarSaldo() { 
        System.out.println("Conta: "+numeroConta+" / "+"Titular: "+titularConta+" / "+"Saldo atual: R$" + saldo); 
    } 

  
    public void transferir(ContaBancaria destino, double valor) { 
        if (valor <= saldo) { 
            saldo -= valor; 
            destino.saldo += valor; 
            System.out.println("Conta "+numeroConta+" - Transferência de R$" + valor + " realizada para a conta " + destino.numeroConta); 
        } else { 
            System.out.println("Saldo insuficiente para transferência de R$" + valor); 
        } 
    } 

  
    public double getSaldo() { 
        return saldo; 
    } 

    public int getNumeroConta() { 
        return numeroConta; 
    } 

    public String getTitularConta() { 
        return titularConta; 
    } 
} 

A abstração pode ser vista no código da classe ContaBancaria que replica algo que existe no mundo real (contas bancárias) através de um código de programação que será usado em um sistema computacional.  

Observe que a classe ContaBancaria foi construída com três atributos (número da conta, titular da conta e saldo) e quatro métodos (depositar, sacar, consulta saldo e transferir) que compõem a estrutura de uma conta bancária. A conta bancária é algo que existe no mundo real e utilizamos em nosso dia a dia e está sendo abstraída em um código computacional. 

Nesta mesma classe, também conseguimos ver o encapsulamento. Observe que os atributos numeroConta, titularConta e saldo foram definidos como private e, portanto, não podem ser acessados fora da classe ContaBancaria. A única forma de serem manipulados por códigos externos a essa classe é através dos getters definidos no código: getNumeroConta(), getTitularConta() e getSaldo(). 

public class ContaCorrente extends ContaBancaria { 
    
    private double chequeEspecial; 

    public ContaCorrente(int numeroConta, String titularConta, double saldoInicial, double chequeEspecial) { 
        super(numeroConta, titularConta, saldoInicial, TipoConta.CORRENTE); 
        this.chequeEspecial = chequeEspecial; 
    } 

    public double getChequeEspecial() { 
        return chequeEspecial; 
    } 

  
    @Override 
    public void consultarSaldo() { 
        double saldoTotal = getSaldo() + chequeEspecial; 
        System.out.println("Conta: " + getNumeroConta() + " / " + "Titular: " + getTitularConta() + " / " +  "Saldo atual: R$" + getSaldo() + " / Cheque Especial: R$" + chequeEspecial + " / Saldo Total: R$" + saldoTotal); 
    } 
}
public class ContaDigital extends ContaBancaria { 
    public ContaDigital(int numeroConta, String titularConta, double saldoInicial) { 
        super(numeroConta, titularConta, saldoInicial, TipoConta.DIGITAL); 
    } 
} 
public class ContaSalario extends ContaBancaria { 
    public ContaSalario(int numeroConta, String titularConta, double saldoInicial) { 
        super(numeroConta, titularConta, saldoInicial, TipoConta.SALARIO); 
    } 
} 

A herança pode ser vista nas classes ContaCorrente, ContaDigital e ContaSalario. Observe que, em todas elas, possuímos o comando extends ContaBancaria. Quando usamos a palavra reservada extends, indicamos ao Java que aquela classe irá herdar os recursos de uma outra classe, que, em nosso exemplo, é a classe ContaBancaria.  

Já o polimorfismo pode ser visto na classe ContaCorrente. Nesta classe é usada a anotação @Override que indica o polimorfismo na linguagem Java. Note que abaixo desta anotação, o comportamento do método consultarSaldo da classe ContaBancária está sendo alterado para apresentar uma informação exclusiva das contas correntes, que é o saldo de cheque especial do cliente.  

Conclusão 

De forma simples e resumida, neste artigo conhecemos os quatro pilares da programação orientada a objetos, os quais representam as características básicas das linguagens de programação orientadas a objetos.   

Recomendo que você analise, estude e edite os códigos para conseguir uma melhor compreensão dos pilares da POO. Procure entender estes conceitos e aprofundar seus conhecimentos neste paradigma de programação que é um dos mais utilizados no desenvolvimento de softwares.

Espero que o conteúdo aqui apresentado seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações fique à vontade para entrar em contato. 

O que é HTTP? 

A internet revolucionou a forma como nos comunicamos e compartilhamos informações. Por trás dessa revolução, existem diversas tecnologias que garantem o funcionamento eficiente e seguro da web. Entre eles, destaca-se o HTTP (Hypertext Transfer Protocol) e sua versão segura, o HTTPS, os quais são pilares fundamentais para a comunicação entre dispositivos na internet. Neste texto, vamos entender o que são esses protocolos, como eles funcionam e qual sua importância para a segurança e eficiência da comunicação na internet. 

1 – O que é HTTP? 

O HTTP é um protocolo de comunicação entre dispositivos conectados em rede. HTTP é a sigla para Hypertext Transfer Protocol, que traduzido para o português significa, Protocolo de Transferência de Hipertexto. Conforme o próprio nome indica, este protocolo permite a transferência de documentos do tipo hipertexto entre dispositivos. Documentos hipertexto são documentos que possuem links clicáveis nas suas informações e podem direcionar o usuário para outros textos ou conteúdos, de maneira não linear. 

O HTTP é o protocolo de comunicação mais utilizado na World Wide Web (WWW). Quando você acessa um site, observe que a URL dele terá uma estrutura semelhante a essa: http://www.nomedosite.com.br.  

Veja que o endereço do site inicia com  http:// ou https://  indicando que estamos utilizando o protocolo HTTP para acessar aquele site.  

1.1 – HTTP e arquitetura cliente-servidor  

Representação gráfica  da arquitetura cliente servidor
Fonte: o autor

A internet funciona baseada na arquitetura cliente-servidor. Nesta arquitetura, um dispositivo chamado cliente, que pode ser um computador, notebook, tablet, televisor ou qualquer dispositivo com conexão à internet, realiza uma requisição (request) para um servidor que irá devolver uma resposta (response) para ele. Esta troca de informações entre cliente e servidor é feita por meio do protocolo HTTP, que define uma série de regras e padrões para comunicação online.  

2 – E o que é HTTPS? 

O HTTPS (Hypertext Transfer Protocol Secure – Protocolo de Transferência de Hipertexto Seguro) é uma evolução do protocolo HTTP.  

A transmissão de dados pelo protocolo HTTP não possui criptografia, assim se eles forem interceptados por terceiros podem ser facilmente lidos e entendidos. Esta era uma grave vulnerabilidade que comprometia a comunicação na internet. Foi para corrigir esta vulnerabilidade que surgiu o HTTPS. 

O HTTPS estabelece uma conexão segura e criptografada entre cliente e servidor, antes de transferir dados. Este protocolo utiliza as tecnologias de criptografia SSL e TLS em cada requisição e solicitação HTTP, tornando segura a transferência de dados na internet. 

3 – Como funcionam as requisições e respostas HTTPS? 

Como podemos perceber acima, o HTTPS é um protocolo fundamental para garantir uma navegação segura na internet. Mas você já se perguntou como acontece esse processo de comunicação segura entre cliente e servidor web?  

Quando acessamos um site ou enviamos dados através de um formulário online, uma série de processos ocorre nos bastidores para garantir que as informações sejam transmitidas de forma segura e eficiente. Vamos entender passo a passo como funcionam essas requisições e respostas HTTPS: 

–  Requisição realizada pelo cliente: quando o usuário acessa uma URL em seu navegador, por exemplo, uma requisição HTTPS é iniciada.  

Encontrar o IP do site: a primeira ação realizada é uma consulta ao servidor DNS para resolver o nome do domínio e encontrar o endereço IP do servidor onde o site está hospedado. 

Criação de conexão segura: após encontrar o IP, o navegador inicia um processo para estabelecer uma conexão segura com o servidor. Isto envolve a validação de certificados digitais e criar um canal seguro, criptografado, entre as partes. 

– Envio da Requisição HTTPS: com a conexão segura estabelecida, o navegador envia a requisição HTTPS ao servidor. As informações geralmente incluem o método HTTP (como GET, POST, PUT, PATCH ou DELETE), o cabeçalho da requisição e, às vezes, dados no corpo (como em formulários). Todos os dados são criptografados no navegador antes do envio ser realizado.  

Processamento da Requisição no Servidor: o servidor recebe a requisição, descriptografa-a e realiza seu processamento. Isso inclui realizar uma série de validações nos dados recebidos e consultar dados em bancos de dados para compor a resposta. 

– Resposta HTTPS do Servidor: após processar a requisição, o servidor prepara uma resposta, realiza sua criptografia e envia para o solicitante. Essa resposta contém o código de status HTTP (como 200 para sucesso ou 404 para não encontrado), cabeçalhos de resposta e, frequentemente, um corpo de resposta (em formatos como HTML, JSON ou XML). 

– Descriptografia da Resposta pelo Navegador: o navegador recebe a resposta criptografada e a primeira etapa para trabalhar com ela é fazer sua descriptografia.  Em seguida, os dados são processados pelo navegador e o resultado será renderizado na tela do dispositivo do usuário. 

– Fechamento da Conexão Segura: finalizada a comunicação entre as partes, a conexão SSL/TLS é encerrada. Em geral, cada requisição HTTPS estabelece uma nova conexão, embora métodos como Keep-Alive possam prolongar a conexão segura para várias requisições. 

Este processo de comunicação com o protocolo HTTPS, embora complexo em sua arquitetura, é otimizado para ocorrer em questão de milissegundos, proporcionando uma experiência fluida ao usuário. 

A velocidade da comunicação depende de diversos fatores, como a qualidade da conexão com a internet, o poder de processamento dos dispositivos envolvidos e a distância física entre cliente e servidor. Em condições ideais, com um hardware de boa qualidade e uma conexão de internet estável, todo esse ciclo de requisição e resposta acontece de forma praticamente instantânea, permitindo a navegação segura e ágil que conhecemos hoje.  

Esta alta eficiência é um dos pilares que possibilita a existência e expansão das aplicações web modernas e interativas, garantindo simultaneamente a segurança e a performance que os usuários buscam. 

Conclusão 

Como vimos, os protocolos HTTP e HTTPS são pilares fundamentais da internet. Enquanto o HTTP estabeleceu as bases para a comunicação na web, o HTTPS trouxe a camada de segurança necessária para proteger as informações transacionadas em ambientes online.  

A evolução desses protocolos reflete o desenvolvimento constante da internet, onde a busca por eficiência e segurança caminham lado a lado. Em um mundo cada vez mais conectado, compreender como essas tecnologias funcionam nos ajuda a entender melhor a infraestrutura que sustenta nossa vida digital e a importância da segurança na comunicação online. 

Gostou deste assunto e quer aprender mais sobre o protocolo HTTP? Clicando aqui, você tem acesso ao artigo que escrevi sobre Status Code. 

Espero que este artigo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações, fique à vontade para entrar em contato. 

O que é programação orientada a objetos? 

A programação orientada a objetos (POO) é um dos paradigmas mais conhecidos e utilizados na construção de sistemas computacionais. Baseada na ideia de aproximar o mundo real com o mundo da computação, a orientação a objetos nos permite estruturar o código de forma organizada e reutilizável, algo essencial para a construção de softwares robustos e escaláveis.

Neste texto, vamos explorar os fundamentos da orientação a objetos, seus conceitos-chave, e como aplicá-los na prática por meio de exemplos em Java, uma das linguagens mais populares nesse contexto. 

1 – Entendendo o conceito de programação orientada a objetos 

A programação orientada a objetos (OOP – Object-oriented programming) é um paradigma baseado no conceito de representar aquilo que existe no mundo real em sistemas computacionais através de classes e objetos.  

Esse paradigma serve como um modelo de análise, projeto e desenvolvimento de sistemas que procura aproximar o mundo real ao mundo da programação de computadores, tornando mais fácil o entendimento e solução de problemas complexos. 

Para entender esse paradigma pense, por exemplo, em um sistema bancário: nesse sistema temos uma classe principal chamada Conta Bancária. A partir desta classe, serão criados todos os tipos de contas bancárias disponibilizadas pelo banco. Note no exemplo abaixo que temos três tipos de contas: corrente, digital e salário. Estas contas e todas as demais que o banco vier a oferecer serão objetos da classe principal Conta Bancária. 

Representação gráfica da relação entre classes e objetos.
Fonte: o autor

Essa relação entre classe e objeto é a base do paradigma da programação orientada a objetos. Uma classe pode ser entendida como um modelo, enquanto os objetos, são tudo aquilo que construímos com base nesse modelo (classe). Quando um objeto é construído ocorre o que chamamos de instância de classe.  

Dessa forma, quando usamos os princípios da orientação a objetos para desenvolver um sistema, transformamos cada um dos requisitos em classes e objetos. E para cada uma dessas classes e objetos definimos atributos e métodos próprios que serão utilizados para processar os dados recebidos e retornar as saídas do sistema. 

1.1 – O que são atributos e métodos? 

Atributo e métodos são dois conceitos fundamentais na programação orientada a objetos e podemos entendê-los da seguinte forma: os atributos são as características de cada classe e objeto, enquanto os métodos são as ações e comportamentos dessas classes e objetos. Atributos e métodos são definidos nas classes e compartilhados pelos objetos instanciados através delas.  

Pensando na classe conta bancária, alguns exemplos de atributos podem ser: número da conta, titular da conta, saldo. Enquanto, exemplos de métodos podem ser: depositar, sacar, consultar saldo, transferir.

Representação gráfica detalhada da relação entre classes e objetos
Fonte: o autor

Analisando a imagem acima, percebemos que os atributos e métodos são inseridos na classe Conta Bancária. Dessa forma, cada conta bancária criada, independe do seu tipo, será um objeto instanciado da classe principal Conta Bancária e herdará todos os atributos e métodos disponíveis nela. E isto gera uma das principais vantagens da orientação a objetos: a reutilização de códigos. 

Observe em nosso exemplo que, todas as contas criadas, independente do seu tipo, herdam da classe principal todas as características e comportamentos comuns. Assim, não é necessário, por exemplo, reescrever o código responsável por consultar saldo para cada tipo de conta existente, pois, todas as contas herdam esse método da classe principal. 

2 – Exemplo prático de programação orientada a objetos 

Para fins didáticos e um melhor entendimento desses conceitos, vamos ver um exemplo simples de Java para representar a classe conta bancária.  

Se você quiser executar esse projeto na sua máquina, precisará ter o Java 17 instalado e uma IDE compatível com a linguagem como o IntelliJ ou Visual Studio Code, por exemplo.  

O primeiro arquivo de todo projeto Java é o Main.java, responsável por executar a aplicação, vamos criá-lo:

@SpringBootApplication 
public class BancoApplication { 
public static void main(String[] args) { 
ApplicationContext context = SpringApplication.run(BancoApplication.class, args); 
        BancoService bancoService = context.getBean(BancoService.class); 
        bancoService.ExecutaContas(); 

}
 

No arquivo Main.java nós estamos chamando a função ExecutaContas() da classe BancoService. Vamos criar um arquivo chamado BancoService.java: 

@Service 
public class BancoService { 
        public void ExecutaContas () { 
               ContaCorrente conta1 = new ContaCorrente(1, "João", 700.0, 200.00 ); 
               ContaDigital conta2 = new ContaDigital(2, "Maria", 500.0); 
               ContaSalario conta3 = new ContaSalario(3, "José", 1000.0); 

                conta1.consultarSaldo(); 
                conta2.consultarSaldo(); 
                conta3.consultarSaldo(); 
                conta1.depositar(200.0); 
                conta1.transferir(conta2,700.00); 
                conta2.sacar(500.00); 
                conta3.transferir(conta1,200.00); 
                conta1.consultarSaldo(); 
                conta2.consultarSaldo(); 
                conta3.consultarSaldo(); 
        }       

Note que o arquivo BancoService.java instância três objetos e executa uma série de ações que simulam as transações realizadas em um sistema bancário. 
 
Agora vamos criar as classes que representam os tipos de contas que instanciamos em BancoService: 

ContaCorrente.java

 public class ContaCorrente extends ContaBancaria { 
    private double chequeEspecial; 


    public ContaCorrente(int numeroConta, String titularConta, double saldoInicial, double chequeEspecial) { 
        super(numeroConta, titularConta, saldoInicial, TipoConta.CORRENTE); 
this.chequeEspecial = chequeEspecial; 
    } 


    public double getChequeEspecial() { 
        return chequeEspecial; 
    } 


    @Override 
    public void consultarSaldo() { 
        double saldoTotal = getSaldo() + chequeEspecial; 
        System.out.println( "Conta: " + getNumeroConta() + " / " + "Titular: " + getTitularConta() + " / " + "Saldo atual: R$" + getSaldo() + " / Cheque Especial: R$" + chequeEspecial +  " / Saldo Total: R$" + saldoTotal); 
    } 

ContaDigital.java 

public class ContaDigital extends ContaBancaria { 
    public ContaDigital(int numeroConta, String titularConta, double saldoInicial) { 
        super(numeroConta, titularConta, saldoInicial, TipoConta.DIGITAL); 
    } 

ContaSalario.java 

public class ContaSalario extends ContaBancaria { 
    public ContaSalario(int numeroConta, String titularConta, double saldoInicial) { 
        super(numeroConta, titularConta, saldoInicial, TipoConta.SALARIO); 
    } 

Veja que as classes Conta Corrente, Conta Digital e Conta Salário possuem a palavra-chave extends, indicando que elas herdam atributos e métodos da classe Conta Bancária. 

Vamos agora criar o arquivo ContaBancaria.java  que possui a classe principal Conta Bancária: 

public class ContaBancaria { 
    // Atributos da classe 
    private int numeroConta; 
    private String titularConta; 
    private double saldo; 

    // Construtor da classe 
    public ContaBancaria(int numeroConta, String titularConta, 
                         double saldoInicial, TipoConta tipoConta) { 
        this.numeroConta = numeroConta; 
        this.titularConta = titularConta; 
        this.saldo = saldoInicial; 
    } 

    // Métodos da classe 
    public void depositar(double valor) { 
        saldo += valor; 
        System.out.println("Conta "+numeroConta+" - Depósito de R$" + valor + " realizado com sucesso!"); 
    } 

    public void sacar(double valor) { 
        if (valor <= saldo) { 
            saldo -= valor; 
            System.out.println("Conta "+numeroConta+" - Saque de R$" + valor + " realizado com sucesso!"); 
        } else { 
            System.out.println("Saldo insuficiente para saque de R$" + valor); 
        } 
    } 

    public void consultarSaldo() { 
        System.out.println( 
                "Conta: "+numeroConta+" / "+"Titular: "+titularConta+" / "+"Saldo atual: R$" + saldo);  } 
    public void transferir(ContaBancaria destino, double valor) { 
        if (valor <= saldo) { 
            saldo -= valor; 
            destino.saldo += valor; 
            System.out.println("Conta "+numeroConta+" - Transferência de R$" + valor + " realizada para a conta " + destino.numeroConta); 
} else { 
            System.out.println("Saldo insuficiente para transferência de R$" + valor); 
        } 
    }

    public double getSaldo() { 
        return saldo; 
    } 

    public int getNumeroConta() { 
        return numeroConta; 
    } 

    public String getTitularConta() { 
        return titularConta; 
    } 

Observe que a classe ContaBancaria possui três atributos (numeroConta, titularConta e saldo) e quatro métodos (depositar, sacar, consultarSaldo e transferir). Essa é a classe modelo de onde conta corrente, conta digital e conta salário irão herdar atributos e métodos.  

Para finalizar, vamos criar um arquivo chamado TipoConta.java que será um Enum de tipos de contas: 

public enum TipoConta { 
    CORRENTE, 
    SALARIO, 
    DIGITAL 

Após finalizar a criação dos arquivos e códigos do projeto vamos executá-lo. Teremos esse resultado no console da IDE: 

 
Conta: 1 / Titular: João / Saldo atual: R$700.0 / Cheque Especial: R$200.0 / Saldo Total: R$900.0 
Conta: 2 / Titular: Maria / Saldo atual: R$500.0 
Conta: 3 / Titular: José / Saldo atual: R$1000.0 
Conta 1 - Depósito de R$200.0 realizado com sucesso! 
Conta 1 - Transferência de R$700.0 realizada para a conta 2 
Conta 2 - Saque de R$500.0 realizado com sucesso! 
Conta 3 - Transferência de R$200.0 realizada para a conta 1 
Conta: 1 / Titular: João / Saldo atual: R$400.0 / Cheque Especial: R$200.0 / Saldo Total: R$600.0 
Conta: 2 / Titular: Maria / Saldo atual: R$700.0 
Conta: 3 / Titular: José / Saldo atual: R$800.0 

Esses prints mostram os resultados das ações executadas na função ExecutaContas() da classe BancoService. Essas ações são realizadas pelos objetos de ContaCorrente, ContaDigital e ContaSalario, instanciados de ContaBancaria. Apesar de ser um simples exemplo, observe que através dele conseguimos visualizar claramente os conceitos fundamentais da programação orientada a objetos e entender melhor esse paradigma amplamente usado no desenvolvimento de software.

3 – Usando programação orientada no dia a dia 

A programação orientada a objetos está presente em praticamente todos os sistemas e aplicativos que utilizamos diariamente. Amplamente usada em serviços back-end, mas não restrita somente a isso, a orientação a objetos está presente em redes sociais, streaming de vídeos, jogos, ERPs e muitas outras aplicações que fazem parte de nosso cotidiano. 

Aprender e entender os conceitos de orientação a objetos é fundamental para desenvolver sistemas funcionais e eficientes, que atendam aos objetivos e requisitos definidos nos projetos que trabalhamos.  

A orientação a objetos também é suportada por muitas linguagens e tecnologias. No exemplo acima, usamos Java que, certamente, é a linguagem orientada a objetos mais conhecida no mercado. Entretanto, outras linguagens como C++, C#, Python, PHP e Kotlin e vários frameworks de desenvolvimento como Laravel, Djano, .NET e Flutter, aceitam os conceitos de POO. A escolha de qual linguagem e tecnologia usar dependerá, diretamente, das preferências do desenvolvedor e dos requisitos do projeto, dispondo de um amplo leque de opções para atender a todos os públicos. 

Mas, é válido lembra que, a programação orientada a objetos vai além dos conceitos de classes, objetos, atributos e métodos, apresentados acima. Outros quatro conceitos se destacam na programação orientada a objetos, são eles: abstração, encapsulamento, herança e polimorfismo. Esses conceitos são conhecidos como pilares da programação orientada a objetos e se você quiser saber mais sobre esse assunto, clique aqui, para ler um artigo que escrevi sobre este assunto.   

Conclusão 

A programação orientada a objetos é uma poderosa ferramenta para desenvolver sistemas funcionais, robustos e escaláveis. Sua estrutura baseada em classes, objetos, atributos e métodos permite organizar o código de forma clara, coesa e reutilizável, agilizando o desenvolvimento de sistemas.  

Ao compreendermos e aplicarmos esses conceitos, estamos melhor preparados para criar soluções tecnológicas que as expectativas de nossos clientes e usuários. 

Espero que este artigo seja útil de alguma forma para você. Em caso de dúvidas, sugestões ou reclamações, fique à vontade para entrar em contato. 

E se você quiser aprender mais sobre programação, acesse aqui a seção que tenho dedicada ao assunto.