Programação Orientada a Objetos (2011.2)

UFPB - Campus IV - Curso de Licenciatura em Ciência da Computação

Carga Horária: 60h

Período: 2011.221

Horário:

Terça: 10h-12h (BC ou Laboratório)

Terça: 13h-15h (BC ou Laboratório)

Horários de Atendimento: Quinta 8-10h/13-15h e Sexta 10-12h (Sempre combinar antes com a professora)

Horários de Atendimento Presencial dos Monitores: (Sempre tentar entrar em contato com os monitores antes)

Fagner (fagner.silva@dce.ufpb.br)

Segunda: 15-17

Terça: 15-17

Quarta: 8-12

Quinta: 8-12

Rennan Felizardo (rennan.felizardo@dce.ufpb.br)

Segunda 10-12, 18:30-21h

Terça 13-15h

Quinta 15h-16:30h

Grupo de Discussões: https://groups.google.com/a/dce.ufpb.br/group/poo_comp?hl=pt

Plano de Curso: Baixe aqui.

Notas dos Alunos: Clique aqui.

Ementa: Práticas avançadas e aplicação de programação Orientada a Objetos na construção de um software. Uso de ambiente integrado de desenvolvimento. Técnicas de depuração. Exploração de bibliotecas de uma linguagem OO.

Objetivos Programáticos: Discutir e exercitar boas práticas no desenvolvimento de software Orientado a Objetos como modularização de código, uso de testes automáticos e técnicas de depuração e refatoramento de código. Introduzir programação concorrente na Linguagem Java. Fazer com que os alunos vivenciem na prática a investigação e uso de novas tecnologias e bibliotecas para a linguagem OO a ser utilizada (Java).

Objetivos Específicos: Capacitar os alunos a desenvolverem software orientado a objetos utilizando boas práticas de programação. Ao final do curso espera-se que o aluno:

  • Reconheça problemas no design de programas orientados a objetos;

  • Saiba desenvolver um software orientado a objetos, testá-lo, depurá-lo e melhorar a estrutura de seu código;

  • Saiba aprender uma tecnologia ou biblioteca OO com que nunca lidou anteriormente;

  • Saiba desenvolver sistemas concorrentes simples.

Conteúdo Programático:

Unidade I: Revisão de Orientação a Objetos; Uso do Framework de Coleções de Java e Generics; Composição x Herança; Enums e Annotations; Documentação de Código; Teste Automático de Software utilizando JUnit e ambientes integrados de desenvolvimento (IDEs).

Unidade II: Regras básicas de design e refatoramento; Padrões GRASP e Padrão Facade; Separação de interesses; Uso de tecnologias e bibliotecas para a linguagem Java (ex: Android, Swing, Java FX, JSF, Servlets, J2ME).

Unidade III: Programação Concorrente em Java.

Avaliação

Três avaliações escritas principais e um projeto prático ao fim da disciplina cuja defesa será também avaliada. Exercícios individuais ou em grupo, incluindo minitestes e seminários, além da participação do aluno na aula, serão também utilizados em cada unidade e estes poderão valer até 40% da pontuação máxima de cada estágio.

Bibliografia Básica:

  • BLAHA, M. Modelagem e projetos baseados em objetos com UML 2. 2.ed., Elsevier, 2006. 9 exemplares

  • BLOCH, J. Java Efetivo. 2.ed. Alta Books, 2010. 5 exemplares (português) e 3 exemplares (inglês/ 2008)

  • DEITEL, H. M. JAVA como programar. H. M Deitel e P. J. Deitel - 6a ed. Porto Alegre: Prentice-Hall, 2005. 5 exemplares

  • FOWLER, Martin. Refatoração - Aperfeiçoando o Projeto de Código Existente. Bookman, 2004. 0 exemplares

  • FURGERI, Sérgio. Java 6 – Ensino Didático: Desenvolvendo e Implementando Aplicações. 2a ed. São Paulo : Érica, 2010. 5 exemplares

  • HORSTMANN, C. S e Cornell, G. Core Java 2: Volume I – Fundamentos. 7a Edição. Editora Alta Books, 2005. 5 exemplares

  • HORSTMANN, C. Core Java 2 - Volume 2 – Recursos Avançados. Makron Books, 2002. 1 exemplar

  • LARMAN, C. Utilizando UML e Padrões - 3a. ed. Bookman, 2007.

  • ZAKHOUR et al. The Java Tutorial: A Short Course on the Basics. 4th Edition (Java Series). Prentice Hall, 2006. Versão online: http://java.sun.com/docs /books/tutorial/ 10 exemplares

