Material, Apostilas e Ferramentas


TPs e Provas

P1

Enunciado + Colinha Consulta + Solução

P2

Enunciado + Colinha Consulta + Solução

LISTAS

Lista 1 Exercicios Reflection

Lista 2 Exercicios Reflection

Outras Provas


Aulas e Atividades

Ementa Tópicos especiais em Sistemas para Internet

  1. Polimorfismo para métodos (GENERICS) / Collections
  2. Reflection
  3. Design Patterns
  4. Orientação a aspectos
  5. Topicos especiais

Referências bibliográficas

  1. Java reflection in action. Ira Foreman e Nate Foreman - 2004.
  2. Design Patterns: Elements of Rensable (?) object-oriented software. Eric Gamma, Rich Helm, Ralph Jhonson e John vissides (?). (Gang of Four ou GOF).
  3. Use a cabeça: Design patterns. Eric Freeman e Elisabeth Freeman.

Polimorfismo de Subtipos

É a maneira de referenciar um objeto de várias formas.

Gato g = new Gato()              |       a.arranhar()   [X]
Animal a  = new Gato()           |       g.arranhar()   [✓]

                        _________________________ 
                       |         ANIMAL          | 
                       |                         | 
                       | + void emitirSom()      | 
                       | + void dormir()         |
                       |_________________________|
                            ^                 ^
                            |                 |
       _________________________           _________________________
      |          GATO           |         |        CACHORRO         |
      |                         |         |                         |
      | + void emitirSom()      |         | + void emitirSom()      |
      | + void arranhar()       |         | + void cavar()          |
      |_________________________|         |_________________________|

Princípio de POO (Programação Orientada a Objetos)

Programe para uma abstração, nunca para uma implementação.

Dica de leitura: ~viviane.silva/Princípio-de-POO

Polimorfismo para Método (GENERICS)

Criar um tipo novo que englobe o outro. O foco é na estrutura do novo tipo e não no tipo englobado.

Ex.: Movimentar a mochila na cadeira, você pode fazer isso independente do que houver na mochila.

O ARRAY LIST É UM EXEMPLO. Ele lista qualquer coisa que for definido.

ArrayList <String>
ArrayList <Ninja>

Projeto ListaT

Bound

Usado para fazer restrição.

Upper boud Ele não passa ‘Joia’, caso haja uma classe acima ele não pega.

Se for usado uma string dará erro. Só serão aceitos os “filhos” (subclasse Joia).

public class Caixa < T extends Joia > {
  ...
}

Lower bound

      |---------------|               |-------------------------|
      |     list      |               |          Number         |
      |---------------|               |-------------------------|
            ^                               ^             ^
            |                               |             |
      |---------------|             |-------------|    |-------------|
      |   ArrayList   |             |   integer   |    |   integer   |
      |---------------|             |-------------|    |-------------|
List< ? super Number > a = New arrayList< objeto >;
          |
          |-------> Só pode chegar até *NUMBER*
                    Não poderá chegar na classe *String* nem *Integer* porque é acima. 

Regra PECS

  • super Só add();
  • extends só faz get();

Início Matéria Prova

Reflection

Conhecido como BlackMagic, Reflection possibilita a exposição de quaisquer membro existente dentro uma classe em RunTime.

É nada mais do que a habilidade de enxergar um *.class’ (no java).* - Garcia

É um pacote que te dá permissão de ver informações do seu .class. como:

  • MetaDado
  • MetaObjeto (meta classe) Representam informações da classe
  • Classes
  • Type
  • Method Métodos.
  • Field Atributos.
  • Annotations Marcador para conversas com o compilador.
  • Modifier abstract, protected, public, private, default.

Vantagens

Criação de aplicativos mais dinâmicos, Redução na quantidade de repetição de código (Boilerplate), Minimização de erros e Facilidade de manutenção.

Desvantagens Domínio mais avançado de lógica de programação, Exigência de um maior nível de atenção ao codificar e Geração de código complexo.

Iniciando Reflection…

myClass (Object o){
  Class< ? > clazz = o.getClass();
}

Exemplo de Boilerplate

Evitamos repetição trecho de código em várias partes do arquivo mudando apenas pequenas coisas, como por exemplo um toString():

public String toString(){
  return "ClasseNome";
}

Resolvemos assim:

public String toString(){
  Class < ? > c = this.getClass(); // Pega infos. da Classe.
  return c.getSimpleName(); // Mostra nome da Classe.
}

Slides: Introdução à Metaprogramação com Java Reflection API

Introdução à Metaprogramação com Java Reflection API from Guilherme de Cleva Farto

Projeto PortaJoias

Projeto: Interceptor (SIMULADO P1)

