Ir para o conteúdo

Encapsulamento

Este é o nome que damos ao processo de limitar o acesso às variáveis e os métodos de uma classe, ou de controlar o acesso aos atributos e métodos de um objecto.

O processo de encapsulamento permite que tenhamos algum controlo sobre quem acede aos métodos e de que forma podem afectar o estado interno do nosso objectos, é conseguido através do uso de modificadores de acesso, e afecta a forma como a herança funciona.

Se pensarmos num exemplo real, não nos é dado acesso ao interior dos nossos discos rígidos, aliás, não nos interessa se é composto por cilindros magnéticos, circuitos integrados ou que mais, apenas nos interessa que podemos guardar lá dados ou, no caso de estarmos a trabalhar com hardware, que tipo de conector é necessário para que possamos ligar o disco ao computador. A forma como os dados está guardada não nos é revelada, se o fosse, facilmente conseguimos destruir disco atrás de disco, ou danificar a informação de forma irrecuperável.

Do mesmo modo, não é conveniente que outros objectos possam aceder livremente ao estado dos nosso objectos. Devem fazê-lo apenas através dos métodos que nós definimos (tal como nós acedemos ao disco através do cabo específico), e devem poder alterar o estado interno de formas que por nós foram criadas (tal como nós acedemos aos dados através de drivers do disco).

O encapsulamento tem também o efeito de impedir que um programador mais preguiçoso baseie a sua implementação no conhecimento que tem de outro objecto, isto porque é possível, com um bom esquema de encapsulamento, definir apenas o comportamento importante para o exterior como visível e esconder outros pormenores que não sejam tão importantes1.

Como níveis de acesso, temos à nossa disposição três níveis base2: público, privado, protegido.

Todos os níveis permitem que o próprio objecto aceda, sem restrições ao seu próprio estado e aos seus métodos, sendo que ao aplicarmos um nível de acesso estamos a afectar o que os outros objectos podem fazer e não o que o próprio. O nível público permite que todos os atributos ou métodos sejam acedidos e modificados livremente, por qualquer objecto, quer seja uma subclasse (criada por herança) ou não. O nível protegido permite que apenas tenham acesso aos dados as subclasses. O nível privado é o mais restritivo de todos e impede o acesso completo ao estado e aos métodos. Métodos e atributos com modificador privado será visíveis apenas ao próprio objecto e nunca podem ser acedidos directamente por outros objectos.

Quando falamos em acesso e em aceder aos atributos estamos a referir-nos ao facto de que, ao programarmos a classe, não conseguimos invocar um método ou usar um atributo para o, qual a classe onde estamos, não tenha acesso.

Olhar prático

Um correcto encapsulamento é um processo iterativo, muitas vezes não conseguimos definir logo de início que tipos de acesso devem ser dados aos métodos ou aos atributos, mas como regra prática podemos considerar que todos os atributos devem ser privados, e que os métodos devem ser privados caso sejam usados internamente ou públicos caso sejam usados por outros objectos. O acesso protegido é, muitas vezes, desnecessário ou sinal de mau encapsulamento ou má análise do problema.

Como todas as regras práticas, esta deve ser sempre avaliada em presença de uma situação real, e certamente não se aplica a toda e qualquer situação.

Nunca devemos cair no erro de colocar tudo como público, só porque somos o único programador a desenvolver, ou porque facilita o desenvolvimento dado que escrevemos menos código. Mesmo que o programa esteja a ser desenvolvido apenas por nós, devemos usar correctamente as características da linguagem, em última análise, porque também nos ajuda impedindo que façamos alguma asneira por engano.


  1. Convém relembrar que não escondemos o código, no entanto o programador só conseguirá aceder aos métodos para os quais tiver permissões, definidas através do uso dos modificadores de acesso

  2. Em Java existe um quarto nível que iremos falar na secção de 0505_especialmodificadoresacesso