Ficha 01 · Programação genérica, patterns e metaprogramação
Exercício 1 · Genérico ou específico
Para cada função abaixo, diz se é específica de um tipo ou genérica, e reescreve a específica de forma genérica usando <T>.
(a) function primeiroNumero(lista: number[]): number { return lista[0]; }
(b) function primeiro<T>(lista: T[]): T { return lista[0]; }
Exercício 2 · Tipos de linguagens de programação genérica
Classifica cada linguagem quanto ao tipo de genericidade que usa e explica em uma frase a diferença prática entre elas: (a) TypeScript; (b) C++; (c) JavaScript.
Exercício 3 · Identificar o design pattern
Lê as três descrições e identifica o padrão de projeto (Factory, Observer ou Strategy) em cada uma:
(a) Um sistema de pontuação de quiz troca o algoritmo de cálculo consoante o modo escolhido (fácil, difícil).
(b) Um componente de UI avisa vários outros sempre que os dados mudam, e cada um reage à sua maneira.
(c) Uma função recebe um tipo de componente ("quiz", "video") e devolve a instância certa, sem o código chamador saber a classe concreta.
Exercício 4 · Herança bem e mal aplicada
Um colega cria class Botao extends Cor porque "o botão tem uma cor". Explica porque esta herança está mal desenhada e propõe uma alternativa.
Exercício 5 · Polimorfismo em ação
Dado o código abaixo, explica o que acontece quando se acrescenta uma nova classe Enquete extends ComponenteInterativo e se ela obriga a alterar a função mostrarTodos.
function mostrarTodos(itens: ComponenteInterativo[]) {
itens.forEach(i => i.render());
}
Exercício 6 · Metaprogramação: o que faz este decorator
Explica, linha a linha, o que o decorator log faz ao método corrigir.
function log(target, key, descriptor) {
const original = descriptor.value;
descriptor.value = function (...args) {
console.log(`A chamar ${key}`, args);
return original.apply(this, args);
};
}
Exercício 7 · Duck typing e o seu risco
Explica porque a função tocar(objeto) abaixo funciona com vídeos e áudios sem verificação de tipo, e qual o risco de a chamar com um objeto sem método play().
function tocar(objeto) {
objeto.play();
}
Exercício 8 · Validar antes de usar
Escreve uma função validarPreco(valor: unknown): number que garante que o valor é um número positivo antes de o devolver, lançando erro caso contrário.