(Interceptação de métodos) Crie uma annotation @Interceptor que possua como valor String um nome de método (met) e um Class (cl) que representa uma classe. Faça uma classe Foo com os métodos privados void fazAlgo() que mostra na tela o nome do método e void fazNada() que mostra a mensagem nada, apenas para teste. Faça uma classe Bar com um método void hello() publico que mostra uma mensagem de boas-vindas. Este método deve ser marcado com a annotation @Interceptor de modo a ter o nome do método de sua escolha (fazNada, fazAlgo) e um Foo.class. Faça uma classe Delegator que possua o método void voidExecutor(Object, String) que recebe um Object de referencia e um nome de método. Se o método não existir, exiba um erro. Se existir procure pela annotation @Interceptor e execute o método definido nesta annotation. Após a execução do método definido na annotation. o método em questão de dentro de voidExecutor deve ser chamado tambem.

Annotations

O conceito mais básico é: anotações são metadados.

São dados adicionais que você relaciona com classes, métodos, atributos, parâmetros e variáveis.

Os dados podem ser usados em tempo de compilação e de execução, conforme definição da anotação.

É um marcador que pode ser salvo no bytecode - Garcia

Alguns Annotations: @Override, @SupressWarnings e @ManagedBean.

Mostrando métodos de uma class que possuem annotation @MyAnno.

Method[] ms = clazz.getDeclaredMethods();
for(Method v : ms){
  if( v.ifAnnotationPresent(MyAnno.class) ){
    syso( v.getName() + "Possuí annotation @MyAnno" );
  }
  else {
    syso( v.getName() + "Não possuí annotation @MyAnno" );
  }
}

Exemplos

Padrão de Projeto: (DECORATOR)

Utilizado quando precisa-se anexar responsabilidades dinamicamente sem precisar de uma grande hierarquia de subclasses.

O Decorator é mais utilizado quando quisermos adicionar responsabilidades a objetos dinamicamente, e quando a extensão por subclasses é impraticável, pois teríamos muitas alterações e dessa forma diversas subclasses.

Consequências

  • A) Mais flexibilidade do que herança. (Adição ou remoção de responsabilidades em tempo de execução) && (Adição da mesma propriedade mais de uma vez)
  • B) Evita o excesso de funcionalidades nas classes
  • C) Decorator e seu componente não são idênticos
  • D) Comparações tornam-se mais complexas
  • E) Resulta em um design que tem vários pequenos objetos, todos parecidos

Dica Possíveis palavras chaves para você identificar o padrão decorator: “Incorporar”, “Compor”, “Acoplamento”, “Juntar”, “Mesclar”, “Incluir”, “Adicionar”.

UML

Projeto: JanelaDecorator

Exemplo JanelaDecorator baseado no artigo Padrão de Projeto Decorator em Java por devmedia

UML

Exercício: EmpresaPublica

Em uma empresa públca, um cargo possui um nome e um valor de salário. Os cargos de ingresso são auxiliar, especialista, e gerente. Se alguém com um cargo entrar para um cargo político (Secretário, Prefeito ou Vereador) o salário deve ser incorporado. Um cargo pode ter mais de uma incorporação, os sálarios base são calculados como se segue:

  • Auxiliar = Inicial + 1000
  • Especialista = Inicial + 2500
  • Gerente = Inicial + 3000

e as incorporações:

  • Prefeito = Base + 4000
  • Secretário = Base + 2000
  • Vereador = Base + 5000

Para o cargo: Se alguém entra como especialista e incorpora vereador e prefeito o cargo fica: especialista incorporado como prefeito incorporado como vereador.

UML

Exercício: PacotesViagem (SIMULADO P1)

Em uma agência de viagem, são vendidos destinos para Cruzeiro, Praia ou Campo. Toda viagem possui uma descrição e um preç base. A estes pacotes podem ser inclusos pacotes de Bebidas, Passeios extras, e serviços de Massagem contratados pela agência. Todo pacote possui uma descrição e um preço. Cada preço varia de acordo com o pacote. Faça um sistema que mostre a descrição da viagem contratada (destino + pacotes) e o preço total do contrato. Este sistema deve aderir ao princípio do aberto/fechado.

UML

Padrão de Projeto (STRATEGY)

Define uma família de algoritmos, encapsula e os torna intercambiaveis (variáveis).

O Strategy é utilizado quando você tem um determinado algoritmo, rotina ou algo deste tipo, e que pode mudar em determinadas ocasiões. Suponhamos que você por exemplo tem uma classe de cálculo de juros e que em uma determinada data do ano, a taxa de juros diminui por conta de uma promoção. Então em cenários como este você, utilizaria o Strategy para auxiliar na solução desta demanda sem causar grande impacto para efetuar a mudança.

