Local:
Google Meet (aulas em tempo real), ou
Google Drive (gravações das mesmas aulas)
Critérios de avaliação:
- trabalhos a cada aula de laboratório;
- auto-avaliação ao final do curso.
Repositório do código criado em sala de aula:
https://github.com/vigusmao/Comp2_2020_PLE
Material de apoio:
Apostila da Caelum
Conteúdo das aulas
24/08
Introdução ao curso.
Semelhanças com a sintaxe de C. Declaração de variáveis e funções (métodos public static), loops, condicionais.
Primeiro programa: o nefasto Hello World.
Saída para o terminal via System.out.println().
Entrada (leitura do teclado) chamando o nextLine() de um Scanner(System.in).
Conversa inicial sobre Orientação a Objeto.
Classe vs struct. O racional do encapsulamento. Modificadores private e public. Accessor methods (getters e setters).
Conversa rápida sobre Unit Tests e Test-Driven Development.
Código feito em aula no GitHub.
26/08
Instanciando objetos. Construtores. Atributos final.
Valores default para tipos primitivos. O null para objetos não-inicializados.
Atributos calculados, com acesso somente de leitura.
Código feito em aula no GitHub.
Aula gravada no Drive.
28/08
Arrays. A classe Object (ancestral comum de todas as classes). O método toString().
Unit tests e TDD com o JUnit. Usando asserts. A boa prática de se ver primeiro os testes falhando.
Código feito em aula no GitHub.
Aula gravada no Drive.
31/08
Objetos com referências para objetos. Passando o
this como parâmetro.
O "DRY principle" (Don't Repeat Yourself).
Debugging com Step Into (F7) e Step Over (F8).
Vendo o histórico de commits no GitHub e o diff relacionado a um commit.
Código feito em aula no GitHub.
Aula gravada no Drive.
02/09
Classes de teste com atributos, método setUp (anotado @Before) e extração de métodos privados com trechos de código comuns.
Modelagem de um mini-sistema bancário, com suas principais classes e relacionamentos.
Agregação versus composição.
Código feito em aula no GitHub.
Aula gravada no Drive.
04/09
LAB 1. (Não precisa entregar trabalho.)
Código feito em aula no GitHub.
Aula gravada no Drive.
09/09
Redimensionamento de arrays em progressão geométrica. Por que é tipicamente desconfortável trabalhar com arrays diretamente?
Criação de uma classe Lista, entendendo as dores de implementação e as soluções fornecidas pela classe java.util.ArrayList.
O conceito de overload (sobrecarga).
O problema do type cast (runtime exception).
Código feito em aula no GitHub.
Aula gravada no Drive.
11/09
LAB 2. (Trabalho a ser entregue até domingo, 13/09, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
Comparação (semântica) de objetos: equals() vs ==.
Código feito em aula no GitHub.
Aula gravada no Drive.
14/09
Resolução dos exercícios do LAB 2.
Métodos e atributos static.
Código feito em aula no GitHub.
Aula gravada no Drive.
16/09
Tipos genéricos.
Usando (com vantagem!) java.util.ArrayList ao invés de arrays de objetos.
Código feito em aula no GitHub.
Atenção especial à classe Lista,
onde usamos tipos genéricos pela primeira vez no curso.
Aula gravada no Drive.
18/09
LAB 3.
(Trabalho a ser entregue até domingo, 13/09, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
A classe java.util.Random e a geração de valores pseudoaleatórios.
Iterando com for...each.
Código feito em aula no GitHub.
Aula gravada no Drive.
21/09
Correção do LAB 3.
Arrays:
- podem ser usados com tipos primitivos ou objetos;
- não precisam ser inicializados para que todas as suas posições (entre 0 e seu length - 1) estejam acessíveis para leitura e escrita;
- comportam no máximo a quantidade de elementos para a qual foram dimensionados; se precisar de mais espaço será preciso criar outro array e copiar tudo;
- não te permitem saber quantos elementos já foram de fato escritos no array; é preciso controlar com variável externa, ou usar algum tipo de esquema do tipo
"o primeiro null encontrado indica que não há mais nenhuma posição ocupada a partir dali";
- para efetuar uma remoção física de elemento, sem deixar um "buraco" (preenchido com null ou outra coisa qualquer) na posição que continha o elemento removido, é
necessário mover explicitamente todos os elementos à direita daquela posição um passo para a esquerda.
ArrayLists:
- armazenam apenas objetos, não tipos primitivos;
- aceitam add() de quantos elementos se desejar, sem que precisem ser pré-alocados (o redimensionamento ocorre transparentemente ao usuário do ArrayList);
- possuem um método size(), que retorna a quantidade exata de elementos adicionados ao ArrayList, sem necessidade de se controlar isso por variável externa;
- fazem remoção física de forma totalmente transparente para o usuário, isto é, o usuário jamais precisará se preocupar com o "shift left";
- não permitem acesso a uma posição com índice maior ou igual ao size() lógico do ArrayList; se isso for necessário, pode-se inicializar o ArrayList com a quantidade desejada de nulls;
- fornecem uma grande quantidade de métodos convenientes para cópia, concatenação, localização de objeto no ArrayList, etc.
Uma boa referência é esse artigo no geeksforgeeks.
Sobrecarga (overload) como solução para a passagem de parâmetros com valor default.
Código feito em aula no GitHub aqui e aqui.
Aula gravada no Drive.
25/09
LAB 4.
(Trabalho a ser entregue até domingo, 27/09, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
Aula gravada no Drive.
28/09
Herança. Construtor default. Polimorfismo (a questão dos diferentes "pontos de vista").
Código feito em aula no GitHub aqui e
aqui.
Aula gravada no Drive.
30/09
Classes e métodos abstract.
Packages.
Código feito em aula no GitHub aqui e
aqui.
Aula gravada no Drive.
02/10
LAB 5.
(Trabalho a ser entregue até domingo, 04/10, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
Tipos enumeráveis (enum). Alguns métodos úteis na classe String: split(regexp), startsWith(String), etc.
Concatenando Strings via StringBuffer (ou StringBuilder).
Referência para regular expressions (regexp) neste link.
Aula gravada no Drive.
05/10
Set. HashSet. Map. HashMap.
Noções rudimentares de complexidade. Testes de performance.
Código feito em aula no GitHub.
Aula gravada no Drive.
07/10
O DRY principle revisitado, aproveitando o polimorfismo para declarar variáveis, atributos e parâmetros com o tipo
mais geral possível que faça sentido. Refactoring no código da aula passada e em projetos anteriores usando Collection e HashMap.
Usando o Collections.unmodifiableList() para retornar sua lista em modo read-only.
Código feito em aula no GitHub aqui e
aqui.
Aula gravada no Drive.
09/10
LAB 6.
Além do exercício descrito no link acima, modifique também seu projeto TuiterLite,
do laboratório anterior, de forma a fazer os testes de performance
passarem em tempo hábil com números grandes de iterações. Você pode usar como referência o
código que fizemos hoje em sala de aula.
(Trabalho a ser entregue até terça, 13/10, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
O contrato do equals() com o hashCode().
Aula gravada no Drive.
14/10
Tratamento de exceções. O try...catch. Runtime exceptions vs checked exceptions. Testando exceções.
Código feito em aula no GitHub aqui e
aqui.
Aula gravada no Drive.
16/10
LAB 7.
(Trabalho a ser entregue até terça, 20/10, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
Aula gravada no Drive.
19/10
O conceito de interface em POO. Implementando interfaces via implements.
Restringindo tipos genéricos via extends.
Código feito em aula no GitHub aqui.
Aula gravada no Drive.
21/10
Revisão de quase tudo. :-)
Revisitamos o projeto da LojaVirtual, passado no LAB 4,
e o melhoramos com o uso de interface.
Código feito em aula no GitHub aqui.
Aula gravada no Drive.
23/10
LAB 8.
(Trabalho a ser entregue até domingo, 25/10, às 23:59, via e-mail, com código em anexo ou link para repositório pessoal.)
A classe java.io.File. Lendo de arquivo com o Scanner que recebe um File no construtor.
Aula gravada no Drive.
26/10
Resolução do LAB 8.
Tipos enumeráveis com informações satélites. Inicializadores estáticos.
Código feito em aula no GitHub aqui e
aqui.
Aula gravada no Drive.
28/10
Aula de dúvidas.
Código feito em aula no GitHub aqui.
Aula gravada no Drive.
30/10
Unit tests com mock. Ideia geral. O Mockito, para Java.
Conversa final sobre o curso. Explicação da avaliação e da auto-avaliação.
A auto-avaliação deve ser entregue até terça-feira, dia 03 de novembro, às 23:59.
A descrição completa está aqui.
Código feito em aula no GitHub aqui.