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)