Principio: Encapsule o que varia.

Consequências

  • A) Não fere a regra de aberto e fechado.
  • B) Facilidade ao debugar.
  • C) Não cresce esponencialmente

UML

Exercício LojaVirtual:

Uma loja virtual prossue alguns produtos a venda. Os produtos são livros, DVDs e brinquedos. Cada produto possui nome e preço. A mesma loja oferece promoções diferentes a cada mês. Uma promoção reguçar desconta cada produto em 10% mais um desconto extra varia de 5% a 10% dependendo do mês. Uma liquidação desnconta 30% ao preço de cada produto. Há meses quenão há promoção descrita. Esta situação:

UML

Agregação X Composição

Na Agregação, a existência do Objeto-Parte faz sentido, mesmo não existindo o Objeto-Todo. Vejamos o exemplo Time-Atleta:

Imagem1

Um time é formado por atletas, ou seja, os atletas são parte integrante de um time, mas os atletas existem independentemente de um time existir. Nesse caso, chamamos esse relacionamento de AGREGAÇÃO.

Já a Composição é uma agregação mais forte; nela, a existência do Objeto-Parte NÃO faz sentido se o Objeto-Todo não existir. Vejamos o exemplo Pedido-ItemPedido:

Imagem2

Fonte: imasters

Principio do aberto e fechado

Todo código deve ser aberto para herança, e fechado para modificação. - Garcia

O princípio Aberto/Fechado poderia ser entendido como uma implementação que permite adicionar novas funcionalidades sem mexer no código existente. Em outras palavras:

Não precisamos alterar o conteúdo das classes, basta criar novas implementações de interfaces ou sobrescrever os métodos de classes existentes.

Fonte: Stackoverflow

Padrão de Projeto (CHAIN of Responsibility)

Evita Acoplamento (com if) entre o “Sender” de uma requisição Z, o recebedor dando a chance de mais de um objeto efetuar o tratamento. A cadeia de objetos trata a requisição conforme alguma requisição, caso não consiga o próximo elemento fica com a responsabilidade do tratamento.

Decorator, Chain e Strategy tem polimofismo

Estrutura

Existem três partes do padrão Chain of Responsibility: sender, receiver e request. O sender faz o request. O receiver é uma cadeia de um ou mais objetos que escolhe se quer lidar com o request ou transmiti-lo. O request em si pode ser um objeto que encapsula todos os dados apropriados. (Fonte: iMasters)

Consequências

  • A) Fornece um acoplamento mais fraco por evitar a associação explícita do remetente de uma solicitação ao seu receptor e dar a mais de um objeto a oportunidade de tratar a solicitação

Dica: Possíveis palavras chaves para você identificar o padrão CHAIN: “Passar ou Transferir Responsabilidade para o proximo”, “Deixar o outro ou algo tentar, manusear, arcar, manobrar, controlar”.

UML

Projeto: AprovacaoDeVerbas

Uma empresa trata aprovação de verbas. Uma verba pode ser Urgente ou normal. Toda verba possui um valor de investimento. O gerente aprova verbas normais ate 80000 unidades de valor e nao aprova verbas importantes. O superintendente aprova o valor. o VP aprova verbas verbas importantes de ate 200000 unidades. O CEO aprova qualquer verba. Eh importante mostrar na tela: Verba de xxxx R$ aprovada por yyyy, cargo zzzzz. Sendo xxxx o valor a ser aprovado, yyyyy o nome do funcionario e zzzz seu cargo.

UML

Projeto: BancoAprova

Uma aplicação de e-commerce precisa se comunicar com vários bancos diferentes para prover aos seus usuários mais possibilidades de pagamentos, atingindo assim um número maior de usuários e facilitando suas vidas. A classe Banco possui 3 subclasses BancoA, BancoB e BancoC. Os Bancos devem possuir um código de banco correspondente ao banco que vai efetuar o pagamento. Se um banco não puder efetuar um pagamento (Códigos não batem) o outro banco deve ser acionado para tentar finalizar esta operação (de pagamento) ordenadamente. Baseando-se nesta situação descrita.

UML

Padrão de Projeto (ADAPTER)

Converte a interface de uma classe em uma ao qual é esperada pelo cliente. O Adapter permite que classe com interfaces incompatíveis trabalhem juntas. Este padrão é utilizado para ‘adaptar’ a interface de uma classe. O Adapter permite que classes com interfaces incompatíveis possam interagir. Adapter permite que um objeto cliente utilize serviços de outros objetos com interfaces diferentes por meio de uma interface única. Ou seja, dado um conjunto de classes com mesma responsabilidade, mas interfaces diferentes, utilizamos o Adapter para unificar o acesso a qualquer uma delas.

