Mandar um cafézinho para o programador:


Me ajude a transformar café em código!

Orientação a Objetos em C++: Introdução

 Antes de entrarmos em detalhes sobre um novo paradigma de programação (a orientação a objetos), vamos entender um pouco o que vínhamos fazer e o que vamos fazer de diferente.


Programação Funcional

Até o momento, usamos apenas um estilo de programação: a funcional, também chamada de procedimental. Como o nome diz, é um método que usa procedimentos, ou como chamamos: funções.

Basicamente, ele é um roteiro, um script de procedimentos e comandos. Ou seja, a gente só usa variáveis e funções. Vamos pegar um exemplo.

Vamos supor que você queira calcular a média aritmética de dois números, em C++. Necessariamente, você vai ter que ter duas variáveis pra armazenar os valores e um cálculo da média. Pronto, tem aí um 'roteiro' do que deve ser feito.

O que você pode fazer de diferente, é colocar o cálculo da média em uma função, para que ela possa ser invocada indefinidamente:

#include <iostream>
using namespace std;

float average(float num1, float num2)
{
    return (num1+num2)/2;
}

int main()
{
    float num1, num2;

    cout<<"Numero 1: ";
    cin >> num1;

    cout<<"Numero 2: ";
    cin >> num2;

    cout<<"Media: "<< average(num1,num2) << endl;

    return 0;
}

Veja como este programa é apenas um procedimento, começa rodando do começo da main() e vai até o final dele. Sempre. Tudo que fizemos foi sempre assim. Tem começo (geralmente declaração de variáveis), meio (chamando funções para fazer diversas coisas) e um fim (exibindo resultados).

O objetivo da programação funcional é criar funções que façam coisas. Pode parecer simples e bobo né? Mas coisas incríveis foram feitas usando isso. O Kernel do Linux, por exemplo, não usa C++, apenas C, ou seja, não tem orientação a objetos, apenas programação procedural.

Com o passar dos anos e décadas, os softwares foram ficando cada vez mais e mais e mais, e mais um pouco, complexos. E alguns problemas foram surgindo.


Programação Orientada a Objetos

Até o momento, em nossos programas, qualquer função poderia trabalhar em cima de qualquer dado. Isso com o tempo virou um problema de segurança. Seria ideal se determinadas funções pudessem atuar somente em cima de alguns dados.

Por exemplo, em programação funcional, as funções que trabalham com os dados da tesouraria de uma empresa, poderiam trabalhar com quaisquer dados, como os dos funcionários. Mas seria mais bacana se a tesouraria tivesse suas próprias funções e para trabalhar com os dados dos funcionários, tivessem funções próprias também. E por questão de segurança, nenhum pudesse mexer nas coisas dos outros.

Outro problema: você designa uma função pra receber um inteiro. Sem querer, alguém usa essa função e manda um float. Se fizer esse teste, vai dar erro, vai sair resposta errada e pode até simplesmente fechar o programa rodando. Imagina 'fechar' o programa de um avião, em pleno voo? Não dá né.

Daí que veio a bendita e linda POO: Programação Orientada a Objetos. Ela resolve esse problemas, e de uma maneira incrivelmente simples e fácil. Seu segredo é: ela passa a trabalhar com um treco chamado objeto.

Cada objeto vai ter suas próprias variáveis e somente algumas funções podem ver atuar e ver ele.
Se tem um objeto do tipo Som no seu jogo, ele vai ter variáveis, características e funções específicas atuando nele. Os objetos do tipo Personagem, vão ter variáveis, características e funções específicas pra eles. Uma função que mexe com Som não pode atuar num objeto do tipo Personagem. E, nossa, isso evita muuuuuitos bugs e potenciais problemas.

Isso de cada objeto ter seus dados e procedimentos, é o chamado encapsulamento, base da lógica da POO. É como se existisse código específico para cada 'coisa'. Uma função só vê os dados daquela 'coisa' e só pode atuar naquela 'coisa'. Você pode, inclusive, esconder informações, dizer claramente: 'Ei, essa variável aqui, que armazena a senha, só pode ser vista aqui dentro do servidor, ela é inacessível para usuários de fora'. E isso traz uma segurança incrível.

Se você está desenvolvendo um game em C++ e usar orientação a objetos, você vai criar dados e procedimentos que só vão atuar e fazer sentido na parte da Lógica. Vai criar informações e funções que só vão ser visíveis e só vão atuar nos Graphics, vai criar coisas específicas para o Cenário (que nem são visíveis fora desse escopo). Você encapsula, você divide, você organiza as coisas...tá captando a ideia da POO ?

Não é mais aquele emaranhado de funções e variáveis que todo mundo pode ver e usar. Uma variável declarada, geralmente só deve ser usada pela função X(). Mas a função Y() pode sim ver e atuar nessa variável, isso é um erro, um problema, e seria interessante se isso fosse naturalmente impossível, se a própria linguagem fizesse essa separação. E é essa separação que a Orientação a Objetos faz.

Se você faz um sistema Web, você quer que apenas algumas funções sejam disponíveis pros usuários, como a função Exibe(), que vai mostrar as notas de um aluno de EAD. Mas se tiver usado programação funcional, o danado do aluno pode criar um código que chama a função Altera(), pra mudar suas notas, hackear o sistema. Ué, ele pode muito bem 'chutar' o nome das funções, e vai que acerta...

Com programação orientada a objetos, podemos deixar bem claro: "Ei sistema, somente essa função e essas variáveis podem ser acessadas pelos alunos". Quando ele tentar invadir o sistema, chamando outras funções que não fazem parte daquele 'objeto' (as notas dele, por exemplo), ele vai ser sumariamente bloqueado.

Bacana essa orientação a objetos, né? Mas vamos deixar de lero-lero, ir pro próximo tutorial e começar a aprender de vez como usar essa bruxaria.

Fontes de estudo

Paradigmas de Programação
Programação Procedural

Nenhum comentário:

Postar um comentário

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo