Prévia do material em texto
Encapsulamento
Python
Prof. Anderson Barroso anderson.santos@souunit.com.br
Encapsulamento - conceito
• Encapsular é fundamental para que seu sistema seja
suscetível a mudanças: não precisamos mudar uma
regra de negócio em vários lugares, mas sim em
apenas um único lugar, já que essa regra está
encapsulada.
• O conjunto de métodos públicos de uma classe é
também chamado de interface da classe, pois esta é
a única maneira a qual você se comunica com
objetos dessa classe.
Encapsulamento - saque de uma conta
• A gente pode criar um teste dentro do método
saca() para validar se há saldo para saque;
• Mas, isso garante que ao invés de usar a variável
diretamente, o usuário usará sempre o método
saca()?
• Para essa garantia, protegemos as variáveis do
acesso externo por meio do conceito de
Encapsulamento.
Encapsulamento – private e público
• Em linguagens como Java e C# basta declarar que os atributos não
podem ser acessados de fora da classe utilizando a palavra chave
private.
• Em orientação a objetos, é prática quase que obrigatória proteger seus
atributos com private.
• Cada classe é responsável por controlar seus atributos, portanto ela deve
julgar se aquele novo valor é válido ou não.
• E esta validação não deve ser controlada por quem está usando a classe
e sim por ela mesma, centralizando essa responsabilidade e facilitando
futuras mudanças no sistema.
• Os atributos e métodos que podem ser visualizados fora da Classe, são
chamados de public.
Encapsulamento – modificador (__)
• O Python não utiliza o termo private, que é um
modificador de acesso e também chamado de
modificador de visibilidade.
• No Python inserimos dois underlines ('__') ao
atributo para adicionar esta característica:
Quando tentamos acessar:
Encapsulamento – modificador (_)
• Uma outra forma de utilizar um atributo privado
é usando apenas um underline(_)
• Programadores python preferem utilizar essa
forma para forçar que o atributo seja protegido
(Protected em outras linguagens)
Encapsulamento – gets e sets
• Para permitir o acesso aos atributos de uma
maneira controlada, a prática mais comum é criar
dois métodos, um que retorna o valor e outro que
muda o valor.
• A convenção para esses métodos em muitas
linguagens OO é colocar a palavra get ou set
antes do nome do atributo.
Encapsulamento – gets e sets
• Por exemplo, uma conta com
saldo e titular fica assim, no
caso de desejarmos dar
acesso a leitura e escrita a
todos os atributos:
Encapsulamento – gets e sets de outra forma
• Que tal utilizar o get e o set sem os parênteses,
como se fossem atributos da classe?
• É apenas uma foram diferente de chamar os dois
métodos
Encapsulamento – gets e sets - properties
• O Python oferece uma solução
chamada de properties.
• Mantemos nossos atributos protegidos
e decoramos nossos métodos com um
decorator chamado property.
• @property serve para “decorar” os
gets;
• @XXX.setter serve para “decorar” os
sets;
• XXX é o nome do método
Encapsulamento – gets e sets - properties
• Para muitos programadores Python, o ideal seria modificar o
saldo através dos métodos públicos saca() e deposita();
• E questionam a necessidade de usar @saldo.setter;
• Isso é uma decisão de negócio específico. O programador
deve ficar alerta quanto as propriedades setters de seus
atributos, nem sempre elas são necessárias.
Encapsulamento – atributos de classe
• Imaginem agora que nosso Banco quer
controlar a quantidade de contas;
• Para entender melhor, eu devo contar a
quantidade de contas instanciadas na
Classe Conta.
• Para isso, devemos declarar uma variável
que servirá como um contador e inicializá-
la antes do construtor.
Encapsulamento – método estático
• Não é boa prática deixar o programa fora
da classe chamar diretamente o atributo
total_contas;
• Então também colocaremos um (_) nele
para protegê-lo e criar um get para
retornar o seu valor.
• Mas, para isso, devemos informar que esse
método é estático que é como uma função
simples e não precisa do self para
funcionar.
Encapsulamento – uma classe como atributo de outra
• É possível declarar um atributo de uma classe sendo do tipo
Classe.
• Ex:
• Dentro da classe Conta, ter um atributo do tipo Dados que também
é uma classe.
• Podemos ter até uma array de classes dentro de uma classe,
ou seja, uma lista de Clientes dentro da Classe Banco.
Encapsulamento – uma classe como atributo de outra
Encapsulamento – array de classes
Exercícios - 01
1. Criar uma classe chamada Pneu
a. Contém os seguintes atributos :
i. aro (inteiro)
ii. cheio (booleano)
iii. criar um construtor
b. criar um método chamado encherPneu() e outro furarPneu()
c. criar um método chamado verificaPneu() que retorna um
texto com a descrição de todos os atributos
Para todas as classes, usar encapsulamento, ou seja,
não deixar outras classes ou programa acessar
diretamente o atributo
Exercícios - 01
1. Criar uma classe chamada Carro
a. Esta Classe contém os seguintes atributos :
i. marca (texto)
ii. ano (inteiro)
iii. pneuDianteiroDireito (do tipo Pneu)
iv. pneuDianteiroEsquerdo (do tipo Pneu)
v. pneuTraseiroDireito (do tipo Pneu)
vi. pneuTraseiroEsquerdo (do tipo Pneu)
2. criar um construtor padrão
3. criar os métodos SET e GET para todos os atributos.
4. criar um método verificaCarro() que retorna uma String com a descrição de
todos os atributos, inclusive dos Pneus.
Exercícios - 01
1. o criar um programa principal chamado Montagem
a. A aplicação deve instanciar um Carro chamado oldCar, utilizando o construtor padrão;
b. Em seguida deve ser impresso todos os dados deste oldCar.
c. Logo após, a aplicação deve instanciar um Carro chamado newCar, utilizando o
construtor específico, com os seguintes valores:
Marca = “BMW”
Ano = 2007
Pneu Dianteiro Direito: Aro=16, Cheio=false
Pneu Dianteiro Esquerdo: Aro=16, Cheio=false
Pneu Traseiro Direito: Aro=15, Cheio=true
Pneu Traseiro Esquerdo: Aro=15, Cheio=true
d. Deve ser chamado o método encherPneu do pneu dianteiro direito no newCar e
furarPneu para o traseiro esquerdo
e. Em seguida deve ser impresso todas as informações deste newCar