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<br />
#include &lt;iostream&gt;<br />
#include &lt;string&gt;<br />
using namespace std;</p>
<p>class Cachorro {<br />
private:<br />
    int tamanho;<br />
    string raca;<br />
    string nome;<br />
public:<br />
    Cachorro();<br />
    ~Cachorro();<br />
    void setTamanho(int tamanho);<br />
    int getTamanho();<br />
    void setRaca(string raca);<br />
    string getRaca();<br />
    void setNome(string nome);<br />
    string getNome();<br />
    void latir();<br />
};

// Arquivo cachorro.cpp<br />
#include &quot;cachorro.h&quot;</p>
<p>Cachorro::Cachorro() {<br />
}</p>
<p>Cachorro::~Cachorro() {<br />
}</p>
<p>void Cachorro::setTamanho(int tamanho) {<br />
    this-&gt;tamanho = tamanho;<br />
}</p>
<p>int Cachorro::getTamanho() {<br />
    return tamanho;<br />
}</p>
<p>void Cachorro::setRaca(string raca) {<br />
    this-&gt;raca = raca;<br />
}</p>
<p>string Cachorro::getRaca() {<br />
    return raca;<br />
}</p>
<p>void Cachorro::setNome(string nome) {<br />
    this-&gt;nome = nome;<br />
}</p>
<p>string Cachorro::getNome() {<br />
    return nome;<br />
}</p>
<p>void Cachorro::latir() {<br />
    cout &lt;&lt; &quot;Ruff! Ruff!&quot; &lt;&lt; endl;<br />
}<br />

… e depois em Java…

// Arquivo Cachorro.java<br />
package canil.exemplo;</p>
<p>public class Cachorro {<br />
    private int tamanho;<br />
    private String raca;<br />
    private String nome;</p>
<p>    public void setTamanho(int tamanho) {<br />
        this.tamanho = tamanho;<br />
    }</p>
<p>    public int getTamanho() {<br />
        return tamanho;<br />
    }</p>
<p>    public void setRaca(String raca) {<br />
        this.raca = raca;<br />
    }</p>
<p>    public String getRaca() {<br />
        return raca;<br />
    }</p>
<p>    public void setNome(String nome) {<br />
        this.nome = nome;<br />
    }</p>
<p>    public String getNome() {<br />
        return nome;<br />
    }</p>
<p>    public void latir() {<br />
        System.out.println(&quot;Ruff! Ruff!&quot;);<br />
    }<br />
}

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á!