quinta-feira, 15 de março de 2007

POO - Encapsulamento

Este post nos mostra uma parte muito importante em POO (na verdade é possivel utilizar isso em várias outras coisas): Encapsulamento

Encapsulamento é a técica que permite separar uma parte funcional de um objeto de sua interface de acesso. Isso proporciona ao utilizador total abstração da parte funcional, que ele não precisa saber. Vamos tomar como exemplo uma televisão. Nós que a utilizamos não precisamos entender do seu funcionamento interno para poder assistir. Basta saber como utilizar o controle remoto (a interface) para controlar a TV.

Uma das principais vantagem do encapsulamento é que as alterações feitas na parte encapsulada não afetam os utilizadores do objeto. Por exemplo: o técnico pode melhorar o mecanismo de exibição de imagem da TV que a forma de utilizar a TV ainda é a mesma de antes.

Encapsulamento também permite controle sobre o campo da classe de acordo com as regras de negócio. Um bom exemplo é um semáforo: É possível recuperar a cor atual, mas não é possível alterar livremente a cor - Isso será feito seguindo uma seqüência previamente definida na regra de negócio.

Nos exemplos abaixo vamos mostrar exemplos de classes com e sem encapsulamento.

Exemplos de classes sem encapsulamento:

Java:

class SemEncapsulamento {

public int semProtecao;

}


...


SemEncapsulamento se = new SemEncapsulamento();
se.semProtecao = 10;


Delphi:

type
TSemEncapsulamento = class

public
SemProtecao: Integer;
end;


...



SE := TSemEncapsulamento.Create;
SE.SemProtecao := 10;


A Implementação em C# é igual à do Java.

Neste tipo de implementação o campo de dados fica aberto ao utilizador da classe; Desta forma este campo pode ser modificado como o utilizador bem quiser; e isso dificulta muito o controle da classe sobre o próprio campo.

Agora a implementação com encapsulamento:

C#:

class ComEncapsulamento {
private int comProtecao;
public int ComProtecao {
get {
return this.comProtecao
}
set {
this.comProtecao = value;
}
}
}


...


ComEncapsulamento ce = new ComEncapsulamento();
ce.comProtecao = 10;


Java:

class ComEncapsulamento {

private int comProtecao;

public int getComProtecao {
return this.comProtecao;
}

public void setComProtecao(int value) {
this.comProtecao = value;
}

}


...


ComEncapsulamento ce = new ComEncapsulamento();
ce.setComProtecao(10);


Delphi:

interface

type
TComEncapsulamento = class

protected
FComProtecao: Integer;
published
property ComProtecao: Integer read FComProtecao write SetComProtecao;
end;

implementation

procedure TComEncapsulamento.SetComProtecao(Value: Integer);
begin
FComProtecao := Value;
end;


...


CE := TComEncapsulamento.Create;
CE.ComProtecao := 10;


Esta forma é mais organizada porque quem utiliza a classe não acessa diretamente o seu campo de dados (ele está num escopo fora de alcance do utilizador): agora isso será feito através das interfaces que a classe criou para leitura e modificação. Desta forma também é mais fácil fazer crítica de entrada antes de alterar o valor do campo interno. Quando não usamos encapsulamento a validação fica por conta do utilizador ou dentro dos métodos da classe que trabalham com os campos em questão; e com isso estamos transmitindo a responsabilidade à entidade errada – principalmente se a validação é feita fora da classe - e tornando as partes que deveriam ser independentes totalmente acoladas. No exemplo da TV nós teríamos que abrir a TV e usar o mecanismo interno dela para trocar o canal e, se o processo for complexo, nós teremos que fazer todo o processo por nós mesmos.

O encapsulamento de campos em Delphi e C# são totalmente transparentes do ponto de vista do utilizador da classe; já em Java nós conseguimos perceber claramente a manipulação através de métodos.

Encapsulamento é uma técnica muito importante para que no nosso código haja realmente a possibilidade de reaproveitamento. Abraços a todos e não deixem de comentar.

Um comentário:

  1. Ai valeu mesmo...
    Sou de Moçambique e estava fazendo um trabalho da faculdade que tinha que explicar sobre caracteristicas do java e esta era uma delas.

    procurei em varios sites e nao encontrei uma bem explicita....

    Valeu

    bom trabalho

    ResponderExcluir

 
BlogBlogs.Com.Br