Imita o DuckType

UML

Projeto: PatoAdaptadoPeru

Sabe se que todo Pato voa e grasna. Todo Pato pode ser Negro ou Verde. Um Peru, que não é Pato emite som e não consegue voar. Faça com que Peru e Pato trabalhem sob uma interface comum

UML

Projeto: PlayerVideo (SIMULADO P1)

Um player de video pode rodar o video e tambem gravar um video da webcam. Este player aceita os formatos AVI, MP4 ou RM. Sabe-se que o WAV e MID que não são formatos de video podem rodar som e gravar som. Escolha um padrão e (1) Justifique (2) Faça o UML (3) Codifique.

UML

Padrão de Projeto (Abstract Factory)

Vejamos a intenção do Padrão Abstract Factory:

“Fornecer uma interface para criação de famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.”

Então, de acordo com a descrição da intenção do padrão, nós poderemos criar famílias de objetos, no nosso exemplo seriam a família de carros Sedan e a família de carros de Luxo.

UML

Projeto: LojaFabricaCarro

As fabricas “Citroen” e “Honda” podem fabricar Carros “Sedan” ou “Luxo”. PS. O Carro pode receber um cor especial (objeto Cor)

UML

Padrão de Projeto (Singleton)

A intenção do padrão é esta:

“Garantir que uma classe tenha somente uma instância e fornece um ponto global de acesso para a mesma.”

A maior vantagem do Singleton é unificar o acesso das instâncias

UML

Projeto: Singleton

Projeto: Singleton (Quebrando o Patterns com multi-threads. “By Patrick”)

ENUMs

São classes que carregam constants de enumeração (Tipos) estes são públicos, estáticos e finais.

Algumas características:

  • ENUMS podem ter métodos;
  • Os tipos das ENUMS carregam métodos;
  • Os tipos são convertidos para números (.ordinall);
  • ENUMS pode ter construtorees;
  • ENUMS são Singletons!
  • ENUMS podem ter interfaces
[ CLIENTE ] 
  - cd_id
  - nm_nome
  - vl_anuidade
  - tp_cartao
       |n
       |
      / \
      \ /
       |
       |1
[ TipoCartao (ENUM) ]
  - nm_tipocartoa
  - ordem_anuidade

Projeto: ENUMS Naips

Inglês e Podem: PAUS(“CLUBS”,300), OUROS(“DIAMONDS”,100), ESPADAS(“SPADES”,250), COPAS(“HEARTS”,150);

Projeto: ENUMS Animal (Sobrescrita)

Projeto: ENUMS TiposCarro

Faça a ENUM tipoCarro que possua os tipos “luxo”, “sedan”, “hatch”. Crie uma constante inteira “importancia” que numere luxo com 10, sedan com 5 e hatch com 7 faca o teste

Projeto: ENUMS TiposCarro

Crie a ENUM TipoCartao que possua as constantes GOLD, SILVER, PLATIUM e BLACK cada constante pode determinar um desconto na anuidade que é de 10% GOLD, 20 SILVER, 30 PLAT, 50 BLACK

Projeto: TipoCliente com ENUMS (com Persistencia)

No MySql create database ciro_garciatipocliente;

Padrão de Projeto (Visitor)

Vejamos a intenção do Padrão Visitor:

“Representar uma operação a ser executada nos elementos de uma estrutura de objetos. Visitor permite definir uma nova operação sem mudar as classes dos elementos sobre os quais opera.”

Pela intenção já é possível ver como o padrão vai nos ajudar. A sua ideia é separar as operações que serão executadas em determinada estrutura de sua representação. Assim, incluir ou remover operações não terá nenhum efeito sobre a interface da estrutura, permitindo que o resto do sistema funcione sem depender de operações específicas.

UML

Projeto: Visitor Zoologico

UML

Padrão de Projeto (Proxy)

Vejamos a intenção do Padrão Proxy:

“Fornecer um substituto ou marcador da localização de outro objeto para controlar o acesso a esse objeto.”

Protection Proxy: esse é o tipo de proxy que utilizamos no exemplo. Eles controlam o acesso aos objetos, por exemplo, verificando se quem chama possui a devida permissão.

UML

Projeto: AutenticaUsuario Proxy

UML

Padrão de Projeto (Observer)

Vejamos a intenção do Padrão Observer:

“Definir uma dependência um para muitos entre objetos, de maneira que quando um objeto muda de estado todos os seus dependentes são notificados e atualizados automaticamente.”

Projeto: RevistaFãs Observer