Encapsulamento de Dados

Padrão

Olá! Continuando a nossa série sobre orientação a objetos, vamos falar hoje sobre Encapsulamento de Dados. Na Orientação a objetos, o encapsulamento significa separar o programa em partes, o mais isoladas possível. Dessa forma, tem-se por objetivo tornar o software mais flexível, fácil de modificar e de criar novas implementações.

No encapsulamento de dados, o que fazemos é impedir o acesso direto aos atributos da classe, criando métodos tanto para obter os valores dos atributos, quanto para atribuir valores a eles. Os métodos que realizam tais tarefas são comumente chamaos de setters e getters (dos verbos set e get, em inglês).

Dessa forma, a classe Cachorro que tínhamos em nosso primeiro post sobre OO, utilizando o encapsulamento de dados, ficaria assim:

Primeiro em C++…

// Arquivo cachorro.h
#include <iostream>
#include <string>
using namespace std;

class Cachorro {
private:
    int tamanho;
    string raca;
    string nome;
public:
    Cachorro();
    ~Cachorro();
    void setTamanho(int tamanho);
    int getTamanho();
    void setRaca(string raca);
    string getRaca();
    void setNome(string nome);
    string getNome();
    void latir();
};
// Arquivo cachorro.cpp
#include "cachorro.h"

Cachorro::Cachorro() {
}

Cachorro::~Cachorro() {
}

void Cachorro::setTamanho(int tamanho) {
    this->tamanho = tamanho;
}

int Cachorro::getTamanho() {
    return tamanho;
}

void Cachorro::setRaca(string raca) {
    this->raca = raca;
}

string Cachorro::getRaca() {
    return raca;
}

void Cachorro::setNome(string nome) {
    this->nome = nome;
}

string Cachorro::getNome() {
    return nome;
}

void Cachorro::latir() {
    cout << "Ruff! Ruff!" << endl;
}

… e depois em Java…

// Arquivo Cachorro.java
package canil.exemplo;

public class Cachorro {
    private int tamanho;
    private String raca;
    private String nome;

    public void setTamanho(int tamanho) {
        this.tamanho = tamanho;
    }

    public int getTamanho() {
        return tamanho;
    }

    public void setRaca(String raca) {
        this.raca = raca;
    }

    public String getRaca() {
        return raca;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return nome;
    }

    public void latir() {
        System.out.println("Ruff! Ruff!");
    }
}

Uma das grandes vantagens do uso do encapsulamento de dados é controlar o acesso aos atributos da classe, evitando comportamentos inesperados. Por exemplo, se determinado atributo não pode ser negativo, você pode condicionar o seu método de atribuição (set) a não deixar valores negativos (não atribuindo nada ou atribuindo alguma valor válido padrão). Além disso, caso determinado valor deva ser privado e não deve possuir acesso externo à classe, basta não definir seus métodos de acesso.

Bom pessoal, é isso. Aparentemente um assunto simples, mas onipresente no projeto de sistemas utilizando a orientação a objetos. No próximo post da série, falaremos sobre outro conceito muito importante na OO: a Herança!

Até lá!

Deixe uma resposta