Bibliografia Complementar:

  • ARAUJO, Kleitor Franklint Correa de. Java EE 5. 2a. ed. Erica, 2007. 5 exemplares

  • BARNES, David J.; KÖLLING, Michael. Programação Orientada a Objetos em JAVA: uma introdução prática usando o BLUEJ. Pearson, 2004. 9 exemplares

  • ECKEL, B. Thinking in java. 4th ed. 2008. 3 exemplares

  • FREEMAN, E. Use a cabeça: padrões e projetos. 2.ed. Rio de Janeiro: Alta Books, 2007. 5 exemplares

  • GOODRICH, Michael T., TAMASSIA, Roberto. Estruturas de dados e algoritmos em Java. 2.ed Bookman, 2006. 4 exemplares

  • MESZAROS, Gerard. XUnit Test Patterns. Addison-Wesley, 2007. 7 exemplares

  • ORAM, Andy. Beautiful Code. O’Reilly, 2007. 5 exemplares

  • SANTOS, Rafael. Introdução à Programação Orientada a Objetos Usando JAVA. Rio de Janeiro : Campus, 2003. 9 exemplares

  • SIERRA, K.; BATES, B. Java – Use a Cabeça. Editora Alta Books, 2.edição, 2007. 8 exemplares

  • SIERRA, Kathy. Certificação Sun Para Programador Java 6 Guia de Estudo. AltaBooks, 2008. 5 exemplares (versão 2005)

