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.