Você está na página 1de 33

CET078 - Linguagem de

Programação III
Atributos e Métodos: Encapsulamento
Objetivos

● Aprender a construir classes simples em Java e Python


● Discutir e assimilar o conceito de encapsulamento e como ele pode ser
implementado usando os modificadores de acesso
● Apresentar os métodos de Acesso (getter) e Atualização (setter) e sua
implementação em Java e Python
● Assimilar o mecanismo de autoreferrenciamento em Java e Python
Roteiro

● Objetos
● Implementação de uma classe
● Declaração de atributos e métodos
● Classes cliente, uso de métodos
● Encapsulamento e modificadores de acesso
● Métodos Getter e Setter
● Mecanismo de autoreferenciamento
Objetos

● Objetos = abstrações computacionais, permitem a representação mediante um


modelo de objetos físicos ou conceituais

● Objetos apresentam:

○ Atributos = propriedades, o conjunto de atributos definem o estado do objeto

○ Métodos = ações, definem os comportamentos do objeto e permitem sua interação com outros
objetos e o ambiente externo
Objetos

● Carro (Objeto físico) ● Previsão do tempo (Conceito)

Carro PrevisaoTempo
- cor - data
- fabricante - tempMedia
- modelo - tempMinima
- ano - tempMaxima
- velocidadeAtual - humidade
+ ligarMotor() - percentChuva
+ acelerar() + imprimir()
+ frear() + atualizar()
+ bucinar()
+ virar(direcao)
Objetos

● Objetos são construídos a partir de classes

● Uma classe é um blueprint (diagrama ou planta) que define o estado e os


comportamentos de um tipo de objetos usando variáveis e métodos
● Cada objeto (instância da classe) é criado a partir de uma classe

● Cada objeto tem uma cópia de seus atributos ou variáveis de instância (que definem
o estado dele)
● Os métodos são compartilhados entre todos os objetos do mesmo tipo

● Como os objetos são representados na memória?


Criando nossa primeira classe

● Uma classe simples: Cat

Cat
- name
- age
+ info()
+ makeSound()
A classe Cat em Java
A classe cliente CatExample em Java ...
A classe Cat em Java ...

● Podemos adicionar o método main() na própria classe para fins de testes e


verificação

● Este método deve ser retirado de classes em ambiente de produção

● Ver classe CatRun.java


A classe Cat em Python
Uso da classe Cat em Python ...
Implementação da classe Cat em Python ...

● Lembremos que notebooks de Python criam um ambientes para testes e


desenvolvimento de código
● Todas as células do notebook compartilham o mesmo escopo
● Podemos implementar e usar a classe cat usando o script (programa) em Python
● Ver código 04_NotEncapsulated.py
Atributos
● Atributos representam os dados ou informações que permitem caracterizar as
instâncias de uma classe (objetos):
○ Atributos são declarados na definição da classe e podem ser acessados nos objetos derivados dela;
○ Atributos definem o estado do objeto

● Qual o escopo de um atributo?


○ Tem escopo de instância ou objeto;
○ Podem ser acessados diretamente (não precisam ser passados como parâmetros) na definição dos
métodos de uma classe;
○ Todos os métodos da classe podem mudar as variáveis da instancia e modificar o estado do objeto;
○ Podem ser acessados através dos objetos derivados da classe;
Atributos

● Acessar diretamente os atributos não é recomendável na maioria dos contextos;


● O acesso direto aos atributos da classe viola o princípio de acesso mínimo;
● Para evitar erro na manipulação direta dos atributos podem ser criados mecanismos,
via métodos implementados na classe, para manipular os atributos
● Acessors e Mutators (métodos get/set)
Métodos

● Métodos permitem ao programador agrupar instruções associadas com uma


finalidade (comportamento) e dar um nome ao módulo
● A criação de métodos permite usufruir as vantagens da modularização do código
● Módulo = permite dividir o programa em pequenas peças (métodos) que
representam tarefas específicas e unicas
● Método = ação ou comportamento de um objeto
● Métodos permitem empacotar o código para executar uma tarefa em uma estrutura
que pode ser invocada
Métodos
● Para executar a tarefa associada a um método “chamamos” o método com os
parâmetros correspondentes

● Métodos em Java

● Métodos em Python
Encapsulamento

● Disponibilizar ferramentas para manipular os atributos (métodos set/get) não


garantem que o programador vai utilizar exclusivamente estes mecanismos;
● Para impedir o acesso direto a atributos de uma classe as linguagens que
implementam POO utilizam o mecanismo de Encapsulamento;
● Encapsulamento pode ser definido como a técnica que permitem que detalhes
específicos da implementação de uma classe permaneçam ocultos das instâncias da
mesma.
Encapsulamento
● O encapsulamento é implementado através de modificadores explícitos de acesso;
● Os modificadores de acesso estabelecem regras de acesso as classes, atributos e
métodos em POO;
● As linguagens de POO implementam, de forma geral, pelo menos dois
modificadores de acesso. Os atributos e métodos da classe podem ser:
○ Privados: membros (atributos e métodos) somente podem ser acessados na implementação da classe,
apenas a própria classe tem acesso;
○ Públicos: membros podem ser acessados “fora” da implementação da classe, isto é, por outras classe;

● Existem outros modificadores de acesso em dependência da linguagem;


Encapsulamento

