PROGRAMAÇÃO ORIENTADA A OBJETOS I -TÉCNICAS DE OO Prof. Angelo Augusto Frozza, M.Sc. http://about.me/tilfrozza
ROTEIRO Técnicas de Orientação a Objetos Classes e objetos Métodos Subscritos Métodos Sobrecarregados Herança Polimorfismo Classes Abstratas Interfaces
CLASSES Classes são os blocos de construção mais importantes de qualquer sistema O.O.; Uma Classe é uma descrição de um conjunto de objetos que compartilham os mesmos atributos, operações, relacionamentos e semântica; Classes capturam o vocabulário do sistema em desenvolvimento (substantivos, verbos e adjetivos); Podem incluir abstrações que são parte do domínio do problema; P.ex.: itens de software, de hardware e até itens puramente conceituais.
CLASSES A modelagem de um sistema envolve a identificação de itens considerados importantes de acordo com uma determinada visão Domínio do sistema Por exemplo: A construção de uma casa envolve paredes, portas, janelas, cômodos, luzes etc.; Cada conceito pode ser diferenciado dos demais [atributos, métodos (operações) e relacionamentos];
CLASSES Toda Classe possui: Nome - que a diferencie das outras classes; Atributos propriedades que descrevem um intervalo de valores que as instâncias da classe podem apresentar; Abstraem os tipos de dados ou estados que os objetos de uma classe podem abranger; Métodos (operações) implementam serviços que podem ser solicitados por algum objeto da classe para modificar seu comportamento; Abstraem algo que pode ser feito com um objeto; Algumas vezes, a chamada a uma operação de um objeto altera os atributos ou o estado do mesmo;
CLASSES public class Cliente { // Atributos // // Construtor da classe public Cliente() { // Métodos set e get // // Métodos da lógica de negócios //
CLASSES Visibilidade
CLASSES Visibilidade Private (-) Permite o acesso apenas pelos métodos da superclasse em que estão definidos; Public (+) Permite o acesso por qualquer método em qualquer lugar do programa; Protected (#) Permite o acesso apenas pelos métodos da superclasse em que estão definidos; por métodos de subclasses e por membros de outras classes no mesmo pacote;
CLASSES Métodos (operações) são descritos por: Visibilidade Nome Lista de parâmetros Tipo de retorno
CLASSES Encapsulamento É a técnica que faz com que detalhes internos do funcionamento dos métodos de uma Classe permaneçam ocultos para os objetos; Por conta dessa técnica, o conhecimento a respeito da implementação interna da classe é desnecessário do ponto de vista do objeto, uma vez que isso passa a ser responsabilidade dos métodos internos da classe. (Conceitos Encapsulamento: Programação Orientada a Objetos http://www.devmedia.com.br/conceitos-encapsulamentoprogramacao-orientada-a-objetos/18702#ixzz2wb3cuvo4)
CLASSES Encapsulamento Primeira regra: os atributos não podem ser manipulados diretamente em uma classe Em vez disso, deve-se usar métodos set e get Set usado para atribuir valor a um atributo private tipo_de_dado atributo; public void setatributo (tipo_de_dado parametro) { this.atributo = parametro;
CLASSES Encapsulamento Primeira regra: os atributos não podem ser manipulados diretamente em uma classe Em vez disso, deve-se usar métodos set e get Get usado para ler o valor de um atributo private tipo_de_dado atributo; public tipo_de_dado getatributo () { return this.atributo;
DIAGRAMA DE CLASSES Regras úteis: 1. Identificar todas as classes participando na solução proposta pelos diagramas de interação; 2. Desenhar as classes num diagrama de classe; 3. Incluir os atributos identificados no modelo conceitual; 4. Adicionar métodos tal como identificados nos diagramas de interação; 5. Adicionar informação sobre o tipo dos atributos e métodos; 6. Adicionar as associações necessária para permitir a visibilidade de atributos requisitada; 7. Adicionar setas de navegabilidade para indicar a direção da visibilidade de atributos; 8. Adicionar relacionamentos de dependência para indicar outros tipos de visibilidade;
BOAS PRÁTICAS DE PROGRAMAÇÃO Procure adotar boas práticas de programação Endentação correta do código No NetBeans use CRTL + SHIFT + F Convenção de nomes http://www.tiexpert.net/programacao/java/nomenclatura.php
EXERCÍCIO DE FIXAÇÃO Identifique e implemente as classes para os problemas listados a seguir (Aula006c): Clínica médica Reserva de passagens aéreas
RELACIONAMENTOS Objetos se relacionam entre si através de operações (métodos); Exemplo: Objeto FAZENDEIRO: operação tirarleite(); Objeto VACA: operação produzirleite(); Tipos de relacionamentos: Associação: simples, agregação, composição Herança Dependência
ATRIBUTOS DE UMA ASSOCIAÇÃO Nome Nome da associação Papéis Papéis das classes que estão relacionadas pela associação O papel da classe A é o nome do atributo que a classe B possui que guarda o objetivo da classe A Multiplicidades Quantidades de objetos associados a um papel Navegabilidade Indica a direção da relação entre as classes
ASSOCIAÇÃO SIMPLES Utilizada para relacionar duas classes cujos objetos podem se comunicar; Semanticamente representam que as classes "conhecem uma a outra", "estão conectadas com", "para cada X existe um Y ; Deve-se identificar o papel das classes na associação;
ASSOCIAÇÃO SIMPLES public class Funcionario { private Funcionario gerente; private List<Funcionario> subordinados = new ArrayList<Funcionario>(0); // Demais atributos // // Construtor public Funcionario() { // Métodos setters e getters //
AGREGAÇÃO Representa que um tipo de objeto é composto, pelo menos em parte, de outro objeto em uma relação todo/parte; O objeto parte é um atributo do objeto todo; O ciclo de vida do objeto parte é limitado ao ciclo de vida do objeto todo; Porém, a parte vive sem o todo e o todo existe sem as partes (relação todo-parte fraca); A agregação indica que uma das classes do relacionamento é uma parte ou está contida em outra classe Semanticamente representa: "consiste em", "contém", "é parte de".
AGREGAÇÃO Exemplo: Marina e navios: uma marina contém navios Carro e rodas Pedido e item de pedido
AGREGAÇÃO public class Navio { private String nomenavio; Outro exemplo: Pedido e ItemPedido public Navio() { public class Marina { private String nomemarina; private ArrayList<Navio> navios; public Marina() { navios = new ArrayList<Navio>(); public void add(navio umnavio) { navios.add(umnavio);
COMPOSIÇÃO Semelhante a agregação; Existe quando uma classe é composta por outra, de tal forma que a parte que compõe não existe se não existir o todo; Relação todo-parte forte: a parte não vive sem o todo ; Semanticamente equivale a um atributo ( é composto de ); Partes de uma composição não podem ser referenciadas por objetos externos; A remoção do todo implica na remoção das partes; Exemplo: Vaca é composta por Chifres, Cascos, Rabo, Úbere etc.
COMPOSIÇÃO public class Peca{ private int codigopeca; public Peca() { public class Motor { private int idmotor; private ArrayList<Peca> pecas; public Motor() { pecas = new ArrayList<Pecas>(); public void add(peca umapeca) { pecas.add(umapeca);
AGREGAÇÃO X COMPOSIÇÃO Imagine um cenário com 2 objetos: "A" e "B Estamos na dúvida da relação entre eles, então fazemos as perguntas a seguir: 1 - Se eu "deletar" o A, terei que "deletar" também o B? Sim = Composição Não = pode ser Agregação ou nada (vá para a pergunta 2) Exemplo: Pedido e Compras: um Pedido pode ter várias Compras, mas se excluir o Pedido, precisa excluir as Compras não faz sentido ter um objeto Compra sem que ele esteja em algum Pedido sua única razão de existir é "compor" um pedido
AGREGAÇÃO X COMPOSIÇÃO 2 - O objeto B tem alguma utilidade sozinho? Sim = Associação simples Não = Agregação Exemplo: Carro e Rodas: se excluir um Carro, não precisa excluir suas Rodas, pois elas podem servir para outro Carro. Porém, uma roda tem utilidade sozinha? Geralmente não, ela serve sempre para "agregar" uma funcionalidade a outro objeto, como a funcionalidade de andar ao Carro (ou a um outro veículo qualquer), ou até mesmo a funcionalidade para crianças sentarem em um "balanço de árvore" etc.
AGREGAÇÃO X COMPOSIÇÃO O caso de Composição é o mais claro; Já o de Agregação muitas vezes depende da interpretação do analista, pois alguém pode contestar que uma roda tem sim uma utilidade sozinha para algum caso bizarro que ele observou, ou que existe no "mundo particular dele".
HERANÇA (GENERALIZAÇÃO) Uma classe pode possuir um relacionamento de herança com outra classe (mãe e filha); A classe mãe é menos especializada (mais genérica) que a classe filha; Semanticamente representa é um tipo ou é do tipo ; Por exemplo: Vaca é um tipo de mamífero a classe Vaca é derivada da classe Mamifero
HERANÇA public class Veiculo{ private String chassi; private String placa;... public Veiculo() { public class VeiculoDeCarga extends Veiculo { private double cargamaxima; public VeiculoDeCarga () { public class VeiculoDePasseio extends Veiculo { private double quantidadedepassageiros; public VeiculoDePasseio () {
HERANÇA Tutorial http://www.caelum.com.br/apostila-java-orientacaoobjetos/heranca-reescrita-e-polimorfismo/
DEPENDÊNCIA A Dependência deixa explícito que uma mudança na especificação de um elemento pode alterar a especificação do elemento dependente; Os objetos de uma classe esporadicamente usam serviços dos objetos de outra classe; Exemplos de uso: Uma classe chama métodos de outra; Uma classe tem operações que retornam outra classe; Uma classe tem operações que esperam como parâmetro outra classe;
DEPENDÊNCIA public class Moeda { public Moeda(double umvalor, String umnome) { public double getvalor() { public class CaixaRegistradora { public CaixaRegistradora() { public void entrepagamento (int qtdmoeda, Moeda tipomoeda) {
INTERFACE É uma classe sem nenhuma implementação; Contem apenas atributos static final; Todas as operações são abstratas; Os métodos têm apenas a sua assinatura; O relacionamento de realização indica as classes que implementam a interface; Equivale a generalização; É uma alternativa para a herança múltipla em Java;
INTERFACE public interface Autenticavel { public boolean autentica(int senha); public class Gerente implements Autenticavel { public Gerente () { public boolean autentica (int senha) { public class Cliente implements Autenticavel { public Cliente () { public boolean autentica (int senha) {
MULTIPLICIDADE Representa o número de elementos de uma propriedade; Estrutura X..Y onde: Opcional: X = 0 Mandatório: X = 1 Somente um valor: Y = 1 Multivalorado: Y > 1 Valores clássicos: 0..1 1 (equivalente a 1..1 default) * (equivalente a 0..*) 1..*
CLASSES DE ASSOCIAÇÃO Permitem a adição de informações em uma associação; Devem ser transformadas em classes comuns posteriormente para viabilizar implementação;
PROPRIEDADES E OPERAÇÕES ESTÁTICAS Propriedades que não são instanciadas nos objetos; Operações que atuam somente sobre propriedades estáticas; Ambos são acessados diretamente na classe: Exemplo: Pedido.getProximoNumero(); Não é necessário um objeto para acessar a propriedade; Operações estáticas são sublinhadas no diagrama;
PROPRIEDADES E OPERAÇÕES ESTÁTICAS public class ContaBancaria { private double saldo; private int numeroconta; private static int ultimacontacriada = 1000; public static final double TAXA_CHEQUE_ESPECIAL = 5; public ContaBancaria () { // aqui vai uma forma de inicializar a // propriedade estática, por exemplo: this.ultimacontacriada++; this.numeroconta = this.ultimacontacriada; Desafio: Implementar um protótipo do jogo Percorrer Labirinto.
PROPRIEDADES DERIVADAS São propriedades que na verdade não existem como atributos ou associações; Podem ser inferidas por outras propriedades da classe; É interessante explicitar através de nota ou restrição a fórmula de derivação; São marcadas com o símbolo / ;
CLASSES E OPERAÇÕES ABSTRATAS Classes que não podem ter instâncias Usualmente têm operações abstratas, ou seja, sem implementação; Suas subclasses usualmente são concretas Implementam métodos com comportamentos específicos para as operações abstratas; Utilizam nome em itálico;
PACOTES Em algumas situações se deseja ter uma visão geral das partes do sistema; Para isso, o diagrama de pacotes é a ferramenta indicada; Pacotes agregam classes e outros pacotes Dependências podem ser inferidas indiretamente; Exemplo: Classe C1 pertence ao pacote P1 Classe C2 pertence ao pacote P2 Classe C1 depende da classe C2 Logo, pacote P1 depende do pacote P2
PACOTES
POLIMORFISMO O polimorfismo indica o princípio de que o comportamento pode variar com base no tipo real de um objeto; Podemos escrever métodos que recebem instâncias de uma classe C e esses mesmos métodos serão capazes de processar instâncias de qualquer classe que herde da classe C;
POLIMORFISMO Tutorial: http://www.caelum.com.br/apostila-java-orientacao-objetos/heranca-reescritae-polimorfismo/#7-8-discussoes-em-aula-alternativas-ao-atributo-protected
MÉTODOS SUBSCRITOS Refere-se a possibilidade de se reescrever a implementação (override) de um método existente em uma superclasse public class Pessoa { protected String nome; protected String endereco; public Pessoa() {... public String getnome() { return nome;
MÉTODOS SUBSCRITOS public class Aluno extends Pessoa { public Aluno() { //se os membros foram declarados como protected super.nome = Algum nome ; super.endereco = Algum endereco ; System.out.println( Construtor de Aluno... ); @override public String getnome() { System.out.println( getnome da sub-classe ); return nome; public void meumetodo(string algo) { System.out.println( Metodo do aluno... + algo);
MÉTODOS SUBSCRITOS public class Empregado extends Pessoa { public Empregado() {... @override public String getnome() { System.out.println( Nome do empregado: + nome); return nome;
MÉTODOS SOBRECARREGADOS Dois métodos de uma mesma classe podem ter o mesmo nome, desde que suas listas de parâmetros sejam diferentes, constituindo assim uma assinatura diferente Tal situação não gera conflito pois o compilador é capaz de detectar qual método deve ser escolhido a partir da análise dos tipos de argumentos do método. public static void setano (ano: integer) {... public static void setano (ano: String) {...
Associação (linha contínua): as duas classes são independentes e podem trabalhar juntas. A visibilidade destaca qual lado consegue enxergar as extremidades da associação, mas ambas as classes podem estabelecer o relacionamento. Exemplo: Cliente e Fornecedor.
Dependência (seta tracejada): é o relacionamento mais fraco da UML, simplesmente diz que um elemento client (que atira a seta) é semanticamente ou estruturalmente dependente do supplier (que recebe a seta). Exemplo: Produto e AliquotaImposto.
Agregação (linha contínua com diamante branco): a classe que possui o diamante branco controla a associação. Exemplo: Equipe e Pessoa. A equipe é quem pode estabelecer o relacionamento, você adiciona pessoas à equipe. Uma pessoa por sí só não pode "entrar na equipe". É a equipe que manda no relacionamento, mas mesmo assim, as classes são independentes. Pessoas existem fora de equipes. METÁFORA: Podemos dizer que a classe que possui o diamante branco é a MULHER, ela quer controlar o relacionamento!
Composição (linha contínua com diamante negro): a composição é uma agregação mais forte. A classe que possui o diamante controla a associação, e além disso, a outra classe só pode existir associada à classe que tem o diamante e não pode estar associada a outras instâncias. Exemplo: Nota e ItemNota, Pedido e ItemPedido. METÁFORA: A classe com o diamante negro é uma MULHER CIUMENTA, além de controlar o relacionamento, não permite que o composto se associe com mais ninguém e julga que o outro não existe sem ela...
TUTORIAL OO Java e Orientação a Objetos Apostila do curso FJ-11 (Caelum Ensino e Inovação) http://www.caelum.com.br/apostila-java-orientacao-objetos/ Programação Orientada a Objetos http://www.metropoledigital.ufrn.br/aulas/disciplinas/poo/