Planeamento
Aulas
Teórica 1 - Não se realizou
1
A aula não se realizou por causa dos atrasos da cerimónia de abertura do ano lectivo que decorreu no anfiteatro onde iria decorrer a aula.
Teórica 2 - Apresentação da UC e introdução ao Java como linguagem para programação centrada em objectos
2
Apresentação da Unidade Curricular:
- Objectivos;
- Plano;
- Horário e horário de dúvidas;
- Conteúdo programático;
- Bibliografia
- Avaliação;
Introdução ao Java:
-- Porquê uma linguagem centrada em objectos: périplo pelas noções de abstração de dados, herança, encapsulamento e polimorfismo.
-- Considerações gerais de como escrever, compilar e executar um programa em Java;
-- Tipos de erros.
-- Comparação com Python;
-- Apresentação do Eclipse como IDE para Java;
-- Noção de tipo de dado;
A matéria coberta nesta aula pode ser complementada com:
Ref 1 da bibliografia, capítulos 1 e 2
Ref 2 da bibliografia, secções 1.1 e 1.2
Teórica 3 - Representação e manipulação de dados e abstração procedimental
3
Conclusão da aula anterior:
- Tipos de dados primitivos;
- Tipos da dados não primitivos;
- Exemplos;
Expressões:
- composição de literais/variáveis e operações.
- Definição de tipo e de valor de uma expressão;
- Exemplos;
Variáveis:
- Declaração;
- Inicialização;
- Escrita;
- Leitura;
- Exemplos;
O tipo de dados inteiros e double.
Abstração procedimental:
- Motivação;
- Tipos de métodos: procedimentos e funções;
- static void nomeProcedimento(Tipo1 param1, Tipo2 param2, ...) como assinatura de procedimentos;
- static TipoDeRetorno nomeProcedimento(Tipo1 param1, Tipo2 param2, ...) como assinatura de funções;
- Exemplos;
Documentação de código e legibilidade:
- Elementos necessários: Descrição, @param, @retun caso exista, @requires como restrições caso existam;
- Exemplo;
Material de estudo complementar:
bibliografia 1 - capítulo 3
Teórica 4 - Variáveis, booleanos, condicionais e estruturas de repetição
4
Âmbito das variáveis:
- localidade às métodos;
- passagem como parâmetros;
- exemplos de fluxos;
O tipo de dados Boolean:
- valores e operações;
- prioridades;
- documentação de funções booleanas;
Condicionais:
- blocos if;
- blocos if-else;
- blocos if encaixados;
- vários exemplos e diferenças;
Estruturas de repetição:
- ciclos for:
-- estrutura e considerações gerais;
- ciclos while:
-- estrutura e considerações gerais;
- Diferença entre for e while e discussão sobre quando usar um ou outro;
- Exemplos;
- ciclos do-while:
-- estrutura e considerações gerais;
-- diferença para um ciclo while e discussão sobre quando usar um ou outro;
Leitura complementar:
Secções 3.6 até ao fim do capítulo 5 da referência bibliográfica 1
Secções 1.2 e 1.3 da referência 2.
Teórica 5 - Abstração de dados - Dados não primitivos: As classes String e StringBuilder
5
Recuperação do significado de abstração de dados.
Exemplo genérico de tipos de dados não primitivos.
O tipo de dados String:
- valores;
- operações;
- imutabilidade;
- exploração da API da Oracle sobre Strings;
- exemplo que evidencia as characteristicas da imutabilidade;
- Comparação de Strings. A diferença entre == (igualdade por referência) e o método de instância equals (igualdade por conteúdo dos objectos);
A classe StringBuilder como classe mutável para construção de strings de forma progressiva:
- valores;
- operações;
- mutabilidade e consequências para as suas instâncias;
- Exemplo que explica a diferença entre String e Stringbuilder;
- exploração da API da Oracle sobre StringBuilder;
- exemplo que evidencia as characteristicas da imutabilidade;
Capítulo 6 da referência 1.
Teórica 6 - Vectores simples e vectores multidimensionais
6
O tipo de dados vectores como dados não primitivos:
- definição;
- exemplos;
- declaração;
- tipos diferentes de inicialização;
- leitura;
- escrita;
- cópias: formas de como não fazer e a forma de o fazer;
Vectores multidimensionais:
- o caso particular de matrizes;
- caso geral;
- exemplos;
Capítulo 9 da referência 1.
Teórica 7 - Ciclos Foreach e criação de tipos de dados personalizados
7
Conclusão da aula anterior:
- Ciclos foreach em arrays e outros objectos;
- Exemplos;
Périplo pelos princípios base da programação centrada em objectos como motivação para o estudo e definição de tipos de dados criados pelo programador.
Exemplo construtivo de criação de tipos de dados:
- A classe Point.
- Apresentação de uma possível API da classe.
- Exemplo de uso de um cliente da API;
- Consequências da invocação de um método construtor;
- Discussão dos atributos de instância;
- Discussão da visibilidade dos atributos;
- Os métodos construtores: exemplos e considerações gerais.
Os alunos devem estudar as secções 10.1-103 da referência bibliográfica 1.
Teórica 8 - Criação de tipos de dados personalizados. Os tipos Ponto e Dado
8
Conclusão da aula anterior:
- Recordar uma possível API da classe Ponto;
- Discussão e implementação de uma possível classe Ponto;
- Discussão dos atributos de instância;
- Recordar a importância da visibilidade dos atributos;
- Recordar os métodos construtores: exemplos e considerações gerais.
- Métodos modificadores (setter) e observadores (getters): exemplos;
- A definição do método igualdadePontos.
- Shortcuts Eclipse para criação destes métodos.
- Disucssão do método toString.
A classe dado e sua definição baseada na interação com os alunos na definição dos atributos e métodos.
Os alunos devem estudar o capítulo 10 da referência bibliográfica 1.
Teórica 9 - Conclusão da aula anterior. Os tipos Ponto e Polígono. Enumerados
9
Conclusão da aula anterior:
- Discussão do método copy.
Apresentação de uma classe Polígono que usa como atributo a classe Ponto.
Diagrama UML de classes para visualização de classes e relações entre as classes.
Exemplo UML das classes Ponto e Polígono.
O tipo enum:
- Motivação para uso de enumerados;
- Definição de Enumerado;
- Métodos intrínsecos a um tipo enum;
- Exemplos;
Os alunos devem estudar o capítulo 10, 11 e 12 da referência bibliográfica 1.
Interfaces em Java
10
Definição do que é uma interface.
Exemplos.
Criação de interfaces.
Classes que implementam interfaces.
Exemplo de uso da interface Complexity e as classes Question and QuestionBank que usam a interface Complexity.
Referência às interfaces genéricas. A interface List<E> em que é E é um qualquer tipo não primitivo. Exemplo de aplicação de uma List<Integer> concretizada com uma ArrayList<Integers>. A noção de autoBoxing para transformar dados primitivos em não primitivos e vice-versa.
Exemplo de implementação da classe QuestionBank que usa como atributo uma List<Question>.
Referência a outras interfaces importantes: Cloneable, Iterable, Comparable, etc.
Os alunos deverão estudar o capítulo 13 do ref 1.
Teórica 11 - Interfaces e subtipos. Herança
11
Relembrar a definição do que é uma interface.
Exemplos de instanciação de classes que implementam interfaces.
Diferença entre objetos declarados com o tipo interface e como objetos de uma classe que implementam a interface.
Exemplos. O que pode ou não instanciar-se e que métodos podem ser invocados.
Noção de subtipo e supertipo.
Classes vistas como subtipos de interfaces.
Representação UML.
Herança dos subtipos.
Périplo pela noção de herança em Java.
Diferença da herança em Java e Python.
Exemplos.
Exemplos como motivação para o estudo de subtipos e herança em Java.
Representação em UML.
Os alunos deverão estudar os capítulos 13 e 14 da ref 1.
Teórica 12 - Herança
12
Relação entre subclasse e superclasse.
A palavra reservada extends.
Herança de atributos, variáveis e métodos.
Exemplo de uso.
Herança como relação transitiva.
Reescrita e redefinição de métodos herdados.
Regras para @Override de métodos.
Os alunos deverão estudar os capítulos 13 e 14 da ref 1.
Teórica 13 - Continuação do tópico de herança
13
Revisão da reescrita e redefinição de métodos herdados.
Revisão das regras para @Override de métodos.
Shadowing de variáveis de instância.
Herança e construtores. A utilização do super como referência para inicialização dos atributos herdados.
Necessidade ou não da criação de novos construtores.
Exemplos com implementação.
Os alunos deverão estudar os capítulos 14 da ref 1.
Teórica 14 - Classes Abstratas
14
Considerações sobre a classe Object. Descrição, métodos equals, clone e toString e a sua herança para todas as subclasses.
Apresentação de um exemplo motivacional para considerar em programação orientada a objetos classe de tipo abstrato.
Definição.
Diferença para Interfaces.
Exemplos.
Os alunos deverão estudar os capítulos 16 da ref 1.
Teórica 15 - Considerações sobre o projecto
15
Leitura e interpretação do projecto de programação da cadeira.
Considerações gerais para uma boa implementação de uma solução.
Teórica 16 - A interface Iterable e a Interface Iterator
16
Exemplos motivacionais para a definição de um iterador.
A assinatura de uma classe que oferece o serviço de Iterable.
Considerações sobre o tipo genérico da classe Iterable.
O método iterator() como criador de um objecto que concretiza a interface Iterator.
O objecto concreto que concretiza Iterator como objecto que aponta para a estrutura do tipo de dados sobre a qual se está a criar o iterador. Objetivo e recomendações.
Definição de uma classe concreta que implementa os serviços da interface Iterator.
Definição dos métodos hasNext() e next() dentro da classe e suas responsabilidades.
Exemplos de implementação.
Equivalência entre um for-each e um while com a guarda iterador.hasNext() e corpo next()-
Os alunos devem consultar o material da aula e o guião da UC de LabP sobre este assunto.
Teórica 17 - Implementação do método equals
17
Conclusão da aula anterior com o sumário da implementação de um iterador.
O método equals como método da classe Object.
O equals como relação de equivalência.
Condições para o desenho de um "bom" equals.
A necessidade de verificação de ==, de null, instanceof e comparação de atributos importantes.
Exemplo do equals na classe Point.
Os alunos devem estudar o item 10 do livro Effective Java.
Teórica 18 - Continuação da Implementação do método equals
18
Relembrar como implementar o método equals como método da classe Object.
Diferença entre instanceof e getclass().
O princípio de Liskov. O problema da reescrita do equals como método de uma subclasse com mais atributos.
Discussão das possíveis soluções.
Os alunos devem estudar o item 10 do livro Effective Java.
Teórica 1 - Não se realizou
19
A aula não se realizou por causa dos atrasos da cerimónia de abertura do ano lectivo que decorreu no anfiteatro onde iria decorrer a aula.
Teórica 19 - Polimorfismo em Java
20
Relembrar o conceito de polimorfismo.
O polimorfismo em java.
Os vários tipos de polimorfismos: herança, sobrecarga e interface.
Exemplos dos vários tipos.
Exemplo completo do livro Java Software Solutions.
Os alunos devem estudar o item 10 do livro Java Software Solutions.
Teórica 20 - Herança e polimorfismos em tipos de dados genéricos
21
Recordar a herança e polimorfismos em tipos de dados simples.
Herança de contratos e sua ligação ao princípio de Liskov.
Exemplos.
Noção de subtipo em dados genéricos.
Exemplos.
Teórica 21 - Continuação da discussão de subtipos em tipos de dados genéricos
22
Recordação de conceitos importantes de subtipos em dados não genéricos.
Apresentação de vários exemplos motivacionias para estudo dos subtipos em tipos genéricos.
Apresentação, definição da noção de wildcard em Programação centrada em objectos.
Exemplo.
Uso de bounded wildcards para quando se necessita de limitar a subtipos e a supertipos alguns dos argumentos dos métodos.
Exemplos.
Os alunos devem estudar o capítulo 15 do livro Ref1.
Teórica 22 - Conclusão da discussão de subtipos em tipos de dados genéricos; Excepções e as coleções em Java
23
Regras de subtipagem em tipos genéricos.
Exemplos.
Apresentação de excepções.
Exemplos.
Tratar vs relançar excepções.
Blocos try-catch, try-catch with resources, finally.
A instrução throw e a assinatura throws.
Exemplos.
Alguns tipos de excepções e sua organização na coleção das exceções.
Pequena digressão sobre a framework das coleções do Java. O porquê das diferentes implementações e sua comparação.
Discussão de projectos
24
Discussão de projectos com cada um dos grupos.
Discussão de projectos
25
Discussão de projectos com cada um dos grupos.