● Modificadores de acesso em JAVA


● Default (no keyword): modificador padrão utilizado quando nenhum dos outros é especificado,
também chamada de package-private, todos os membros são visíveis dentro do mesmo pacote,
accessíveis dentro do mesmo pacote, inaccessíveis fora.
● Públicos (public): os membros podem ser acessados dentro e fora da classe, accessíveis por
qualquer classe, é o modificador menos restritivo.
● Privados (private): os membros são accessíveis apenas dentro da mesma classe, disponíveis
apenas na implementação da classe, é o modificador mais restritivo, principal ferramenta de
encapsulamento, os dados são invisíveis para o exterior.
● Protegidos (protected): os membros são accessíveis no mesmo pacote (default) e também pelas
classes derivadas fora do pacote.
Modificadores de acesso em JAVA

● Exemplos: https://www.baeldung.com/java-access-modifiers
Encapsulamento

● Modificadores de acesso em Python


● Públicos (noKeyword): os membros podem ser acessados em todo o programa, comportamento
padrão em Python.
● Protegidos (_ underScore): os membros são accessíveis pela própria classe e pelas classes
derivadas.
● Privados (__ doubleUnderScore): os membros são accessíveis apenas dentro da própria classe.

● Exemplos: https://www.geeksforgeeks.org/access-modifiers-in-python-public-
private-and-protected/
Encapsulamento

● Na definição de encapsulamento se fala em atributos e métodos mas:


○ Qual o sentido de métodos privados numa classe;

● Determinadas funcionalidades podem ser implementadas apenas para auxiliar na


implementação dos métodos da classe, não precisam estar visíveis ao código
cliente;
● Estes métodos podem e devem ficar ocultos dos objetos que acessam apenas aos
métodos públicos;
○ Algumas linguagens, como Java, definem que sejam utilizados os modificadores de acesso inclusive
nas declarações das classes.
Encapsulamento

● Mais a frente no curso voltaremos nos aspectos avançados do encapsulamento.


● Neste ponto iremos a estabelecer apenas o seguinte conjunto de recomendações:
○ Defina todas suas classes como públicas;
○ Defina todos seus atributos como privados;
○ Defina como públicos todos os métodos que podem ser caracterizados como ações ou mensagens de
e para as instâncias da classe;
○ Defina como privados todos os métodos que podem ser caracterizados como auxiliares ou internos
da classe.
Métodos de acesso (Acessor or Getter)

● São métodos públicos que apenas retornam o valor de um atributo (variável de


instância)
● Eles não modificam o estado do objeto
● Estes métodos não recebem nenhum parâmetro
● O tipo de retorno coincide com o tipo do atributo
● Métodos getters não são requeridos para cada um dos atributos
● Apenas proporcione métodos de acesso para os atributos que precisam ser “lidos”
pelas classes cliente
Métodos Atualizadores (Mutator or Setter)

● São métodos públicos que não retornam nenhum valor


● Eles tem a finalidade de modificar o estado do objeto, mudando um de seus
atributos
● Estes métodos recebem um parâmetro, o valor para atualizar o atributo
● O tipo do parâmetro corresponde ao tipo do atributo
● Métodos setters não são requeridos para cada um dos atributos
● Apenas proporcione métodos setter para os atributos que precisam ser
“modificados” pelas classes cliente
Getter e Setter em Java

● Getter convenção de nomes


● public varType getVarName()

● Setter convenção de nomes


● void setVarName(varType varName)

● Exemplo Java: 02_Encapsulated


Getter e Setter em Python

● Para implementamos Mutators e Accessor em Python usamos o decorator


@properties
● Detalhes da implementação

●Exemplo Python notebook: Encapsulated


Autorefereciamento - Java
● Ao implementarmos um método de uma classe podemos acessar diretamente aos
membros da classe (atributos e métodos)

● No método info usamos


diretamente os atributos name e
age
● Que ocorre quando usamos o
mesmo identificador para um
parâmetro e um atributo
(método setName)?
Autorefereciamento - Java

● O identificador dos parâmetros “oculta” o acesso aos atributos da classe.

● Ofuscamento de identificadores
● Em java contornamos o problema usando o mecanismo de autoreferenciamento (this)
Autorefereciamento - Java
● A palavra-chave this permite referenciar o objeto corrente (que fez a chamada)
dentro de um método ou construtor
● Em Java, quando se chama a um método, se passa automaticamente um argumento
implícito que é uma referencia ao objeto invocado
● Os usos mais comuns do autoreferenciamento são
● Resolver conflitos de nomes entre variáveis locais (parâmetros) e variáveis de instância (atributos)
● Invocar um método ou construtor da classe corrente
● Retornar um objeto da classe corrente
● Passar um argumento na chamada de um método ou construtor

● Exemplo: 03_UseThis
Autorefereciamento - Python

● Todos os métodos de uma classe em Python tem como primeiro parâmetro uma
referencia ao próprio objeto
● A referência é declarada de forma explicita na definição do método
● A referência é enviada ao método de forma implícita, não é inclusa entre os
parâmetros na chamada
● Geralmente usamos self para identificar esta referencia
● self não é uma palavra reservada em Python, pero frequentemente usamos este
identificador para melhorar a legibilidade do código
Autorefereciamento - Python

● Exemplo: 03_AutoreferenciamentoSelf

Você também pode gostar