Exercícios:

  • Exercício 1: Exercício de Sondagem inicial e que pode ser baixado aqui. Fazer até questão 3.

  • Exercício 2: Exercício 4 da lista acima (mas não precisa gravar de verdade em arquivo). Além disso, pede-se o seguinte:

    • Fazer um programa com um menu e que acesse as operações de um objeto do tipo "InterfaceSistemaDeControle"

  • Exercício 3: Fazer o menu acima funcionar no sistema.

  • Exercício 4: Fazer na classe ControleDePedidos o método getPedidosOrdenadosPorCliente(). Explorar nesse exercício a interface Comparable na classe Pedido.

  • Exercício 5: Implementar o gravador de pedidos para que consiga gravar e recuperar a lista de pedidos. Lembrar que os métodos de gravação e leitura devem lançar apenas IOException.

  • Exercício 6: a) Implementar o main do sistema de controle de disciplinas pedido na prova 1, que pode ser baixada aqui e cujo código base para o exercício pode ser visto aqui. b) Criar um teste de unidade JUnit com base nesse main e no exemplo que está no código. c) Quando o teste estiver feito e não estiver passando, corrigir o bug no código enviado. d) Completar a versão do sistema que usa Map.

  • Exercício 7: Implementar um teste semelhante ao anterior, mas no qual se tenta alocar o professor à turma sem que o professor tenha sido cadastrado. O teste deve verificar se sistema lança a exceção que deveria lançar.

  • Exercício 8: Implementar a classe Horario e o enum DiaDaSemana. A classe Horario tem os atributos dia(do tipo DiaDaSemana), horaInicio (int), e horaFim (int). Adicione na classe Turma um atributo horarios (do tipo List<Horario>). Implemente um teste para a classe Turma e que verifique o cadastro de horários.

  • Observação: Entrega dos últimos exercícios através desse formulário online.

  • Exercício 9: Entrega da descrição dos projetos, da lista de funcionalidades topicalizada e do diagrama UML inicial detalhando a fachada do projeto (que deve corresponder à lista de funcionalidades). Entrega da 1a. versão no dia 10/04 e da 2a. versão do dia 17/04, impressa.

  • Exercício 10: Entrega da versão atualizada do diagrama com análise do uso de padrões e técnicas de bom design OO vistas em sala. Cada um deve levar para a aula a versão inicial do código dos seus projetos.

  • Exercício 11: Criar um teste JUnit para algum método da fachada do seu sistema (uma de suas funcionalidades) e enviar por e-mail para ayla@dce.ufpb.br a classe de Teste e a Fachada.

  • Avaliação 3o. Estágio (entrega dos itens abaixo e sua apresentação/defesa (com nota individual)):

    • Projeto: Desenvolver software OO que não seja muito simples e explorar nesse projeto boas técnicas de design OO, padrões GRASP e Façade (Fachada), testes e o uso de bibliotecas. A fachada do sistema deve expor suas funcionalidades principais e deve apresentar testes para estas funcionalidades.

    • Exercícios sobre Threads:

      • Exercício 1 sobre Threads enviado para a lista e disponível aqui. Façam inicialmente sem executar o código e depois executem pra tentar melhor entender o assunto trabalhado em sala.

      • Exercício 2: Procurar na Internet ou em livros 4 questões sobre Threads em Java, respondê-las e comentá-las. As questões podem ser inclusive questões de concurso ou de certificação Java.

      • Exercício 3: Fazer um robozinho usando o robocode e entregar o seu código impresso ou manuscrito e um texto explicando a estratégia utilizada pelo seu robô. Dêem uma olhada na API do robocode (http://robocode.sourceforge.net/docs/robocode/) pra explorarem estratégias legais.

Aulas:

07/02: Apresentação do plano da disciplina e revisão inicial de OO.

07/02: Exercício de sondagem de OO.

14/02: Início da revisão de OO (classes, interfaces, métodos, objetos e instâncias)

14/02: Exercício 2 (descrito acima)

28/02: Continuação da revisão de OO (documentação com Javadoc, construtores, sobrecarga, herança, framework de coleções de Java).

28/02: Exercício 3 descrito acima e o 4 para quem já havia concluído os demais.

06/03: (Plano) Continuação da revisão de OO (Framework de coleções de Java, incluindo Map, exceções, uso da interface Comparable, uso da API). Exemplo de uso de Coleções.

06/03: Exercício.

13/03: Teste automático utilizando JUnit.

13/03: Exercícios sobre testes.

20/03: Primeira Avaliação

20/03: Exercício sobre testes com base na prova realizada de manhã.

27/03: Enum e Annotations e uso de IDEs.

27/03: Exercício sobre Enum, Annotations e Map.

03/04: Reposição.

03/04: Última entrega de Exercícios atrasados através do formulário online disponível aqui.

10/04/12: Introdução às técnicas de análise e design OO.

10/04/12: Exercício de design OO

17/04/12: Padrões GRASP

17/04/12: Padrões GRASP

24/04/12: Padrões GRASP: Controller. Regras básicas de refatoramento e design.

24/04/12: Introdução a Swing. Exemplo da Agenda.

01/05/12: Feriado: Adiantar projeto

01/05/12: Feriado: Adiantar projeto

08/05/12: Segundo Estágio e Entrega da versão do projeto com interface texto, no início da aula da manhã.

08/05/12: Uso de bibliotecas na linguagem Java.

15/05/12: Acompanhamento de projetos e exercícios.

15/05/12: Acompanhamento de projetos e exercícios.

GREVE

18/09/12: Revisão do que foi visto na disciplina.

18/09/12: Exercício de revisão.

25/09/12:

25/09/12:

02/10/12:

02/10/12: REPOSIÇÃO DO 2o. ESTÁGIO (2o. horário)

09/10/12: APRESENTAÇÃO DOS PROJETOS

09/10/12: APRESENTAÇÃO DOS PROJETOS

16/10/12: PROVA FINAL

SUGESTÕES DE PROJETOS (Projetá-los de forma a facilmente migrá-los para diferentes dispositivos - desktop/celular/tablets/web)

  • Jogo de Tabuleiro com Dados: Jogo em se joga um dado ou se usa um dado eletrônico e que indica o número de casas a andar. Cada casa pode propor um desafio. Caso o jogador acerte, pode avançar e caso erre pode retroceder, vencendo o que chegar primeiro ao final. Desafios podem ser de diferentes áreas do conhecimento (ex: questões do ENEM/ENADE, História, Física, Matemática, etc)

  • Jogo de Imagem e Ação Eletrônico: Semelhante ao jogo anterior e que poderia ser projetado para Tablet utilizando Android. A diferença é que o desafio são palavras sobre as quais se podem fazer mímicas ou desenhar. Além disso, só quem vai fazer a mímica pode ver a palavra desafio. Deve haver um cronômetro marcando o tempo para que a equipe descubra a palavra desafio. O jogo pode oferecer também uma interface para que na própria tela sejam desenhadas as dicas para que a equipe descubra a palavra.

  • Jogo da Memória: Semelhante ao jogo da memória tradicional e pode ter múltiplos jogadores. Deve ser um jogo educativo. A intenção é que ao acertar as cartas iguais deve ser apresentada alguma informação que acrescente novos conhecimentos aos jogadores. Um exemplo de jogo desse tipo é um que explore a nova ortografia brasileira, sendo as cartas palavras que mudaram sua grafia. Quando um jogador acertar um par de palavras, a regra da ortografia é mostrada junto com alguns outros exemplos de palavras que seguem essa regra.

  • Jogo de Atirar em Elementos que vão surgindo na tela representando inimigos e de alcançar elementos representando vidas ou pontos. Deve seguir o modelo desse tipo de jogo, só que de tempos em tempos ou ao atingir pontos como "portas" desafios educacionais devem ser propostos e indicarão se o jogador pode partir para a próxima fase ou não.

  • JGonometria: Jogo para explorar regras da trigonometria quanto aos ângulos complementares. Inspirado na idéia do PyGonometria.

  • JQuimica: Jogo para explorar as nomenclaturas químicas. Inspirado na ideia do PyQuimica.

  • Jogo Educacional para ensinar frações e percentagem. Qualquer jogo que seja divertido e que ensine na prática esse conteúdo tão exigido em receitas e no comércio. Pode-se explorar até esse conceito. Algumas pessoas têm dificuldade quando vêem em uma receita 1/3 de xícara de tal coisa. Outras têm dificuldades pra saber em reais o valor de um desconto de 10% em uma mercadoria, etc.

  • Algum sistema que auxilie alguém que você conhece. Um sistema para ajudar seu pai a organizar a biblioteca que tem em casa, um sistema para a loja da sua prima, um sistema para a oficina do seu amigo, etc. O sistema tem de ter uma certa complexidade mínima para a disciplina. Falar com a professora.

  • TODO list adaptativa: Aplicação adaptativa para gerenciar tarefas (TODO List) e usando Android. Ideia é que aplicação guarde tudo que você tem a fazer e ordene essa lista dependendo do ambiente em que você esteja. Existem TODOs da universidade, de casa, do trabalho, de uma viagem, etc. Cada TODO pode ter uma data limite e tem um local associado. Isso pode ser usado inclusive numa viagem, onde se pode cadastrar diferentes locais para ver e dependendo de onde se chega, a aplicação mostra os TODOs ou talvez até anúncios direcionados à sua localização.

  • Sistema de controle de gastos. Este sistema deve permitir o cadastro de despesas e o seu controle. Cada despesa tem uma modalidade (ex: alimentação, transporte, moradia, presentes, etc). Além disso, uma despesa pode ser pontual (como o pagamento de um almoço em um certo dia), ou pode ser uma prestação programada para vários meses. O programa deve ser capaz de gerar vários relatórios.