Encapsulamento que em programação orientada a objetos significa separar o programa em partes, o mais isoladas possível. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações. Objetos restringem a visibilidade de seus recursos (atributos e métodos) aos outros usuários. Todo objeto tem uma interface, que determina como os outros objetos podem interagir com ele. A implementação do objeto é encapsulada, isso é, invisível ou visível fora do próprio objeto.
Tipos de Acesso
- Public – deixa visível a classe ou membro para todas as outras classes, subclasses e pacotes.
- Private – deixa visível o atributo apenas para a classe em que este atributo se encontra.
- Protected – deixa visível o atributo para todas as outras classes e subclasses que pertencem ao mesmo pacote. O protected é um intermediário entre public e private.
Publico VS Private
- Publico todas as classes podem usar os métodos e campos.
- Privado apenas a classe podem usar os métodos e campos.
Por que Controlar o Acesso?
- Proteger informação privada.
- Esclarecer como outros programadores devem usar sua classe.
- Manter a implementação separado da interface.
Exemplo:
Imagine o seguinte cenário, temos uma classe que é responsável por transações de cartões de credito geralmente este tipo de classe pertence a companhia de cartões de credito e foi desenvolvida por um outro programador e esta dentro de uma DLL ou OS, acontece que o desenvolvedor terceirizado cometeu um deslize deixando visível a propriedade numero do cartão. Um desenvolvedor malicioso pode facilmente capturar o numero do cartão referenciando o objeto.
Ruby
#!/usr/bin/env ruby # Desenvolvimento Aberto # ControleAcesso.rb # Define classe class CartaoCredito # Assessores publicos # Estes assessores não deveriam existir # pois podem ser utilizados por qualquer um attr_accessor :cartao_public, :valor_public # Estes métodos controlam os assessores privados # Os encapsulando e permitindo quaisquer tipo de validações # como por exemplo usuários que podem utilizar a função def setCartao(cartao) # Você pode criar uma validação para # ter certeza que o usuário pode utilizar esta função @cartao = cartao end def getCartao() # Você pode criar uma validação para # ter certeza que o usuário pode utilizar esta função return @cartao end def setValor(valor) # Você pode criar uma validação para # ter certeza que o usuário pode utilizar esta função @valor = valor end def getValor() # Você pode criar uma validação para # ter certeza que o usuário pode utilizar esta função return @valor end # Declara setor privado private # Assessores privados attr_accessor :cartao, :valor end # Os assessore públicos são visíveis para qualquer pessoa c1 = CartaoCredito.new # Acesso direto c1.cartao_public= "1234 5678 8900 1236" c1.valor_public= 1234.56 puts "Acesso publico - Qualquer pessoa pode utiliza-lo" puts "Cartão 1: " + c1.cartao_public + " ---- Valor: R$ " + String(c1.valor_public) c2 = CartaoCredito.new # c2.cartao="1234 5678 8900 1236" # Caso tente acessar o metodo privado obterá o seguinte erro: # private method `cartao=' called for #<CartaoCredito:0x00000001360e38> # não possibilitando acesso direto ao assessor cartão # Você deve permitir acesso aos assessores privados # através do encapsulamento utilizando métodos públicos # O método correto seria: c2.setCartao("4567 1234 7890 3456") c2.setValor(3456.89) puts "\nAcesso privado - Você permite que utilizem através de métodos" puts "Cartão 2: " + c2.getCartao + " ---- Valor: R$ " + String(c2.getValor)