Ajude nosso projeto a se manter online.

Funções Get e Set, Const e Segurança da Informação com Orientação a Objetos

 Neste tutorial de nosso curso de C++, vamos usar mais um exemplo de Classe e Objeto, dessa vez pare entender melhor o uso de funções setters e getters, bem como deixar nosso código mais seguro, através da keyword const.

Funções Get e Set em Orientação a Objetos

Vamos fazer outro exemplo de classe! Agora vamos trabalhar com um retângulo, que diferente do quadrado que só tem um lado de valor igual, o retângulo preciso do valor de dois lados. Vamos chamar de length (comprimento) e width (largura).

A função que pega o valor da área, vamos chamar de getArea() e a que retorna o valor do perímetro de getPerimeter...de get, que aqui significa pegar, obter, acessar...

Como nossas variáveis são privadas, afinal é uma questão de segurança que ninguém de fora mexa nem veja elas, vamos precisar de funções para definir o valor dessas variáveis, serão as setLength() e a setWidth()...de set...falamos 'setar', que significa definir, mudar.

Veja como fica nosso código:

#include <iostream>
using namespace std;

class Rect
{
    private:
        double length, width;

    public:
        double getArea();
        double getPerimeter();
        void setLength(double);
        void setWidth(double);
};

double Rect::getArea()
{
    return length * width;
}
double Rect::getPerimeter()
{
    return 2*(length+width);
}
void Rect::setLength(double l)
{
    length = l;
}
void Rect::setWidth(double w)
{
    width = w;
}

int main()
{
    Rect r;
    double var;

    cout<<"Comprimento: ";
    cin >> var;
    r.setLength(var);

    cout<<"Largura: ";
    cin >> var;
    r.setWidth(var);

    cout<<"Area: " << r.getArea() << endl;
    cout<<"Perimetro: " << r.getPerimeter() << endl;

    return 0;
}

 Na main(), instanciamos um objeto 'r' do tipo Rect, e declaramos uma variável 'var' que vai receber os valores que o usuário vai digitar, pra os valores do comprimento e largura.

Primeiro ele digita o valor para o comprimento, e setamos esse valor através da setLength().
Depois ele digita o valor para a largura, e setamos esse valor através da setWidth().

Depois é só exibir o valor da área e do perímetro, através das getArea() e getPerimeter().

Ou seja, usamos getters e setters para acessar e mudar as variáveis. Veja novamente: ninguém no mundo externo, nem o melhor hacker do planeta, vai ter acesso direto a essa variáveis, somente através das funções de set e get.

Segurança da Informação com Orientação a Objetos

"Ué, a gente não tem acesso as variáveis diretamente, mas temos através das funções de Set e Get, que é a mesma coisa".

Bom, quase, mas tem um fundo de razão. Você ainda precisaria adivinhar o nome dessas funções, pra ter acesso a elas, mas não discordo de você, essa segurança toda ainda não ficou à prova.

Um exemplo: um hacker danadinho poderia muito bem definir valores negativos para os lados do retângulo, o que é um absurdo! Os lados de um retângulo devem ser positivos!

É aí que entra a mágica da orientação a objetos! Vamos alterar nossas funções de setLength() e setWidth(), vão ficar assim:

void Rect::setLength(double l)
{
    while(l<=0){
        cout << "Comprimento negativo! Digite um valor válido: ";
        cin >> l;
    }
    length = l;
}
void Rect::setWidth(double w)
{
    while(w<=0){
        cout << "Largura negativa! Digite um valor válido: ";
        cin >> w;
    }
    width = w;
}

Amigos, enquanto valor de l ou w for negativo, vai cair dentro do while e só sai desse while quando o valor digitado for maior que 0, e não tem papo, pode ser o melhor hacker do mundo, ele não vai driblar isso.

A palavra-chave const em Orientação a Objetos

Como dissemos, o objetivo das funções getters é simplesmente pegar valores, acessar essas informações, jamais, nunca, alterá-la.

Você pode trabalhar na tesouraria de uma empresa e disponibilizar a função getSalario() pro restante da empresa, para cada um visualizar o valor do salário...mas em hipótese alguma essas pessoas devem poder alterar o valor apresentado (no caso, o salário...imagina que maravilha seria poder alterar seu salário?)

Uma maneira de garantir que essas funções são apenas de acesso, é usar a keyword const, tanto no cabeçalho dentro da definição de classe como na declaração da função.

Veja agora como fica nosso código todo completo, seguro, lindo e maravilhoso:

#include <iostream>
using namespace std;

class Rect
{
    private:
        double length, width;

    public:
        double getArea() const;
        double getPerimeter() const;
        void setLength(double);
        void setWidth(double);
};

double Rect::getArea() const
{
    return length * width;
}
double Rect::getPerimeter() const
{
    return 2*(length+width);
}
void Rect::setLength(double l)
{
    while(l<=0){
        cout << "Comprimento negativo! Digite um valor válido: ";
        cin >> l;
    }
    length = l;
}
void Rect::setWidth(double w)
{
    while(w<=0){
        cout << "Largura negativa! Digite um valor válido: ";
        cin >> w;
    }
    width = w;
}

int main()
{
    Rect r;
    double var;

    cout<<"Comprimento: ";
    cin >> var;
    r.setLength(var);

    cout<<"Largura: ";
    cin >> var;
    r.setWidth(var);

    cout<<"Area: " << r.getArea() << endl;
    cout<<"Perimetro: " << r.getPerimeter() << endl;

    return 0;
}

Exercício de Orientação a Objetos

Dê uma incrementada no exemplo anterior. Faça que ele exiba também os lados do retângulo, para isso defina e use as funções getLength() e getWidth(), use a palavra-chave const para deixar essas funções mais seguras e à prova de hackers.

Nenhum comentário:

Postar um comentário