Encapsulamento (informática): diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Linha 10:
 
Encapsular atributos também auxilia a garantir que o estado e o comportamento de um objeto se mantenha coeso. Por exemplo, no caso da classe <code>Semaforo</code> poderiamos ter um método de acesso chamado <code>lerCor()</code>, e um modificador chamado <code>proximaCor()</code>. O estado é mantido pois os usuários da classe não podem alterar as cores de um semáforo ao seu bel prazer e, por exemplo, fazer a seguinte troca de cores: vermelho-amarelo-vermelho. É comum usar o padrão get<nomeDoAtributo> para o método que retorna o valor atual do atributo e set<nomeDoAtributo> para o método que modifica o valor de um atributo do objeto, como no exemplo abaixo: <code>setComProtecao</code> e <code>getComProtecao</code>.
Em [[C# (linguagem de programação)|C#]] proporciona uma forma de se fazer acesso a variaveis privadas chamada Properties.
Com Properties pode-se encapsular os campos assim como na forma convencional, porém quando se for acessar os mesmos
pode-se fazer como se fosse uma variavel comum. Essa nova forma torna a programação mais facil e intuitiva.
 
[[C# (linguagem de programação)|C#]]
== Exemplos ==
Os exemplos a seguir foram escritos utilizando as linguagens [[Java (linguagem de programação)|Java]] e [[C++ |C++]] . Entretanto, a idéia aplica-se a qualquer linguagem de programação [[Orientação a objetos|orientada a objetos]]. Atente ao fato de que cada linguagem de programação define os literais de [[palavra reservada]] para definir seus [[Modificador de acesso|modificadores de acesso]]. Alguns tipos são: ''public'', ''private'' e ''protect''.
 
=== Properties em C# ===
<source lang="csharp">
public class Pessoa
{
//Autor: Mateus Mesquita
//Data: 16 de setembro de 2011
//variaveis de instancia
//por padrão com o modificador de acesso private
String nome;
int idade;
int telefone;
 
bool estaComprometido;
//Properties que encapsulam os campos
public String Nome{
get{ return nome; }
//value é uma variavel local, definida
//pelo compilador, sendo assim não se pode
//definir dentro do bloco a seguir um varivel
//chamada value.
//A mesma tem o tipo implicitimente definido com
//o que se eh passado a ela, na atribuição de algum
//valor a essa propertie for passado o tipo int
//como em objeto.Propetie = 123;
//value será do tipo int
//nesse caso a baixo value sera do tipo String
set{ nome = value;}
}
public int Idade{
get{ return idade;}
//Pode-se (e deve-se) ser feito a escruitinagem
//de valores dentro dos blocos
set{ idade = (value >= 0) ? idade : 0; );
}
public int Telefone{
//Pode-se chamar metodos dentro as properties
//para que caso hajaa uma logica de
//escrutinagem ou de acesso mais elaborada
//No exemplo abaixo é apenas demostrativo
get{ return GetTelefone(); }
set{ telefone = value;}
}
public int Comprometido{
//Pode-se também criar properties
//"Read-only" ou Write-only
//Fazendo assim que a mesma possa apenas
//ser lida, ou apenas escrita
//Neste caso a propertie é read-only
//pois estaremos implementando apenas
//o get da mesma
get{ return estaComprometido;}
}
//Pode-se tambem implementar um "falso" readonly ou
//writeonly, fazendo que que a propetie tenha um
//set private, ou um set private.
//Assim para o "mundo externo" é apenas uma propertie
//de leitura ou escrita, mas para a classe é uma properie
//comum
 
/*
Falso Readonly - Writeonly
//Write only
public int SomeVar{
private get{ return someVar;}
set{ someVar = value;}
}
//Read only
public int SomeVar{
get{ return someVar;}
private set{ someVar = value;}
}
*/
//Deve-se lembrar que sempre a propertie deve ter
//o modificador de acesso mais abrangente e
//ou o set, ou o get um modificador de acesso mais restrito
//caso queira-se criar um "falso' Read/Write-only
//Assim o proximo exemplo estara errado
/*
ERRADO
Falso Readonly - Writeonly
//Write only
private int SomeVar{
public get{ return someVar;}
set{ someVar = value;}
}
//Read only
private int SomeVar{
get{ return someVar;}
public set{ someVar = value;}
}
*/
public int getTelefone(){
return telefone;
}
//Construtor da classe;
public Pessoa(String nome, int idade, int telefone){
//Usando as properties,
//Note que com esse mecanismo é como se vocé estive-se
//utilizando uma variavel comum.
Nome = nome;
this.Idade = idade;
Telefone = telefone;
}
}
</source>
=== Sem encapsulamento em JAVA===
<source lang="Java">