4.3 Encapsulamento
4.3.1 Encapsulamento
Encapsulamento permite que detalhes complicados da implementação da classe (regras de negócio, atributos para controle interno, métodos, etc.) sejam escondidos de quem os usa, sendo que estes apenas interagem com o que precisam através de interfaces, permitindo assim ocultar do usuário toda a parte que é irrelevante para este .
Dessa maneira, podemos pensar em uma classe como uma caixa preta, pois sabemos o que ela faz, conhecemos e interagimos com sua interface externa, mas não nos preocupamos como o processo é feito lá dentro.
A ideia do encapsulamento é tornar o software mais flexível, fácil de modificar e de criar novas implementações, umas vez que cada parte possui sua implementação e realiza seu trabalho independentemente das outras partes (i.e., pacotes, bibliotecas, componentes, classes, métodos, etc.).
4.3.2 Modificadores de Acesso
Nas linguagens de programação orientada a objetos (e.g., C++, Java, C#), em geral, os níveis de encapsulamento são indicados através das seguintes palavras-chaves:
- public: é o modificador menos restritivo; ele permite que o membro da classe pode ser acessado externamente a ela, assim como das classes derivadas desta;
- protected: esse modificador permite que o membro seja acessado apenas pela própria classe ou pelas classes que derivam desta;
- private: é o modificador mais restritivo; ele permite que o membro da classe seja acessado somente de dentro desta, não podendo ser acessado nem mesmo por classes derivadas.
Essas palavras chaves são chamadas de “modificadores de acesso” e são utilizadas para definir quem terá acesso à classe e a seus membros (atributos e métodos), sendo assim, essenciais para o encapsulamento.
Geralmente atributos encapsulados são atributos que não podem ser alterados livremente, por estarem intimamente relacionado a outros atributos e a integridade do objeto, de tal forma que se forem alterados de forma indevida, podem tornar o estado do objeto inconsistente.
Para lidar com atributos encapsulados com o uso dos modificadores protected ou private, é preciso implementar métodos públicos que acessam e alteram esses atributos, fazendo todo tratamento para que a integridade do objeto seja mantida.
No Exemplo 17 é possível alterar diretamente o atributo idade do objeto da classe Pessoa de fora da mesma, sem qualquer validação, o que pode quebrar a consistência do objeto, uma vez que nos é permitido atribuir o valor -1 ao atributo idade, o que não deve acontecer, uma vez que torna o objeto inconsistente.
Utilizando a técnica de encapsulamento podemos remover esse atributo da interface do objeto (e consequentemente impedir a atribuição direta de valores a ele) e implementar um método disponível na interface do objeto que faz a consistência do valor antes de atribuí-lo ao atributo idade do objeto.
Exemplo 18:
public class Pessoa
{
protect int idade;
...
public int setIdade(int Idade)
{
if (Idade > 0)
{
idade = Idade
}
}
...
}
Após isso, o atributo idade não é mais visível na interface do objeto, e a única forma de atribuir um valor a ele, é utilizando o método setIdade(), que faz a consistência do valor informado.
Como foi tirado o acesso direto ao atributo idade, também precisamos criar e disponibilizar na interface um método que apenas retorna o valor do atributo idade. Ficando o exemplo completo como o trecho abaixo:
Exemplo 19:
public class Pessoa
{
protect int idade;
...
public int setIdade(int Idade)
{
if (Idade > 0)
{
idade = Idade
}
}
public int getIdade()
{
return idade;
}
...
}