Linguagem de Programação Orientada a Objetos Bruno Fernandes Byron Leite
Agenda
Encapsulamento
Pacotes
Modificadores de Acesso private, default, protected, public
Encapsulamento
Classes devem cuidar dos seus atributos de forma exclusiva
Classes devem “expor” o mínimo possível de suas funcionalidades para outras classes
Baixo acoplamento
Características do Mau Projeto
Rigidez
Dificuldade de mudar porque a mudança afeta outras
partes
Fragilidade
Uma mudança causa falhas inesperadas
Imobilidade
Dificuldade de reuso – amarrado a uma implementação específica
Características do Bom Projeto
Alta coesão
Níveis de coesão
Coincidente Lógica Procedural Comunicacional FuncionalCoesão Coincidente
Agrupamento aleatório de código
Nenhuma relação entre as partes
Exemplo: funções agrupadas frequentemente em classes chamada de Util
Coesão Lógica
Código agrupado porque são logicamente
categorizados por fazerem a mesma coisa mesmo que sejam fundamentalmente diferentes
Coesão Procedural
Código agrupado pela ordem que as coisas acontecem
Programação estruturada – foco nas funções
Exemplo: checando as permissões de acesso de um arquivo para então abri-lo
Coesão Comunicacional
Código agrupado porque opera sobre um mesmo conjunto de dados
Coesão Funcional
Código agrupado porque contribui para uma mesma única tarefa bem definida do módulo
Acoplamento
Conteúdo Controle Dados Estruturados Dados MensagemAcoplamento de Conteúdo
Uma classe manipula diretamente os dados de outra classe (quebra do encapsulamento)
Uma mudança nos dados resulta numa mudança na outra classe
Acoplamento de Controle
Um módulo controla a lógica de outro passando sua informação sobre o que fazer (como na passagem de uma flag sobre o que fazer)
Acomplamento de Dados
Estruturados
Módulos usam uma estrutura de dados em comum com o uso de fato de apenas uma parte dessa estrutura
Pode levar a falhas inesperadas quando a estrutura de dados mudar
Acoplamento de Dados
Acoplamento de Mensagem
Objetos usam uma interface pública para troca de mensagens
Sem Acoplamento
Objetos não tem conhecimento um do outro e nunca se comunicam
Encapsulamento
A linguagem deve prover mecanismos de restrição de acesso a membros – classes, atributos e métodos
Para isso existem os modificadores de acesso
Classes com “afinidades” devem ser agrupadas
Agenda
Encapsulamento
Pacotes
Modificadores de Acesso private, default, protected, public
Tipos de Módulos em Java
Classes
agrupam categorias comuns: mesmos métodos, atributos,
construtores, etc.
definem tipos
Pacotes
agrupam definições de classes e interfaces relacionadas
estruturam sistemas extensos, facilitando a localização das
classes e interfaces
oferecem um nível mais alto de abstração: há mais classes do
Pacotes e Diretórios
Classes são empacotadas com a seguinte informação de cabeçalho:
package nomeDoPacote;
Cada pacote é associado a um diretório do sistema operacional:
Os arquivos .class das classes compiladas do pacote são colocados neste diretório
Exemplo:
banco
Banco.class package banco;
Pacotes e Diretórios
O nome do pacote deve ser idêntico ao nome do
diretório (maiúsculas se diferenciam de
minúsculas)
O separador de pacotes é o ponto “.” enquanto o
separador de diretórios é a barra “/”
package banco.conta corresponde ao diretório banco/conta
A nomenclatura de pacotes segue a nomenclatura
de atributos
Inicia com minúsculo e segue a regra da palavra
Pacotes e Eclipse
O Eclipse pode dividir os fontes e bytecodes em diretórios diferentes:
Cada diretório respeita a estrutura de empacotamento
src
banco/Banco.java
bin
Pacotes e Subdiretórios
Subdiretórios não correspondem a "subpacotes". São pacotes como outros quaisquer
Por exemplo, os pacotes exemplos e exemplos.banco são pacotes distintos e disjuntos.
package exemplos; /*...*/
package exemplos.banco; /*...*/
Pacotes e Classes
Quando se empacota uma classe o seu nome
muda:
O nome do pacote é incorporado ao nome da classe
Exemplo:
package banco.cliente; public class Cliente{ }
O nome da classe passa a ser banco.cliente.Cliente
Importação de Pacotes
Importação Específica:
Importação genérica:
package banco.conta;
import banco.cliente.Cliente; public class Conta{
}
package banco.conta;
import banco.cliente.*; public class Conta{
Importação de Pacotes
Na importação genérica ou específica, a classe
Cliente pode ser usada no corpo de
banco.conta.Conta
Exemplo:
package banco.conta;
import banco.cliente.Cliente; public class Conta{
private Cliente cliente;
... }
package banco.conta;
import banco.cliente.*; public class Conta{
private Cliente cliente;
... }
Importação de Pacotes
Para usar uma classe sem importar seu pacote, deve-se informar o nome completo da classe
Exemplo:
package banco.conta; public class Conta{
private banco.cliente.Cliente cliente;
... }
Estruturando Aplicações com
Pacotes
Estruturação típica de um sistema de informação:
Vários pacotes para as classes da interfaces de GUI, um para cada conjunto de telas associadas
Um pacote para a classe fachada e exceções associadas Um pacote para cada ramo de negócio, incluindo as
classes básicas, coleções de dados, interfaces, coleções de negócio e exceções associadas
Um pacote (sistema).util contendo classes auxiliares de
Estruturando Aplicações com
Pacotes
Agrupar classes relacionadas, com dependência
(de implementação ou conceitual) entre as
mesmas
Conta SIException RepContasArray CadastroContas CEException CIException Cliente RepClientesArray CadastroClientes CliEException CliIException fachada util guiEmpacotamento durante a
implementação
Se as classes foram criadas antes de empacotar então o empacotamento é mais trabalhoso
Normalmente a estrutura de pacotes de uma aplicação já é definida na arquitetura do sistema
Pacotes da Biblioteca de Java
Acesso a Internet e WWW (
java.net
)
Applets (
java.applet
)
Definição de interfaces gráficas (
java.swing
)
Suporte a objetos distribuídos (
java.rmi
)
Interface com Banco de Dados (
java.sql
)
Básicos: threads e manipulação de strings
(
java.lang
), arquivos (
java.io
), utilitários de
propósito geral (
java.util
)
Agenda
Encapsulamento
Pacotes
Modificadores de Acesso private, default, protected, public
Pacotes e modificadores de acesso
Restringem o acesso a um membro por outrosmembros
Restrição é relacionada à localização do membro no projeto
Em classes Em pacotes
Em uma sub-hierarquia No projeto
Pacotes e modificadores de acesso
public
declaração pode ser utilizada (é visível) em qualquer lugar, mesmo de pacotes diferentes
protected
declaração só pode ser utilizada no pacote onde ela é introduzida, ou nas subclasses da classe onde ela é introduzida
“default” (sem modificador)
declaração só pode ser utilizada no pacote onde ela é introduzida
private
Agenda
Encapsulamento
Pacotes
Modificadores de Acesso private, default, protected, public
Modificadores static e final
static – sinônimo de “de classe”
Aplicável a atributos e métodos
Membros estáticos são acessados através da classe
Um atributo static pertence à classe, e não aos objetos da
classe
Um método static só pode acessar membros static da
Modificadores static e final
final – sinônimo de “imutável” ou “não extensível”
Aplicável a classes, atributos, métodos Classes final não podem ser herdadas
Atributos final não podem ter seus valores alterados
-constantes
Métodos final não podem ser sobrescritos (vamos ver
Modificadores static e final
Para definir constantes em Java...
Utilizamos a combinação de “static final” em atributos
public class Funcionario{ private int estadoCivil;
public static final int CASADO = 1; public static final int SOLTEIRO = 2; public static final int SEPARADO = 3; public static final int VIUVO = 4;